首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:使用iText yield将2,000-5,000个PDF合并为1

Java:使用iText yield将2,000-5,000个PDF合并为1
EN

Stack Overflow用户
提问于 2011-09-27 03:28:53
回答 1查看 1.2K关注 0票数 2

我已经关注这段代码很长一段时间了,试图减少代码使用的内存量,但它仍然生成了java.lang.OutOfMemoryError: Java heap space。作为我最后的手段,我想问社区我如何改进这段代码以避免OutOfMemoryError

我有一个驱动程序/清单文件(.txt文件),其中包含有关PDF的信息。我有大约2000-5000 pdf在一个压缩文件中,我需要结合在一起。在合并之前,对于每个pdf,我需要添加2-3多个pdf页面到它。Manifest对象保存有关pdf的信息。

代码语言:javascript
复制
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之后,仍然有很多pdf文件没有添加2-3个额外的页面,所以我认为它在addBackerAndAffidavit中,然而,我试图关闭我打开的每一个资源,但它仍然异常。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-27 04:17:28

您需要在每个循环结束时调用PdfWriter#freeReader()来释放所涉及的PdfReaderPdfCopy#freeReader()具有从PdfWriter继承的此方法,并执行相同的操作。另请参阅javadoc

freeReader

公共空freeReader(PdfReader阅读器)抛出IOException

从类复制的描述:PdfWriter

使用此方法将读取器写入文档并释放其使用的内存。主要用于连接多个文档,以将内存使用限制在当前追加的文档中。

覆盖:

PdfWriter中的freeReader

参数:

reader --免费的PdfReader

抛出:

IOException - on error

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7560235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档