转载自:http://blog.csdn.net/polo_longsan/article/details/39254867
这个虽然是java但是原理基本相同
asp.net代码如下
调用:
using iTextSharp.text;
using iTextSharp.text.pdf;
public void Index()
{
//获取中文字体,第三个参数表示为是否潜入字体,但只要是编码字体就都会嵌入。
BaseFont baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// BaseFont baseFont = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H",
// BaseFont.NOT_EMBEDDED);
//读取模板文件
PdfReader reader = new PdfReader(@"C:\Users\shxy\Desktop\test2.pdf");
//创建文件流用来保存填充模板后的文件
System.IO.MemoryStream stream = new System.IO.MemoryStream();
PdfStamper stamp = new PdfStamper(reader, stream);
//设置表单字体,在高版本有用,高版本加入这句话就不会插入字体,低版本无用
stamp.AcroFields.AddSubstitutionFont(baseFont);
AcroFields form = stamp.AcroFields;
form.SetField("Name", "石义");
form.SetField("test", "Name");
form.SetField("Payment", "1");
form.SetField("test2", "1");
//表单文本框是否锁定
stamp.FormFlattening = false;
Dictionary<string, string> para = new Dictionary<string, string>();
// para.Add("Name", "abc");
//填充表单,para为表单的一个(属性-值)字典
//foreach (KeyValuePair<string, string> parameter in para)
//{
// //要输入中文就要设置域的字体;
// form.SetFieldProperty(parameter.Key, "textfont", baseFont, null);
// //为需要赋值的域设置值;
// form.SetField(parameter.Key, parameter.Value);
//}
//按顺序关闭io流
stamp.Close();
reader.Close();
//生成文件
Response.Clear();
Response.AppendHeader("Content-Disposition", "attachment;filename=pdftest.pdf");
Response.ContentType = "application/octet-stream";
Response.OutputStream.Write(stream.GetBuffer(), 0, stream.GetBuffer().Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.Flush();
Response.End();
//FileResult fileResult = new FileContentResult(stream.ToArray(), "application/pdf");
//fileResult.FileDownloadName = "4.pdf";
//return fileResult;
}
过程中遇到的问题:
贴出的代码是中文版的无需关心了 ,主要取决字体,过程中遇到模板的单选和多选,传入的参数需要根据你pdf模板的实际值来判定,如果只是猜估计很难。
我采用的是Adobe Acrobat 9 Pro网上有破解版。
之后的思路是做一个模板上传,参数配比,能达到自己生成模板数据自动填充打印。