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?
Haben Sie versucht, Ihrem Programm mehr Speicher zuzuweisen? – mkl
Haben Sie 2.0.8 versucht? –
@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 –