3

PDF-As で満たされた ZipOutputStream を作成したいと考えています。iText (バージョン 5.5.7) を使用しています。1000 を超える pdf エントリの場合、doc.close() で OutOfMemory-exception が発生し、リークが見つかりません。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(baos));
zos.setEncoding("Cp850");
for (MyObject o : objects) {
try {
    String pdfFilename = o.getName() + ".pdf";
    zos.putNextEntry(new ZipEntry(pdfFilename));
    pdfBuilder.buildPdfADocument(zos);
    zos.closeEntry();
} ...

PdfBuilder

public void buildPdfADocument(org.apache.tools.zip.ZipOutputStream zos){
   Document doc = new Document(PageSize.A4);
   PdfAWriter writer = PdfAWriter.getInstance(doc, zos, PdfAConformanceLevel.PDF_A_1B);
   writer.setCloseStream(false); // to not close my zos
   writer.setViewerPreferences(PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage);
   writer.createXmpMetadata();
   doc.open();
   // adding Element's to doc
   // with flushContent() on PdfPTables
   InputStream sRGBprofile = servletContext.getResourceAsStream("/WEB-INF/conf/AdobeRGB1998.icc");
   ICC_Profile icc = ICC_Profile.getInstance(sRGBprofile);
   writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
   //try to close/flush everything possible
   doc.close();
   writer.setXmpMetadata(null);
   writer.flush();
   writer.close();
   if(sRGBprofile != null){
     sRGBprofile.close();
   }
}

どうすれば修正できますか?私は何かを忘れていますか?私はすでに Java ZipOutputStream を使用しようとしましたが、違いはありません。


答えてくれてありがとう!ByteOutputStream の問題は理解していますが、私の場合は何が最善のアプローチなのかわかりません。これは Web アプリケーションであり、どうにかして zip をデータベース blob にパックする必要があります。

私が今行っているのは、iText を使用して PDF を ZipOutputStream に直接作成し、対応する ByteArrayOutputSteam のバイト配列を blob に保存することです。私が見るオプションは次のとおりです。

データを 500 個のオブジェクト パッケージに分割し、最初の 500 個の PDF をデータベースに保存し、次に zip を開いて次の 500 個を追加します...しかし、これにより、現在と同じ状況、つまり大きすぎることが生じると思います。ストリームがメモリで開かれました。

サーバーにPDFを保存してみてください(十分なスペースがあるかどうかはわかりません)、一時的なzipファイルを作成してから、バイトをブロブに送信してください...

提案/アイデアはありますか?

4

2 に答える 2

0

この数の引数 (1000 以上のファイル) でそれを行うには、別のアプローチを使用する必要があります。

この例では、すべての PDF ファイルをメモリにロードしています。この「メモリ負荷」の影響を最小限に抑えるには、ドキュメントのブロックでこれを行う必要があります。

もう 1 つの方法は、ファイル システムで PDF をシリアル化してから、zip ファイルを作成することです。

于 2015-10-01T16:32:39.950 に答える