2017-11-28 5 views
1

Ich habe Code, der jede Seite in einem großen PDF (20.000+ Seiten) überprüft und wenn diese Seite einen bestimmten String enthält, wird importiert diese Seite zu einem anderen PDF.PDFBox 2.0.3/Java 7 - OOM Fehler beim Importieren der Seite von einer PDF in eine andere

Aufgrund der Anzahl von Vorkommen, die PDF, die es in wächst fast so als Quelle PDF großes importiert werden wird - wenn es zu groß wird, ist es Bomben mit der unten stehenden Ausnahme:

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) 

Ich habe Ich habe das Problem untersucht und es sieht so aus, als könnte die Verwendung einer temporären Datei zum Streamen mein Problem lösen. Ich kann jedoch nicht herausfinden, wie ich es in meinen Code implementieren kann.

Ich habe eine Arbeit um, wo ich die Seiten in separate Dateien Batch und dann fusionieren sie danach, mit der so genannten here - Allerdings wäre es sicherlich effizienter und sauberer, dies zu vermeiden.

finden Sie eine Zusammenfassung meines Codes unter:

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); 

Sobald es um 7000 oder so Seiten exportiert wird, das ist, wenn es Bomben am tempDocument.importPage (Seite) Linie. Es funktioniert perfekt für PDFs unter dieser Nummer.

Kann jemand helfen?

+0

Haben Sie versucht, Ihrem Programm mehr Speicher zuzuweisen? – mkl

+0

Haben Sie 2.0.8 versucht? –

+0

@TilmanHausherr - ich kann 2.0.8 nicht bekommen, da ich PDFBox für einen Kunden benutze und sie ein wenig hinter der Zeit in Bezug auf die Beschaffung stehen. Als solcher stecke ich mit 2.0.3 –

Antwort

1

Ein Programm, das in eine OutofMemoryError ausgeführt wird, weist möglicherweise ein Speicherleck auf, oder es erfordert möglicherweise einfach mehr Arbeitsspeicher, um ordnungsgemäß ausgeführt zu werden.

Eine Änderung, die in einer solchen Situation versucht wird, besteht also darin, einfach den Speicher zu erhöhen, der dem Programm zugewiesen ist. Wenn das Programm dann ohne ein Problem ausgeführt wird, können Sie dies als eine Fehlerbehebung betrachten. Solange der Speicher komplett unvernünftig wird nicht zugewiesen, das heißt ...

Dies scheint hier der Fall zu sein, da die op bestätigt

ich den Haufen als Laufkonfiguration zu 670mb gestiegen (Das Maximum, das ich mit meiner Klientenausrüstung sichern kann) und dieses hat das Problem erfolgreich gelöst - Tatsächlich versuchte ich es auf einer PDF doppelten Größe als das ursprüngliche scheiternde PDF und es handhabte dies leicht auch.

+0

Nur um weitere Informationen zu liefern, habe ich Speicherlecks zuvor gesehen und erfolgreich geschafft, sie zu korrigieren, ohne den Haufen zu erhöhen. Ich arbeite jedoch seit einigen Tagen an diesem Problem und konnte keine Lösung finden, um es zu lösen. Es scheint auch, dass meine JVM eine Standardeinstellung von maximal 256 MB hatte, also war es kein Wunder, dass sie in Anbetracht der Größe der PDFs, mit denen ich arbeite, umfiel. –

Verwandte Themen