[英]Java: combine 2000-5000 PDFs into 1 using iText yield OutOfMemorryError
我長時間盯着這段代碼,試圖減少代碼使用的內存量,並且仍然生成java.lang.OutOfMemoryError: Java heap space
。 作為我的最后選擇,我想向社區詢問如何改進此代碼以避免OutOfMemoryError
我有一個驅動程序/清單文件(.txt文件),其中包含有關PDF的信息。 我需要合並在一起的zip文件中包含大約2000-5000 pdf。 在合並之前,對於每個pdf,我需要再添加2-3個pdf頁面。 Manifest
對象包含有關pdf的信息。
try{
blankPdf = new PdfReader(new FileInputStream(config.getBlankPdf()));
mdxBacker = new PdfReader(new FileInputStream(config.getMdxBacker()));
theaBacker = new PdfReader(new FileInputStream(config.getTheaBacker()));
mdxAffidavit = new PdfReader(new FileInputStream(config.getMdxAffidavit()));
theaAffidavit = new PdfReader(new FileInputStream(config.getTheaAffidavit()));
ImmutableList<Manifest> manifestList = //Read manifest file and obtain List<Manifest>
File zipFile = new File(config.getInputDir() + File.separator + zipName);
//Extracting PDF into `process` folder
ZipUtil.extractAll(config.getExtractPdfDir(), zipFile);
outputPdfName = zipName.replace(".zip", ".pdf");
outputZipStream = new FileOutputStream(config.getOutputDir() +
File.separator + outputPdfName);
document = new Document(PageSize.LETTER, 0, 0, 0, 0);
writer = new PdfCopy(document , outputZipStream);
document.open(); //Open the document
//Start combining PDF files together
for(Manifest m : manifestList){
//Obtain full path to the current pdf
String pdfFilePath = config.getExtractPdfDir() + File.separator + m.getPdfName();
//Before combining PDF, add backer and affidavit to individual PDF
PdfReader pdfReader = PdfUtil.addBackerAndAffidavit(config, pdfType, m,
pdfFilePath, blankPdf, mdxBacker, theaBacker, mdxAffidavit,
theaAffidavit);
for(int pageNumber=1; pageNumber<=pdfReader.getNumberOfPages(); pageNumber++){
document.newPage();
PdfImportedPage page = writer.getImportedPage(pdfReader, pageNumber);
writer.addPage(page);
}
}
} catch (DocumentException e) {
} catch (IOException e) {
} finally{
if(document != null) document.close();
try{
if(outputZipStream != null) outputZipStream.close();
if(writer != null) writer.close();
}catch(IOException e){
}
}
請確保我已經看了很長時間此代碼,並嘗試多次重寫它以減少使用的內存量。 在OutOfMemoryError之后,仍然有很多未添加2-3個額外頁面的pdf文件,因此我認為它位於addBackerAndAffidavit
,但是,我嘗試關閉我打開的所有資源,但它仍然例外。 請幫忙。
您需要在每個循環結束時調用PdfWriter#freeReader()
以釋放涉及的PdfReader
。 PdfCopy#freeReader()
具有從PdfWriter
繼承的此方法,並且執行相同的操作。 另請參閱javadoc :
freeReader
public void freeReader(PdfReader reader) throws IOException
從類復制的描述 :
PdfWriter
使用此方法將閱讀器寫入文檔並釋放其使用的內存。 主要用途是在串聯多個文檔時將內存使用量限制在當前附加文檔中。覆蓋 :
freeReader
類PdfWriter
參數 :
reader
-在PdfReader
免費拋出 :
IOException
錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.