【发布时间】:2018-01-15 23:05:56
【问题描述】:
我有一个包含很多 acroforms 的 pdf,我对其进行了一些操作,从而生成了一个新的 pdf。 所以我有 PDF-1(这是原始的)和 PDF-2(只是 PDF-1 的副本),现在我想合并它们。两种 PDF 都有一些 acroforms,例如:field_a、field_2...
在合并它们之前,我将 PDF-1 展平,因为我只想拥有来自 PDF-2 的 acrofields。当我检查我的新合并 PDF 时,我可以看到 PDF-1 的页面上没有可见字段,而 PDF-2 的字段页面上有字段。乍一看似乎没问题,但是当我检查字段时,我可以看到合并已重命名 PDF-2 的所有字段,例如field_a_dummy123, field_b_dummy232 ...
在我看来,展平不会删除字段,这就是 PDFBox 中的 PDFMerger 将重命名 PDF-2 的字段的原因,因为 acrofields 需要是唯一的。有没有办法完全删除 PDF-1 的 acroforms?
@Test
public void flattenAndMerge() throws IOException {
File testForm = new File(classLoader.getResource("./TestForm.pdf").getFile());
byte[] testFormAsByte = Files.readAllBytes(testForm.toPath());
byte[] testFormAsByte2 = Files.readAllBytes(testForm.toPath());
PDDocument pdf1 = PDDocument.load(testFormAsByte);
PDAcroForm acroform = pdf1.getDocumentCatalog().getAcroForm();
acroform.flatten();
Path flattendedPdf = Files.createTempFile("flatten", ".pdf");
pdf1.save(flattendedPdf.toFile());
PDFMergerUtility merger = new PDFMergerUtility();
merger.addSource(new ByteArrayInputStream(Files.readAllBytes(flattendedPdf)));
merger.addSource(new ByteArrayInputStream(testFormAsByte2));
merger.setDestinationFileName("./build/flattenAndMerge.pdf");
merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
}
我使用的是 PDFBox 2.0.8。
这是输入文件:https://ufile.io/6etxp 以下是测试结果:https://ufile.io/bh94n
我可以看到问题只出现在复选框中,正常的文本字段将被正确删除
【问题讨论】:
-
你用的是什么版本?请分享 PDF 文件。
-
我已经编辑了我的帖子并添加了信息
-
确实,有一个错误,我认为这是由于处理非平凡字段层次结构的问题:复选框字段不是顶级字段,但它们位于顶级节点“cb_a”下”。在合并中,它们不仅被重命名,而且被添加到顶级表单字段列表中;这实际上是无效的,因为它们仍然具有对“cb_a”的 Parent 引用。您可能想先尝试使用具有简单表单层次结构的 PDF,而 PDFBox 有一个问题需要解决... ;)
-
可能是
mergeAcroForm()中的一个错误。请在JIRA 中打开一个问题并将您的文件附在此处。在组件中,选择 Acroform + Utilities。 -
好的,在那里添加了错误:issues.apache.org/jira/browse/PDFBOX-4066