java - 使用 Sejda 合并 PDF 失败并显示流输出

标签 java pdf sejda

使用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 的原因是此合并逻辑将存在于 Web 应用程序中,并且合并的 PDF 将直接通过 HTTP 发送。我可以存储临时文件并提供该文件,但这是一种黑客行为。
  • 由于许可问题,我无法使用该任务的 iText 5 版本。
<小时/>

编辑

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

有人(亲爱的图书馆作者)可以评论一下为什么会发生这种情况吗?

最佳答案

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

关于java - 使用 Sejda 合并 PDF 失败并显示流输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31961299/

相关文章:

java - 如何在 Android Kotlin 的列表中存储 24 小时格式

java - xslt 转换不关闭标签

java - 如何使用 Sjeda 替换 PDF 中的文本?

c# - iTextSharp - 添加垂直文本框

java - 是否可以使用 IText java 读取 itextsharp 生成的 pdf 表单?

Sejda-控制台按文本分割 : set the output file name to the changed value?

Java坚持改变这两个变量

java - Eclipse中如何设置运行配置和调试配置来选择有main方法的类作为启动类?

java - 将 byte[] 转换为 short[],使得每个 short 元素包含 13 位数据