将PDF与Sejda合并失败并显示流输出

时间:2015-08-12 09:32:41

标签: 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无法读取生成的文件,并且比上面保存的文件大约小31kB(总共~1.2 MB的总结果)。

我的第一个想法是:流没有正确关闭!所以我在os.close();的末尾添加了CompletionListener,仍然是同样的问题。

说明:

  • 我需要使用StreamTaskOutput的原因是此合并逻辑将存在于Web应用程序中,合并的PDF将直接通过HTTP发送。我可以存储临时文件并提供该文件,但这是一个黑客。
  • 由于许可问题,我无法使用iText 5版本的任务。

修改

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

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

1 个答案:

答案 0 :(得分:1)

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