最近用iText做读写PDF的项目。读PDF用的iText的PdfReader。直接将文件路径传进去。但是,读比较大的PDF文档就读不到了(我的PDF1M)。找网上解决方案,有个文章解决的很到位。在后面引用过来了。
先大体写下我自己的解决方法:
FileInputStream file = new FileInputStream(inputFile);//创建流文件,其中inputFile是你的PDF文档路径
byte[] b= new byte[file.available()];//获取字节
if(file.read(b)>0){
file.read(b,0,b.length);//将字节读入到文件里
}
PdfReader reader = null;// iText一个类
//这前直接将文件路径放进来,结果就是读大PDF文件(我的是大于1M)时读不到内存里。
//reader = new PdfReader(inputFile);
//解决问题的关键
/ /更换成这种方式,就可以读到大文件了。我的1M的文件是读到了,再大的没有测试过。
reader = new PdfReader(new PdfReader(b));
解决方案来自:http://www.myexception.cn/powerdesigner/1029265.html
饮水思源,大家转载的话请注明出处吧。
内存溢出---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();
中文注释,问题解决.内存不再报错.