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