我需要将预填充的PDF / XFA表单设为只读(因为在没有输入的情况下,例如文本,复选框,单选按钮等都可以更改其值)。

对于常规的AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用 setFormFlattening(true) 来实现。对于动态XFA表单,我必须将XDP的access节点的field属性设置为readOnly

问题是,如何检测表单是否为动态 XFA? isXfaPresent 不能区分静态或动态XFA表单,因此没有用。

最佳答案

iText和言论自由一样免费,而不像啤酒免费一样免费。阅读http://lowagie.com/bumodels以获取有关我们为避免从MPL / LGPL切换到AGPL所尝试的业务模型的更多信息。

Q1:将动态XFA表单设为只读

这对于iText的最新版本是不费吹灰之力的,但是您使用的过时版本不支持此功能。请阅读http://lowagie.com/itext2以了解为什么不应该使用iText 4.2.0(据我所知,它甚至不是正式版本;而且我知道,因为我负责每个iText版本)。也许您在谈论iTextSharp。

Q2:展平动态XFA表单

如果您想展平动态XFA表单,则有两个选择:使用Adobe LiveCycle ES(这将花费您一臂之力),或使用iText的XFA Worker(这是基于顶部的价格便宜得多的封闭源产品) F / OSS iText)。考虑到该产品的成本和工时,我认为您不会找到像免费啤酒一样免费的解决方案。我对这样的产品一无所知。

Q3:如何确定XFA表单是否为动态

我的书《 iText in Action-Second Edition》对此进行了解释。您已经拥有解决方案的一半。条件1:isXfaPresent()需要返回true。条件2:getFields()需要设置一个空密钥。请参见本示例中的readFieldnames()方法。

08-27 01:51