美文网首页
使用itext pdf填充有中文字体的表单

使用itext pdf填充有中文字体的表单

作者: fzhyzamt | 来源:发表于2020-10-30 10:46 被阅读0次

首先创建一个包含表单的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,原因没有细查。

相关文章

网友评论

      本文标题:使用itext pdf填充有中文字体的表单

      本文链接:https://www.haomeiwen.com/subject/glgrvktx.html