内存溢出---iText读取pdf--举一反三法
本人要对pdf文件进行操作,截取一个pdf文件的n-m页.
?
?
源码如下:
FileInputStream file=new FileInputStream(input); PdfReader pdfr= new PdfReader(file);//这里会报错 Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(output)); //输出pdf文件;document.open();for(int i=begin;i<=end;i++){document.newPage();PdfImportedPage page=copy.getImportedPage(pdfr, i);copy.addPage(page);}document.close();
?如果file文件是大型文件.那么 PdfReader会将文件放入内存里.那么就会报错.内存溢出.
?
解决原理:
??? 直接将文件读取会报错,那么我们参考,文件上传和下载的方法:
byte[] b=new byte[8192];int len=0;while((len=fis.read(b))>0){fos.write(b,0,len);} fos.close(); fis.close();
?将输入输出流用 byte[]来解决.
?
? 那么这里怎么处理呢?
?
解决源码:
Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(output)); //输出pdf文件;document.open();byte[] b= new byte[file.available()]; ///这里是解决问题的重点int len=0;while((len=file.read(b))>0){file.read(b,0,b.length);///这里是解决问题的重点PdfReader pdfr=new PdfReader(new PdfReader(b));///这里是解决问题的重点int num=pdfr.getNumberOfPages();System.out.println("第一次页数是:"+num);if(num<end||begin<0||begin>end){System.out.println("截取的页数不正确!");}else {for(int i=begin;i<=end;i++){document.newPage();PdfImportedPage page=copy.getImportedPage(pdfr, i);copy.addPage(page);}}}document.close();?
?
中文注释,问题解决.内存不再报错.
?
?
?
?
?
?
?
?