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ファイルを作成してから、バイトをブロブに送信してください...
提案/アイデアはありますか?