- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含很多 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/
有没有办法强制TSpeedButton重新绘制平坦? 使用触摸屏显示器时,鼠标不会移出按钮,因此即使您单击其他按钮,凸起的边框也会保留在屏幕上。 最佳答案 看起来这不是我可以在没有触摸屏的情况下重现的
我有一个包含很多 acroform 的 pdf,我对其进行了一些操作,从而生成了一个新的 pdf。所以我有 PDF-1(这是原始的)和 PDF-2(只是 PDF-1 的副本),现在我想合并它们。两个
我目前正在调查 RxJS's .merge但是我也会在这里问这个问题,因为我发现这里的解释有时非常精彩。 好的,我有一个根据用户输入打开模态窗口的表单,我订阅模态关闭事件并传回一些我将在调用/订阅服务
我是一名优秀的程序员,十分优秀!