当前位置: 首页 > 知识库问答 >
问题:

扁平化并与PDFBox合并的文件共享公共COSStream

蒲昊苍
2023-03-14

下面的代码演示了一个非常奇怪的错误。一旦"源"文件被关闭"目标"文件不能被保存和关闭,它将抛出"java.io.IOExc0019: COSStream已被关闭,无法读取。也许它的附加文件已经关闭了?"

如果我们注释掉保存源文件,那么目标文件将正确保存并关闭。这似乎清楚地表明源文件包含一个同样存在于目标文件中的costream对象。当我们关闭源文件时,源文件costream似乎被关闭,然后目标文件无法保存。

如果我们将源文件放平,则目标文件将正确保存并关闭。

这个简单的例子是试图将表单的一个副本与表单本身合并,如果您替换某些其他PDF文件(以前是XFA文档的所有政府表单),错误将再次出现。大多数PDF都可以在这种情况下工作。我们将XFA文档向下转换为普通PDF,以消除它作为变量的影响,错误仍然存在。

PDFBox版本2.0.8及更高版本中存在问题

    @Test
    public void testMergeGovernmentForms() throws Exception {
    File file = new File("GeneralForbearance.pdf");
    PDDocument destination = PDDocument.load(file);

    PDDocument source = PDDocument.load(file);
    source.getDocumentCatalog().getAcroForm().flatten(); //comment out just this line and the destination.save will pass

    PDFMergerUtility appender = new PDFMergerUtility();

    appender.appendDocument(destination, source);

    source.close(); //comment out just this line and the destination.save will pass

    destination.save(File.createTempFile("PrintMergeIssue", ".pdf"));
    destination.close();

}

从这里下载GeneralForbearance.pdf

此外,如果您“预扁平化”政府表单并保存,您将使用更简单的代码获得相同的行为。

    @Test
public void testMerge() throws Exception {
    PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
    PDDocument src = PDDocument.load(new File("C:/temp/GovFormPreFlattened.pdf"));
    PDDocument dest = PDDocument.load(new File("C:/temp/GovFormPreFlattened.pdf"));
    pdfMergerUtility.appendDocument(dest, src);
    src.close(); //if we don't close the src then we don't have an error
    dest.save(File.createTempFile("MergeIssue",".PDF"));
    dest.close();
}

预展平的政府表格可在此处找到

共有1个答案

越琦
2023-03-14

PDFMergerUtility合并标记文档时出现了几个问题,我修复、修补了这些问题,并将其作为问题PDFBOX-3999提交给Apache,如果需要,可以从那里下载补丁。此修补程序适用于2.0.8版

 类似资料:
  • 当文件需要与企业外的人进行共享或者协作时,则可通过公开共享的方式,目前公开共享有共享链接和二维码2种共享方式,共享方式如下: 1)开启公开共享; 2)设置共享权限,可设置:可编辑、仅下载、仅查看; 3)设置有效时间,可设置:24小时、7天、1个月、永久有效; 4)复制公开链接或者复制/保存共享二维码; 5)将二维码或者链接通过轻推或者其他方式发送给需要共享的对象; 6)收到链接或者二维码的人无需下

  • 问题内容: 说我有a.so和b.so。我是否可以将c.so生成为具有a和b导出的所有功能的单个共享库,当然可以解决所有内部依赖关系(即a.so调用的b.so的所有功能,反之亦然)? 我试过了 但这不起作用。 如果我在aa和ba中归档ao和bo(也不应修改ao和bo),也是如此 谢谢 问题答案: 除了AIX之外,在所有UNIXen上实际上都不可能将多个共享库合并为一个:链接器将.so视为“最终”产品

  • 我有一个经过验证的谷歌客户端,我想列出其他人公用文件夹中的文件(我认为共享或不共享的文件夹是不相关的,因为它是公用的) 这是我在NodeJS中的代码 注意:文档中没有“folderId”选项:https://developers.google.com/drive/api/v3/reference/files/list-只是一个drivid选项 虽然我将corpa设置为“drive”和drive I

  • 我有两个矩阵,对应于数据点和: 我想创建一个新的矩阵,将值组合成一列,并在相应的,列中包含s: 有没有一个简单的方法可以做到这一点?我是Python和NumPy的新手(来自MATLAB),我甚至不知道如何从这开始。(作为参考,我在MATLAB中的方法是简单地使用一个,与使用生成的两个表相对应)

  • 这就是我想做的: > 使用pdfbox制作2个不同的pdf文件 使用pdfmerger将这两个文件合并在一起 如果要将#1保存到服务器端本地硬盘并加载#2的文件,我知道如何执行此操作。但我想做的是使用“直接从内存”。我已经搜索了这个pdfboxes中的所有方法,但仍然找不到它。 这是我从本地文件获取的代码 谢谢你。

  • 我的应用程序有两个按钮,一个用于共享图像,另一个用于将其保存到内存,保存按钮工作正常,但共享按钮不工作。 这是保存按钮: 下面是分享部分: logcat上什么也没有显示,我只是得到了一些错误的吐司。权限正确。 Logcat