我需要将预先填充的 PDF/XFA 表单设为只读(因为没有输入,例如文本、复选框、单选按钮等可以更改其值)。
对于常规 AcroForms PDF 和静态 XFA 表单,我可以通过调用setFormFlattening(true)
PdfStamper 实例来完成此操作。对于动态 XFA 表单,我必须将access
XDPfield
节点的属性设置为readOnly
.
问题是,如何检测表单是否为动态XFA? isXfaPresent
不区分静态或动态 XFA 表单,因此没有用。
我需要将预先填充的 PDF/XFA 表单设为只读(因为没有输入,例如文本、复选框、单选按钮等可以更改其值)。
对于常规 AcroForms PDF 和静态 XFA 表单,我可以通过调用setFormFlattening(true)
PdfStamper 实例来完成此操作。对于动态 XFA 表单,我必须将access
XDPfield
节点的属性设置为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”中有解释。你已经有了一半的解决方案。条件一:isXfaPresent()
需要退货true
。条件2:getFields()
需要有一个空键集。请参阅readFieldnames()
本例中的方法。
要添加到布鲁诺的答案并提供 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.");
}