使用iText检测动态XFA

时间:2012-10-30 17:29:34

标签: pdf itext xfa

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

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

问题是,如何检测表单是否动态 XFA? isXfaPresent无法区分静态或动态XFA表单,因此无用。

2 个答案:

答案 0 :(得分:3)

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之上)。鉴于此产品的成本和工时数,我认为您不会像免费啤酒那样找到免费的解决方案。我一个人不知道任何这样的产品。

问题3:如何确定XFA表格是否动态

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

答案 1 :(得分:2)

添加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.");
}