我们目前正在使用旧的iText 2.1.7版本,但正在评估itextpdf 5.5.0。
我们在Libreoffice和Quartz(在Mac上)创建了PDF表单。
填写2.1.7(Stamper / setField等)中的表格时没有任何问题
使用5.5.0但是在Quartz中制作的表格工作正常,但Libreoffice制作的表格却没有。
基本上:使用FormFlattening(false),数据显示在最终文档(以及字段)中,但是使用FormFlattening(true)时,数据(和字段)为空。
我在LibreOffice和Quartz PDF之间看到的主要区别是所有字体都嵌入在Quartz生成的PDF中。 LibreOffice无法做到这一点。
这可能是问题吗?如果是这样,为什么2.1.7工作?
提前谢谢,
Snorri
答案 0 :(得分:5)
基本上:使用FormFlattening(false),数据会显示在最终文档(以及字段)中,但使用FormFlattening(true)时,数据(和字段)将为空。
如果af
是AcroFields
个实例,请尝试
af.setGenerateAppearances(true);
关闭压模之前。
PDF规范ISO 32000-1定义了 NeedAppearances 标志,参见表218 - 交互式表单字典中的条目。如果设置为 true ,则PDF查看器知道必须为表单字段创建外观流。
旧的iText版本完全忽略了该标志,并始终在表单填写期间创建外观流。如果标志不是 true ,那么较新的iText版本会尊重该标记并仅在填写表单时创建外观流(在另一种情况下,查看器将重新创建此类外观)。
在展平表单时,iText只是将表单元素的外观嵌入到页面内容中。因此,如果在填充期间没有为某些字段创建外观流,则该值不会出现在展平文档中。
使用setGenerateAppearances(true)
可以强制生成外观流。