Java:使用iText将2000-5000 PDF合并为1

Java:使用iText将2000-5000 PDF合并为1,java,itext,out-of-memory,Java,Itext,Out Of Memory,我一直在关注这段代码,试图减少代码使用的内存量,但它仍然生成了java.lang.OutOfMemoryError:java堆空间。作为我最后的手段,我想询问社区如何改进此代码以避免OutOfMemoryError 我有一个驱动程序/清单文件(.txt文件),其中包含有关PDF的信息。我有大约2000-5000 pdf在一个zip文件,我需要结合在一起。在合并之前,对于每个pdf,我需要再添加2-3个pdf页面清单对象保存有关pdf的信息 try{ blankPdf = new PdfR

我一直在关注这段代码,试图减少代码使用的内存量,但它仍然生成了
java.lang.OutOfMemoryError:java堆空间
。作为我最后的手段,我想询问社区如何改进此代码以避免
OutOfMemoryError

我有一个驱动程序/清单文件(.txt文件),其中包含有关PDF的信息。我有大约2000-5000 pdf在一个zip文件,我需要结合在一起。在合并之前,对于每个pdf,我需要再添加2-3个pdf页面<代码>清单对象保存有关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){

    }
}
试试看{
blankPdf=newpdfreader(新文件输入流(config.getBlankPdf());
mdxBacker=newpdfreader(新文件输入流(config.getMdxBacker());
theaBacker=newpdfreader(新文件输入流(config.getTheaBacker());
mdxAffidavit=newpdfReader(新文件输入流(config.getMdxAffidavit());
theaaffinitiation=newpdfReader(新文件输入流(config.gettheaaffinitiation());
ImmutableList manifestList=//读取清单文件并获取清单
File zipFile=新文件(config.getInputDir()+File.separator+zipName);
//正在将PDF提取到“process”文件夹中
提取文件(config.getExtractPdfDir(),zipFile);
outputPdfName=zipName.replace(“.zip”,“.pdf”);
outputZipStream=新文件OutputStream(config.getOutputDir()+
File.separator+outputPdfName);
document=新文档(PageSize.LETTER,0,0,0);
writer=新的PdfCopy(文档、输出流);
document.open();//打开文档
//开始将PDF文件组合在一起
for(清单m:manifestList){
//获取当前pdf文件的完整路径
字符串pdfFilePath=config.getExtractPdfDir()+File.separator+m.getPdfName();
//在合并PDF之前,将支持者和宣誓书添加到单个PDF中
PdfReader PdfReader=PdfUtil.addBackerAndAffidavit(配置,pdfType,m,
pdfFilePath、blankPdf、mdxBacker、TheAfacker、mdxAffidavit、,
(宣誓书);
对于(int pageNumber=1;pageNumber,您需要在每个循环结束时调用,以释放所涉及的
PdfReader
。此方法继承自
PdfWriter
,并执行相同的操作。另请参阅:

自由读者 从类中复制的说明
使用此方法将读取器写入文档并释放其使用的内存。主要用途是在连接多个文档时,将内存使用限制在当前附加文档中

覆盖
课堂上

参数
阅读器
-将
PDF阅读器
释放

抛出
-论错误


您是否尝试在内存分析器运行时使用它?我在“pdfwriter+flush”上搜索在这里,我发现:你可能会发现它被接受的答案很有帮助。@ShaneWalti:是的,但由于某些原因,Eclipse Helios Profiler工具在运行一段时间后总是使Eclipse无法响应。可能它的内存不足。@BalusC:事实上,
PdfCopy#freeReader(PdfReader)
成功了。非常感谢您的链接,巴卢斯克。不客气。我只是不确定这个问题是否应该以dupe结尾(从技术上讲,是这样),或者您只是删除这个问题,或者自己回答这个问题,或者我也应该把它作为一个答案重新发布(尽管我几乎没有实际的iText经验).你想要什么,哈利?
public void freeReader(PdfReader reader)
                throws IOException