gpt4 book ai didi

java - PdfBox 压平 pdf 不会删除 acroform 元素

转载 作者:行者123 更新时间:2023-11-30 06:20:24 26 4
gpt4 key购买 nike

我有一个包含很多 acroform 的 pdf,我对其进行了一些操作,从而生成了一个新的 pdf。所以我有 PDF-1(这是原始的)和 PDF-2(只是 PDF-1 的副本),现在我想合并它们。两个 PDF 都有一些 acroform,例如: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

正如我所见,问题仅发生在复选框中,正常的文本字段将被正确删除

最佳答案

正如评论中已经提到的:

确实,这是一个错误。不过,这并不是因为OP假设扁平化不会删除字段,而是PDFMergerUtility.mergeAcroForm中合并代码的问题。

根本问题在于处理非平凡的字段层次结构:在 OP 共享的示例源文档中,复选框字段不是顶级字段,而是位于顶级节点“cb_a”下。

在合并的文档中,它们不仅被重命名,而且还被添加到顶级表单字段列表中;这实际上是无效的,因为它们仍然有对“cb_a”的父级引用。

此错误目前已在 Apacha Jira 条目 PDFBOX-4066 的上下文中讨论和解决。 .

关于java - PdfBox 压平 pdf 不会删除 acroform 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48271924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com