我需要使预先填充的PDF/XFA表单只读(因为在没有输入的情况下,例如文本、复选框、单选按钮等可以更改它们的值)。
对于常规的AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用setFormFlattening(true)来实现这一点。对于动态XFA表单,我必须将XDP的field节点的field属性设置为readOnly。
问题是,如何检测表单是 dynamic XFA?isXfaPresent没有区分静态还是动态XFA表单,所以没有用。
发布于 2012-10-30 17:52:33
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 (这将花费您一条手臂和一条腿),要么使用iText的LiveCycle工作器(这是一个构建在F/OSS iText之上的更便宜的封闭源产品)。考虑到这个产品的成本和工时,我认为你找不到像免费啤酒那样免费的解决方案。我一个人不知道任何这样的产品。
Q3:如何确定XFA表单是否为动态
这在我的书“行动中的iText-第二版”中作了解释。你已经有了一半的解决方案。条件1:isXfaPresent()需要返回true。条件2:getFields()需要一个空密钥集。请参阅本例中的方法readFieldnames()。
发布于 2015-02-06 22:32:51
为了添加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.");
}https://stackoverflow.com/questions/13144500
复制相似问题