将 PDF 与 Sejda 合并失败并出现流输出
Merging PDFs with Sejda fails with stream output
使用 Sejda 1.0.0.RELEASE,我基本上遵循 tutorial for splitting a PDF 但尝试合并(org.sejda.impl.itext5.MergeTask
、MergeParameters
、...)。 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
的原因是此合并逻辑将存在于 Web 应用程序中,合并后的 PDF 将直接通过 HTTP 发送。我可以存储临时文件并提供那个文件,但那是一种 hack。
- 由于许可问题,我无法使用 iText 5 版本的任务。
编辑
原来,原因是StreamTaskOutput
将结果压缩成一个ZIP文件! OutputWriterHelper.copyToStream()
是罪魁祸首。如果我将 merged.pdf
重命名为 merged.zip
,它就是一个包含完全有效的 merged.pdf
文件的有效 ZIP 文件!
任何人(图书馆的亲爱的作者)都可以评论为什么会这样吗?
这个想法是,当一个任务消耗 MultipleOutputTaskParameters
生成多个输出文档时,StreamTaskOutput
必须将它们分组以便能够将它们全部写入流输出。不幸的是,Sejda 目前将相同的逻辑应用于 SingleOutputTaskParameters
,因此出现了您的问题。我们可以在 Sejda 2.0 中修复此问题,因为在 SingleOutputTaskParameters
的情况下直接流式传输输出文档更有意义。对于 Sejda 1.x,我不确定如何解决与现有行为保持兼容的问题。
使用 Sejda 1.0.0.RELEASE,我基本上遵循 tutorial for splitting a PDF 但尝试合并(org.sejda.impl.itext5.MergeTask
、MergeParameters
、...)。 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
的原因是此合并逻辑将存在于 Web 应用程序中,合并后的 PDF 将直接通过 HTTP 发送。我可以存储临时文件并提供那个文件,但那是一种 hack。 - 由于许可问题,我无法使用 iText 5 版本的任务。
编辑
原来,原因是StreamTaskOutput
将结果压缩成一个ZIP文件! OutputWriterHelper.copyToStream()
是罪魁祸首。如果我将 merged.pdf
重命名为 merged.zip
,它就是一个包含完全有效的 merged.pdf
文件的有效 ZIP 文件!
任何人(图书馆的亲爱的作者)都可以评论为什么会这样吗?
这个想法是,当一个任务消耗 MultipleOutputTaskParameters
生成多个输出文档时,StreamTaskOutput
必须将它们分组以便能够将它们全部写入流输出。不幸的是,Sejda 目前将相同的逻辑应用于 SingleOutputTaskParameters
,因此出现了您的问题。我们可以在 Sejda 2.0 中修复此问题,因为在 SingleOutputTaskParameters
的情况下直接流式传输输出文档更有意义。对于 Sejda 1.x,我不确定如何解决与现有行为保持兼容的问题。