繁体   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