`
xbcoil
  • 浏览: 123423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存溢出---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();
 

 

中文注释,问题解决.内存不再报错.

 

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics