我在iText/iTextSharp(iTextSharp 5.3.3 via NuGet)中遇到了一个非常奇怪的XFA表单问题。我正在尝试填写一个静态XFA样式的表单,但是我的更改并不适用。
我有iText的两个版本,并且一直在查阅第二版以及该书中的iTextSharp代码转换示例。
背景:我有一个XFA表单,可以在计算机上使用Adobe Acrobat手动填写。使用iTextSharp,我可以读取Xfa XML数据,并查看数据的结构。我基本上是想用iText来模仿这一点。
下面是我试图读入的XML文件以替换现有数据(注意:这是该文件的整个上下文):
但是,当我在中传递替换XML文件的路径并尝试设置数据时,创建的新文件(替换了数据的原始文件的副本)不会抛出任何错误,但数据不会更新。我可以看到新文件创建了,我可以打开它,但是文件中没有数据。
下面是第一次用来替换数据或填充的代码,它是http://sourceforge.net/p/itextsharp/code/head/tree/trunk/book/itextexamplesweb/itextinaction2ed/chapter08/xfamovie.cs的变体
public void Generate(string sourceFilePath, string destinationtFilePath, string replacementXmlFilePath)
{
PdfReader pdfReader = new PdfReader(sourceFilePath);
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
{
XfaForm xfaForm = new XfaForm(pdfReader);
XmlDocument doc = new XmlDocument();
doc.Load(replacementXmlFilePath);
xfaForm.DomDocument = doc;
xfaForm.Changed = true;
XfaForm.SetXfa(xfaForm, stamper.Reader, stamper.Writer);
}
var bytes = ms.ToArray();
File.WriteAllBytes(destinationtFilePath, bytes);
}
}
如有任何帮助,我们将不胜感激。
我推翻了你的答案,因为它不是不正确的(我很高兴我对演示的引用引导你再看一遍你的代码),但是现在我再看一遍你的原始代码,我认为最好使用书中的示例:
public byte[] ManipulatePdf(String src, String xml) {
PdfReader reader = new PdfReader(src);
using (MemoryStream ms = new MemoryStream()) {
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
AcroFields form = stamper.AcroFields;
XfaForm xfa = form.Xfa;
xfa.FillXfaForm(XmlReader.Create(new StringReader(xml)));
}
return ms.ToArray();
}
}
正如您所看到的,没有必要替换整个XFA XML。如果您使用fillxfaform
方法,那么数据就足够了。
注意:有关示例的C#版本,请参见http://tinyurl.com/iiacsch08(其他章节的示例将08改为01到16)。
代码: 这段代码没有异常,一切似乎都很好,但是如果我打开填充的pdf,Adobe Reader会说这样的话: 此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。 有些字段填写正确,但我无法编辑。某些字段为空。若我通过单击Adobe Reader中的“导入数据”手动选择xml,则表单填写正确,所以我猜xml中并没有错误。
我有一个基于XFA的pdf表单,我们需要使用java来填充它。你能建议最好的方法吗。我能够使用iText为pdf生成xfa xml。 我有从上面的代码生成的Pdf和Xfa XML。你能不能建议我如何继续下去,因为我似乎没有主意了。我试图检查XFA文档,但似乎不对。我没有xml,pdf非常复杂,因为它有许多字段,是一个动态XFA pdf表单。 您的帮助和建议将受到衷心的感谢。
我有一个不包含XFA数据的PDF。我想做的是,以编程方式创建一个XFA表单模板(不是使用Adobe LiveCycle或类似程序),然后将其嵌入到PDF中,然后填写XFA表单。 这可能吗?或者我必须使用Adobe LiveCycle吗? 编辑 XFAF(XFA前台)子集-(在XFA 2.5中引入)-XFA表单的每一页都覆盖在PDF背景上的表单。它只能用于静态XFA表单。此体系结构仅使用XFA的一个
要求:在移动设备上查看基于XFA的PDF。 我尝试过的选项: 由于Adobe移动阅读器不支持XFA,因此我可以将XFA展平为静态PDF。我尝试过,但无法使用iText将动态XFA转换为静态PDF。 后来我尝试使用“Adobe PDF”作为打印服务打印XFA表单。这在手动执行时可以正常工作,但在通过代码执行时会以某种方式清除表单数据。 下面是打印任务的示例代码。已为“Adobe PDF”打印服务安装
我试图在具有动态输入字段的pdf表单中设置值,但流编写器不断出错。 我研究了填写表格(http://mail-archives.apache.org/mod_mbox/pdfbox-users/201510.mbox/browser)的步骤,并阅读了类似的问题结合XFA与PDFBox和PDFBox臃肿的PDF文件大小 有什么不同的方法吗?有什么建议可以引导我走向正确的方向吗? 这是我的代码 这就是
我需要将预填充的PDF/XFA表单设置为只读(因为在没有输入的情况下,例如文本、复选框、单选按钮等可以更改其值)。 对于常规AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用setFormFlatting(true)来实现这一点。对于动态XFA表单,我必须将XDP的“字段”节点的“访问”属性设置为“只读”。 问题是,如何检测表单是否是动态XFA?不区分静态或动态