我需要将预先填充的PDF / XFA表单设为只读(因为没有输入,例如文本,复选框,单选按钮等可以更改其值)。
对于常规的AcroForms PDF和静态XFA表单,我可以通过调用PdfStamper实例上的setFormFlattening(true)
来完成此操作。对于动态XFA表单,我必须将XDP的access
节点的field
属性设置为readOnly
。
问题是,如何检测表单是否动态 XFA? isXfaPresent
无法区分静态或动态XFA表单,因此无用。
答案 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.");
}