大きなPDF(20,000+ページ)のすべてのページをレビューし、そのページに特定の文字列が含まれている場合は、そのページを別のPDFに変換します。PDFBox 2.0.3/Java 7 - 1つのPDFから別のページにページをインポートするときのOOMエラー
Exception in thread "main" java.lang.OutofMemoryError: Java heap space
at java.utils.Arrays.copyOf (Unknown Source)
at java.io.ByteArrayOutputStream.toByteArray (Unknown Source)
at org.apache.pdfbox.cos.COSOutputStream.close(COSOutputStream.java:87)
at java.io.FilterOutputStream.close(Unknown Source)
at org.apache.pdfbox.cos.COSStream$1.close(COSStream.java:223)
at org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:138)
at org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:104)
at org.apache.pdfbox.pdfmodel.PDDocument.importPage(PDDocument.java:562)
at ExtractPage.extractString(ExtractPage.java:57)
at RunApp.run(RunApp.java:15)
私が持っている:それは、以下の例外を除いては大きすぎる、それ爆弾を取得すると - により発生回数、元のPDFとほぼ同じ大きさに成長するに輸入されていますPDFへ
問題を調査し、ストリーミング用の一時ファイルを使用すると問題が解決されるようです。しかし、私は自分のコードに実装する方法を理解できません。
私は、ページを別々のファイルにバッチしてから、後でマージしてください。here - しかし、これを避けるためには、確かにエフェクトとクリーナーが必要です。
以下の私のコードの概要をご覧ください。
File sourceFile = new File (C:\\Temp\\extractFROM.pdf);
PDDocument sourceDocument = PDDocument.load(SourceFile, MemoryUsageSetting.setupTempFileOnly();
PDPageTree sourcePageTree = sourceDocument.getDocumentCatalog().getPages();
PDDocument tempDocument = new PDDocument (MemoryUsageSetting.setupTempFileOnly())
for (PDPage page : sourcePageTree) {
// Code to extract page text and confirm if contains String
if (above psuedo code is true) {
tempDocument.importPage(page);
}
}
tempDocument.save(sourceFile);
tempDocument.importPage(ページ)ラインでアウト時に、それは爆弾それはだ、7000かそこらのページを中心に輸出しています一度。その数よりも少ないPDFでは完璧に動作します。
誰でも手助けできますか?
あなたのプログラムにメモリを割り当てようとしましたか? – mkl
2.0.8を試しましたか? –
@TilmanHausherr - 私はクライアントのためにPDFBoxを使用しているので、私は2.0.8を得ることができません。そして、彼らは調達の面で少し遅れています。このように、私は2.0.3 –