将 PDF 与 Sejda 合并失败并出现流输出

Merging PDFs with Sejda fails with stream output

使用 Sejda 1.0.0.RELEASE,我基本上遵循 tutorial for splitting a PDF 但尝试合并(org.sejda.impl.itext5.MergeTaskMergeParameters、...)。 FileTaskOutput:

一切正常
parameters.setOutput(new FileTaskOutput(new File("/some/path/merged.pdf")));

但是我无法将其正确更改为 StreamTaskOutput

OutputStream os = new FileOutputStream("/some/path/merged.pdf");
parameters.setOutput(new StreamTaskOutput(os));
parameters.setOutputName("merged.pdf");

没有报告错误,但是生成的文件无法被 Preview.app 读取,并且比上面保存的文件小大约 31 kB(在 ~1.2 MB 的总结果中)。

我的第一个想法是:流没有正确关闭!所以我在CompletionListener的最后加了os.close();,还是一样的问题

备注:


编辑

原来,原因是StreamTaskOutput将结果压缩成一个ZIP文件! OutputWriterHelper.copyToStream() 是罪魁祸首。如果我将 merged.pdf 重命名为 merged.zip,它就是一个包含完全有效的 merged.pdf 文件的有效 ZIP 文件!

任何人(图书馆的亲爱的作者)都可以评论为什么会这样吗?

这个想法是,当一个任务消耗 MultipleOutputTaskParameters 生成多个输出文档时,StreamTaskOutput 必须将它们分组以便能够将它们全部写入流输出。不幸的是,Sejda 目前将相同的逻辑应用于 SingleOutputTaskParameters,因此出现了您的问题。我们可以在 Sejda 2.0 中修复此问题,因为在 SingleOutputTaskParameters 的情况下直接流式传输输出文档更有意义。对于 Sejda 1.x,我不确定如何解决与现有行为保持兼容的问题。