3

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

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

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

4

2 回答 2

2

iText 像言论自由一样是免费的,而不是像免费啤酒那样免费。阅读http://lowagie.com/bumodels了解更多关于我们为避免从 MPL/LGPL 切换到 AGPL 而尝试的商业模式的信息。

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

这对于最新版本的 iText 来说是显而易见的,但在您使用的过时版本中不受支持。请阅读http://lowagie.com/itext2了解为什么您不应该使用 iText 4.2.0(据我所知,它甚至不是正式版本;我知道,因为我对所有单个 iText 版本)。也许您在谈论 iTextSharp。

Q2:扁平化动态 XFA 表单

如果你想扁平化一个动态 XFA 表单,你有两个选择:要么使用 Adob​​e LiveCycle ES(这将花费你一条胳膊和一条腿),或者使用 iText 的 XFA Worker(它是一种价格便宜得多的封闭源代码产品F/OSS iText 的)。考虑到该产品的成本和工时数,我认为您不会找到像免费啤酒那样免费的解决方案。我不知道任何这样的产品。

Q3:如何判断一个 XFA 表单是否是动态的

这在我的书“iText in Action - Second Edition”中有解释。你已经有了一半的解决方案。条件一:isXfaPresent()需要退货true。条件2:getFields()需要有一个空键集。请参阅readFieldnames()本例中的方法。

于 2012-10-30T17:52:33.073 回答
2

要添加到布鲁诺的答案并提供 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.");
}
于 2015-02-06T22:32:51.090 回答