큰 PDF (20,000+ 페이지)의 모든 페이지를 검토하는 코드가 있고 해당 페이지에 특정 문자열이 포함되어 있으면 가져옵니다 해당 페이지를 다른 PDF로 인해 발생의 수에PDFBox 2.0.3/Java 7 - 한 페이지에서 다른 페이지로 페이지를 가져올 때의 OOM 오류
는, 그것은으로 수입되고있는 PDF는 원본 PDF만큼이나 큰 성장 - 그것은 아래를 제외하고 밖으로 너무 큰, 그것은 폭탄을 얻을 때 : 내가 가지고있는
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)
문제를 조사하고 스트리밍을위한 임시 파일을 사용하는 것이 내 문제를 해결할 수있는 것처럼 보입니다. 그러나, 난 그냥 내 코드에 그것을 구현하는 방법을 해결할 수 없습니다.
내가 페이지를 별도의 파일로 배치 한 다음 나중에 언급 된 soultion을 사용하여 작업을 병합합니다. here - 그러나이를 피하기 위해서는 확실하고 확실한 방법이 될 것입니다.
아래의 내 코드의 요약 참조하십시오 : 그것은 7000 정도 페이지의 주위에 내 보낸 후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 (페이지) 라인에서 그것을 밖으로 폭탄. 이 번호 아래의 PDF는 완벽하게 작동합니다.
누구든지 도와 줄 수 있습니까?
프로그램에 메모리를 할당 해 보았습니까? – mkl
2.0.8을 사용해 보셨습니까? –
@TilmanHausherr - 나는 2.0.8을 얻을 수 없다. 왜냐하면 나는 클라이언트를 위해 PDFBox를 사용하고 있으며, 소싱 측면에서 약간 뒤떨어져있다. 따라서, 2.0.3으로 고정되어있다. –