我曾尝试从文件中提取XFA,在我将PDFBox从1.8.12更新到2.0.4之前,它对我来说效果很好。
我有一个文件,我可以从使用1.8.12但不使用2.0.4提取XFA。
当我用2.0.4的PDFBox提取它时,我得到了XFA的结构,但是几乎所有的值都不见了。另一方面,当我试图用1.8.12提取相同的形式时,结果很好。
我调查了一个类似的问题。据说是在2.0.4中修复的,但我仍然面临一些问题。
有什么想法吗?
我已经包括了文件
生成的XFA-1.8.12
生成的XFA-2.0.4
使用的文件
编辑#1
对于2.0.4
// returns PDXFA
public static byte[] getParsableXFAForm(File file) {
if (file == null)
return null;
PDDocument doc;
PDDocumentCatalog catalog;
PDAcroForm acroForm;
PDXFAResource xfa;
try {
// String pass = null;
doc = PDDocument.load(file);
if (doc == null)
return null;
// flattenPDF(doc);
doc.setAllSecurityToBeRemoved(true);
// System.out.println("Security " + doc.isAllSecurityToBeRemoved());
catalog = doc.getDocumentCatalog();
if (catalog == null) {
doc.close();
return null;
}
acroForm = catalog.getAcroForm();
if (acroForm == null) {
doc.close();
return null;
}
xfa = acroForm.getXFA();
if (xfa == null) {
doc.close();
return null;
}
// TODO return byte[]
byte[] xfaBytes = xfa.getBytes();
doc.close();
return xfaBytes;
} catch (IOException e) {
// handle IOException
// happens when the file is corrupt.
e.printStackTrace();
System.out.println("XFAUtils-getParsableXFAForm-IOException");
return null;
}
}
对于1.8.12
public static byte[] getParsableXFAForm(File file) {
if (file == null)
return null;
PDDocument doc;
PDDocumentCatalog catalog;
PDAcroForm acroForm;
PDXFA xfa;
try {
doc = PDDocument.loadNonSeq(file, null);
if (doc == null)
return null;
// flattenPDF(doc);
doc.setAllSecurityToBeRemoved(true);
// System.out.println("Security " + doc.isAllSecurityToBeRemoved());
catalog = doc.getDocumentCatalog();
if (catalog == null) {
doc.close();
return null;
}
acroForm = catalog.getAcroForm();
if (acroForm == null) {
doc.close();
return null;
}
xfa = acroForm.getXFA();
if (xfa == null) {
doc.close();
return null;
}
// TODO return byte[]
byte[] xfaBytes = xfa.getBytes();
doc.close();
return xfaBytes;
} catch (IOException e) {
// handle IOException
// happens when the file is corrupt.
// e.printStackTrace();
System.out.println("XFAUtils-getParsableXFAForm-IOException");
return null;
}
}
在您的PDF中有6个版本,在此过程中XFA表单被越来越多地填写。您的1.8.12代码提取XFA表单的最新版本,而您的2.0.4代码提取XFA表单的最旧版本。
我使用PDFBox版本2.0.4、2.0.5和当前的开发快照2.1.0-snapshot运行了您的2.0.4代码。在版本2.0.4中,我确实可以重现加载了XFA表单的最旧版本,但使用2.0.5或2.1.0-SNAPSHOT加载了当前版本。
这似乎是PDFBox2.0.0...2.0.4中的一个缺点,该缺点已在2.0.5中得到修复。
由于PDFBox 2.0.4中的一个错误从错误版本的文件中读取XFA表单似乎是不可信的,所以我进一步研究了这个问题。
特别是我仔细查看了PDF文件本身。事实证明,该文件在实际的PDF文件头之前有10个垃圾字节!
这些额外的垃圾字节使得交叉引用和相对于文件开始的偏移都是错误的。因此,PDFBox无法以常规方式解析文件,而是必须进行某种修复。
看看2.0.4和2.0.5之间的差异,特别是在修复交叉引用和偏移损坏的PDF的代码中发生了重大变化。虽然PDFBox 2.0.4只能部分修复文件(只找到最初的XFA版本),但PDFBox 2.0.5成功地进行了更完整的修复,特别是找到了最新的XFA版本。
修复了OP的PDF(即删除了前面的垃圾字节,参见XFA File fixed.PDF),我可以使用PDFBox版本2.0.0成功提取当前的XFA表单修订版。。。2.0.4也是。
因此,这并不像我最初设想的那样是一个PDFBox缺陷,而只是一个破损的PDF文件,在PDFBox 2.0.5改进之前,PDFBox文件修复html" target="_blank">功能无法正确修复。
我在尝试将PDF(XFA)转换为字符串时出现以下错误。当我从切换到 这是日志 和 我阅读了迁移,并使用load而不是loadNonSeq,因为现在PDFBox在内部处理这个问题。 关于如何修复这些错误的任何建议。 编辑错误#1错误#2 编辑#2@tilmanhausher我检查了你的理论。我用Supreme打开了文件,删除了开头的多余空格并保存了下来。我犯了以下错误 为了验证你的理论,我在Subl
我想创建一个包含XFA数据的PDF,但我不想在查看PDF时看到XFA数据,但是,我希望可以通过以下代码访问它: 我怎么能这样呢? 谢谢
我用Adobe LiveCycle Designer创建了一个PDF表单。我现在正在努力从PDF中以编程方式提取填充后的数据。 我尝试使用poppler(qt4绑定,但我想这并不重要),但显然poppler无法处理XFA表单。虽然evince和okular能够显示表单。。。 据我所知,PDF包含一个XDP,而XDP又包含XFA表单。我的问题是,我如何从PDF中提取这些数据?
我有一个不包含XFA数据的PDF。我想做的是,以编程方式创建一个XFA表单模板(不是使用Adobe LiveCycle或类似程序),然后将其嵌入到PDF中,然后填写XFA表单。 这可能吗?或者我必须使用Adobe LiveCycle吗? 编辑 XFAF(XFA前台)子集-(在XFA 2.5中引入)-XFA表单的每一页都覆盖在PDF背景上的表单。它只能用于静态XFA表单。此体系结构仅使用XFA的一个
你知道是否可以用PDFBox填写PDF格式的表格吗?如果是的话,是否有代码示例或教程来实现这一点?若否,有何最佳选择可达致这个目标?
我在iText/iTextSharp(iTextSharp 5.3.3 via NuGet)中遇到了一个非常奇怪的XFA表单问题。我正在尝试填写一个静态XFA样式的表单,但是我的更改并不适用。 我有iText的两个版本,并且一直在查阅第二版以及该书中的iTextSharp代码转换示例。 背景:我有一个XFA表单,可以在计算机上使用Adobe Acrobat手动填写。使用iTextSharp,我可以