首先创建一个包含表单的pdf,这里用的是Adobe Acrobat DC,修改字体时可以全选然后修改。
表单域字体均设置为宋体,大小设置为8。
pdf表单域
引入itext库
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
填充的代码,略去了异常处理和finally关闭资源的部分,实际使用中注意加上。
PdfReader reader = new PdfReader("D:\\template.pdf");
FileOutputStream out = new FileOutputStream("D:/test.pdf");
PdfStamper stamper = new PdfStamper(reader, out);
AcroFields form = stamper.getAcroFields();
String[] str = {
"123456789",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文"};
int i = 0;
for (String k : form.getFields().keySet()) {
form.setField(k, str.length > i ? str[i++] : "FIELD 11 22 33 FF");
}
stamper.setFormFlattening(true);//设置为无法编辑
stamper.close();
第一次填充
填充后发现中文部分并没有展示,搜了一下是因为itext对于中文字体支持不好,手动指定中文字体。ttc和ttf的区别可以搜一下,实际使用中一般使用ttf。一定要注意线上大概率没有这个字体文件,建议拷到项目中。
......
AcroFields form = stamper.getAcroFields();
BaseFont baseFont = BaseFont.createFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(baseFont);
......
第二次填充
这一次倒是都有了,但是字体大小不一样。查看下生成的pdf字体,发现中文部分使用的是新宋体,大小8;英文和数字部分使用的是Arial,大小8。字体大小都是当时设置的,但是字体好像变了。
搜了一下,在这篇博文找到了解决方法。
for (String k : form.getFields().keySet()) {
form.setFieldProperty(k, "textfont", baseFont, null);
form.setField(k, str.length > i ? str[i++] : "FIELD 11 22 33 FF");
}
第三次填充
再看下字体,这次都是新宋体大小8了。
最终代码
PdfReader reader = new PdfReader("D:\\template.pdf");
FileOutputStream out = new FileOutputStream("D:/test.pdf");
PdfStamper stamper = new PdfStamper(reader, out);
AcroFields form = stamper.getAcroFields();
BaseFont baseFont = BaseFont.createFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(baseFont);
String[] str = {
"123456789",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文", "AAA BBB CCC DDD",
"中文中文中文中文"};
int i = 0;
for (String k : form.getFields().keySet()) {
form.setFieldProperty(k, "textfont", baseFont, null);
form.setField(k, str.length > i ? str[i++] : "FIELD 11 22 33 FF");
}
stamper.setFormFlattening(true);//设置为无法编辑
stamper.close();
测试中发现其他参数都不变的情况下,使用ttc字体时生成的文件为6439KB,使用ttf字体时则为165KB,原因没有细查。











网友评论