使用iText检测动态XFA

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

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

问题是,如何检测表单是否为 dynamic XFA? isXfaPresent没有用't differentiate between static or dynamic XFA forms, so isn' .

回答(2)

2 years ago

iText在言论自由中是免费的,不像免费啤酒那样免费 . 请阅读http://lowagie.com/bumodels以获取有关我们尝试过的商业模式的更多信息,以避免从MPL / LGPL切换到AGPL .

Q1: making dynamic XFA forms read-only

那's a no-brainer with the most recent version of iText, but not supported in the obsolete version you'重新使用 . 请阅读http://lowagie.com/itext2以了解为什么你甚至不应该正式发布;我知道,因为我正在谈论iTextSharp .

Q2: flattening dynamic XFA forms

如果你想要展平动态XFA表单,你有两个选择:使用Adobe LiveCycle ES(这将花费你的手臂和腿),或使用iText的XFA Worker(这是一个便宜得多的闭源产品, Build 在顶部F / OSS iText) . 鉴于此产品的成本和工时数,我认为您不会像免费啤酒那样找到免费的解决方案 . 我一个人不知道任何这样的产品 .

Q3: how to find out if an XFA form is dynamic

这在我的书中解释,"iText in Action - Second Edition."你已经有了一半的解决方案 . 条件1: isXfaPresent() 需要返回 true . 条件2: getFields() 需要有一个空键集 . 请参阅此示例中的方法 readFieldnames() .

2 years ago

要添加Bruno的答案并提供C#示例代码:

PdfReader reader = new PdfReader(filePath);
XfaForm xfa = new XfaForm(reader);

//Check if PDF file contains Dynamic XFA data
if (xfa != null && xfa.XfaPresent && xfa.Reader.AcroFields.Fields.Keys.Count == 0)
{
   MessageBox.Show("This PDF contains Dynamic XFA data.");
}