簡體   English   中英

Java:使用iText將2000-5000個PDF合並為1,產生OutOfMemorryError

[英]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
使用此方法將閱讀器寫入文檔並釋放其使用的內存。 主要用途是在串聯多個文檔時將內存使用量限制在當前附加文檔中。

覆蓋
freeReaderPdfWriter

參數
reader -在PdfReader免費

拋出
IOException錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM