2017-11-28 74 views
1

大きな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では完璧に動作します。

誰でも手助けできますか?

+0

あなたのプログラムにメモリを割り当てようとしましたか? – mkl

+0

2.0.8を試しましたか? –

+0

@TilmanHausherr - 私はクライアントのためにPDFBoxを使用しているので、私は2.0.8を得ることができません。そして、彼らは調達の面で少し遅れています。このように、私は2.0.3 –

答えて

1

OutofMemoryErrorに実行されているプログラムでメモリリークが発生しているか、正しく動作させるために必要なメモリが増えている可能性があります。

このように、このような状況で試行する方法の1つは、プログラムに割り当てられたメモリを単純に増やすことです。プログラムが問題なく実行される場合は、これを修正プログラムと見なすことができます。限りメモリが割り当てられたとして、完全に無理になっていません、それは...

これはopが

を確認したとして、私は670メガバイトに実行構成としてヒープを増加している、ここでのケースのように表示されます(最大限私のクライアント機器で保護することができます)これは問題を解決しました - 実際には、PDFの元の失敗したPDFの2倍のサイズで試してみました。

+0

さらに詳しい情報を提供するために、私はこれに先立ってメモリリークに直面し、ヒープを増やすことなく修正することに成功しました。しかし、私は数日間この問題に取り組んできましたが、解決するための解決策を見つけることができませんでした。私のJVMには最大256MBのデフォルト設定があるようですので、私が作業しているPDFのサイズを考慮して落ちていたのも不思議ではありません。 –

関連する問題