0

Sejda 1.0.0.RELEASE を使用して、基本的に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 のうち)。

私の最初のアイデアは、ストリームが適切に閉じられていないということでした! だから私os.close();はの最後に追加しましたがCompletionListener、それでも同じ問題です。

備考:

  • このマージ ロジックを使用する必要があるのStreamTaskOutputは、このマージ ロジックが Web アプリに存在し、マージされた PDF が HTTP 経由で直接送信されるためです。一時ファイルを保存して提供することもできますが、それはハックです。
  • ライセンスの問題により、タスクの iText 5 バージョンを使用できません。

編集

その理由はStreamTaskOutput、結果を ZIP ファイルに圧縮するためです。OutputWriterHelper.copyToStream()が犯人です。名前merged.pdfをに変更するとmerged.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 に答える