使用Adobe acrobat Pro先手工做一个Pdf Form的模板:
1.新建:,选择新建/Pdf form file(Ctrl+N), 可以选择先有的某些类型的文件作为最处的模板,选择一个文件后(例如.txt的),就新建好了.
2.编辑:选择右边的工具栏,选择Content/Edit Document Text/Edit Object或者是Content/Edit Document Text?Edit Document Text可以编辑新 建时导入的静态文本(.txt).
3.添加表单字段:点击右边工具栏 Content/Edit Or Edit Interactive Object/下面的 Button,然后鼠标移动到文档中就可以添加字段,Button 说对应的是图片等多媒体字段. 新建一个Button 类型的字段后,右击新建的字段会出现(Add New Field)选项,里面有很多种Form字段的类型可以选择(Text Field,checkbo,radioButton,Dropdown,ListBox等)。
4.字段位置调整:选择工具 Content/Edit Or Edit Interactive Object/Select Object 可以对当前的Form 字段进行大致位置调整.如果需要对Form字段进行非常准确的放置,可以选择 工具条 Forms/Edit,这里面有对齐的工具尺。
程序代码部分:
1 static void BuildPdfForm() 2 { 3 if (File.Exists("form.pdf")) 4 File.Delete("form.pdf"); 5 FileStream stream = new FileStream("form.pdf", FileMode.Create); 6 PdfReader reader = new PdfReader("template.pdf"); 7 PdfStamper stamper = new PdfStamper(reader, stream); 8 AcroFields af = stamper.AcroFields; 9 af.SetField("Name", "WangWang"); 10 af.SetField("Date", "2012-11-11"); 11 string imagepath="flower.jpg"; 12 if (!string.IsNullOrEmpty(imagepath) && File.Exists(imagepath)) 13 { 14 iTextSharp.text.Image gif = iTextSharp.text.Image.GetInstance(imagepath); 15 if (gif != null) 16 { 17 PushbuttonField bf = af.GetNewPushbuttonFromField("Header"); 18 bf.Image = gif; 19 af.ReplacePushbuttonField("Header", bf.Field); 20 } 21 } 22 //stamper.FormFlattening=true; 是否将 pdf Form 转为 pdf文档 23 stamper.Close(); 24 25 }
注意:Pdf Form 跟普通直接生成pdf文件的区别在于生成的表单是可以编辑的,保存后,其他人打开页面就是编辑后的内容。就像Name字段,程序写 入的是"WangWang" ,后面三个Add 是我后面添加的。
当然生成的Form pdf 也可以不让他人编辑,只要在field的属性里面选择只读的,这种情况字段的背景颜色是透明的,当前是可编辑的所以有颜色。
即使表单设置为只读,但结果跟普通生成的文档还是有区别:图片,字段等在pdf里面 是可移动的,如果字段里面的内容太长还可以通过拖动内容来查看。如果要将Form 文档只当做Pdf报表的模板来使用,只要设置属性 stamper.FormFlattening=true; 所生成的文档就不是表单了.这种方法对于排版比较麻烦的报表,应该是很用的.
【嵌入新字体】
1. 在目录 C:\Program Files\Adobe\Acrobat 10.0\Resource\Font 添加.otf字体
2. 选择 开始/程序/Adobe Acrobat Distiller X 软件,选择Settings/Edit Adobe PDF Settings 添加字体
3. Form 模板 打开编辑 保存后 相应的字体 就会嵌入到模板里面了。
【通过代码嵌入】
1 BaseFont font = BaseFont.CreateFont(HttpContext.Current.Server.MapPath("~/PDFTemplate/font/ArialMT.otf") , 2 BaseFont.IDENTITY_H , BaseFont.EMBEDDED);
3 af.SetFieldProperty("FieldName" , "textfont" , font , null);
【嵌入字体的另一种方法(嵌入子集)】
1.点击File->Print->Properties->纸张质量->高级—>TrurType字体: 选择‘下载为软字体’,如图
【使用form的形式,有个麻烦的东西是对于多行文本的间距设置,说实在的找了很久没找到,不过我们依然有其他办法来实现】
下面的代码是利用PdfContentByte跟排版(columnText), 将某一段文本定位显示于某个区域内.
1 private void SetBlockAtPoint(PdfStamper stamper , string content , Font font ,float lineHeihgt=10,int pageNum=1 , int llx=42 , int lly=1 , int urx=525 , int ury=31) 2 { 3 PdfContentByte cbc =stamper.GetOverContent(pageNum); 4 ColumnText ct = new ColumnText(cbc); 5 Phrase fieldtext = new Phrase(); 6 7 fieldtext.AddSpecial(new Paragraph(lineHeihgt , content , font)); 8 ct.SetSimpleColumn(fieldtext , llx , lly , urx , ury , lineHeihgt , Element.ALIGN_LEFT | Element.ALIGN_TOP); 9 10 ct.Go(); 11 }