0

使用 Sejda 1.0.0.RELEASE,我基本上遵循了拆分 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 的总结果中)。

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

评论:

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

编辑

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

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

4

1 回答 1

1

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

于 2015-08-13T07:07:38.197 回答