itext 之表单
本例亲自测度验证,来自于网上,经过甄别 改造 又还之于网络。 本例重点展示 生成PDF模板,在模板上通过pdf第三方编辑软件打开编辑,在指定地方加入表单,然后通过java代码打开模板对指定名称的表单加入数据 生成用户所需的pdf文件。 特别注意:itext包括adobe官方的PDF编辑器,很难几乎不可能 完成这种操作: 打开生成好的PDF文件,插入一段文字或表格,让插入点原因的内容的位置移动变化。 或者说 ITEXT很难完成真正意义上的插入功能,他只能在原因基础上 增加一层 对原因的内容进行覆盖。
另外本例,也解决了一个中文网上少有资料解决的一个问题 : 对于模板中的复选框 选中样式后,生成非表单样式的PDF文件时,复选框是叉,而不是表单中设定的选中样式。其核心代码是:
form.setField(item.getKey(),str,true);
注意,第三个参数的值一定是逻辑值true.
说明:
agreementTemplate.pdf中需要加入一个文本表单元素name属生为:sampleField ;同时不得加一个checkbox表单元素,name属性为check1
import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; /** * @Auther: cloud * @Date: 2019/8/18 12:22 * @Description: */ public class FillFormDemo { static final Logger log = LoggerFactory.getLogger(FillFormDemo.class); public static void main(String[] args) throws IOException, DocumentException { String formTemplate = "templatepdf/agreementTemplate.pdf"; ClassPathResource resource=new ClassPathResource(formTemplate); PdfReader reader = new PdfReader(resource.getInputStream()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, bos); /** * 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体 Adobe 宋体 std L */ AcroFields form = stamper.getAcroFields(); String fontFilePath = "font/SimSun.TTF"; ClassPathResource resource1=new ClassPathResource(fontFilePath); BaseFont baseFont = BaseFont.createFont(resource1.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); form.addSubstitutionFont(baseFont);//这句必须加,不加生成的新表单不会显示 form.setField("sampleField", "中国雄起了aaaaa"); form.setField("check1", "是",true); // stamper.partialFormFlattening("sampleField");//保持表单样式 // 设为true stamper.setFormFlattening(true);//为true时,保存后表单样式取消了 stamper.flush(); log.info( form.getField("sampleField")); stamper.close(); FileOutputStream fos = new FileOutputStream("target/agreement.pdf"); fos.write(bos.toByteArray()); bos.close(); fos.close(); reader.close(); } }