You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用iText7-Community扁平化AcroFields时表单字段丢失求助

解决iText7扁平化AcroForm字段后内容消失的问题

这种情况大概率是因为你用Master PDF Editor创建的表单字段缺少必要的外观描述信息,iText在执行flattenFields()时需要依赖这些信息把动态字段内容渲染成静态文本,没有的话就会出现字段“消失”的情况——其实值已经正确设置了,但没法被正常渲染出来。

你可以试试下面两种解决思路,按顺序尝试:

方法1:强制重新生成字段外观

在设置字段值之后,手动调用regenerateField()方法让iText重新生成字段的外观,再执行扁平化操作:

PdfReader reader = new PdfReader("path-to-file.pdf"); 
PdfWriter writer = new PdfWriter("path-to-dest-file.pdf"); 
PdfDocument doc = new PdfDocument(reader, writer); 
PdfAcroForm form = PdfAcroForm.getAcroForm(doc, false); 

PdfFormField field = form.getField("treinamento");
field.setValue(param);
// 关键步骤:重新生成字段的显示外观
field.regenerateField();

System.out.println("----> " + field.getValue());
form.flattenFields(); 
doc.close();

方法2:手动设置字段默认外观(DA)

如果方法1无效,说明字段连基础的默认外观(DA字符串)都没有,需要手动指定字体、字号和颜色:

PdfReader reader = new PdfReader("path-to-file.pdf"); 
PdfWriter writer = new PdfWriter("path-to-dest-file.pdf"); 
PdfDocument doc = new PdfDocument(reader, writer); 
PdfAcroForm form = PdfAcroForm.getAcroForm(doc, false); 

PdfFormField field = form.getField("treinamento");
// 加载标准字体(也可以替换成你需要的自定义字体)
PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
// 设置默认外观:字体、字号、颜色(0 g表示黑色)
field.setDefaultAppearance(String.format("/%s 12 Tf 0 g", font.getFontProgram().getFontNames().getFontName()));

field.setValue(param);
field.regenerateField();

System.out.println("----> " + field.getValue());
form.flattenFields(); 
doc.close();

问题根源说明

Master PDF Editor在创建AcroForm字段时,可能没有正确写入DA(Default Appearance)字典项——这是AcroForm字段定义文本显示样式的核心信息。iText扁平化字段时,需要把动态内容转换成静态PDF内容流,这个过程必须依赖DA或者已生成的外观流(AP)。如果两者都缺失,就无法渲染出内容,看起来就像字段“消失”了。

内容的提问来源于stack exchange,提问作者Sidney de Moraes

火山引擎 最新活动