【问题标题】:Merging PDFs with Sejda fails with stream output将 PDF 与 Sejda 合并失败并出现流输出
【发布时间】:2015-08-12 09:32:41
【问题描述】:

使用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 发送。我可以存储临时文件并提供该文件,但这是一种 hack。
  • 由于许可问题,我无法使用 iText 5 版本的任务。

编辑

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

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

【问题讨论】:

    标签: java pdf sejda


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!假设我使用 Sejda 的唯一目的是合并 PDF。如何在 Sejda 分叉中解决此问题?我可以断言copyToStream() 中的files 参数仅包含一个文件并将其流式传输到out 参数吗?
    • 我手头没有代码,但我会检查 copyToStream 中的文件数量,如果有一个流式传输,是否有更多回退到旧行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多