当前位置: 首页 > 后端技术 > Java

使用itextpdf提取PDF文件中的任意页码

时间:2023-04-01 19:44:27 Java

现在有这样一个需求:有一个PDF文件有几十页,现在需要从中拆分出指定的页码,然后生成一个新的PDF文件。这时候可以使用开源的itextpdf库来实现。itextpdf官方github地址为:https://github.com/itext/itextpdf。下面通过具体代码进行演示。1.引入依赖itextpdf最新版本是5.5.13.3,可以在https://search.maven.org/上搜索到。com.itextpdfitextpdf5.5.13.3二、代码实现2.1指定页码提取包com.magic.itextpdf;导入java.io.FileOutputStream;导入java.io.IOException;导入java.util.List;导入java.util.Objects;导入com.itextpdf.text.Document;导入com.itextpdf.text.DocumentException;导入com.itextpdf.text.pdf.PdfCopy;importcom.itextpdf.text.pdf.PdfReader;importcom.itextpdf.text.pdf.PdfSmartCopy;/***PDF工具类*/publicclassPdfUtils{/***提取PDF文件*@paramsourceFile源PDF文件路径*@paramtargetFile目标PDF文件路径*@paramextractedPageNums要提取的页码*/publicstaticvoidextract(StringsourceFile,StringtargetFile,ListextractedPageNums){Objects.requireNonNull(sourceFile);Objects.requireNonNull(targetFile);PdfReader阅读器=null;文件document=null;FileOutputStreamoutputStream=null;try{//读取源文件reader=newPdfReader(sourceFile);//创建新文档document=newDocument();//创建目标PDF文件outputStream=newFileOutputStream(targetFile);PdfCopypdfCopy=newPdfSmartCopy(document,outputStream);//获取源文件的页码intpages=reader.getNumberOfPages();文档.open();//注意这里的页码是从1开始的for(intpage=1;page<=pages;page++){//如果是指定的页码就复制if(extractedPageNums.contains(page)){pdfCopy.添加页面(pdfCopy.getImportedPage(阅读器,页面));}}}catch(IOException|DocumentExceptione){e.printStackTrace();}finally{if(reader!=null){reader.close();}if(document!=null){document.close();}if(outputStream!=null){try{outputStream.flush();outputStream.close();}catch(IOExceptione){e.printStackTrace();}}}}}extract()方法有3个参数,分别为包是源PDF文件路径、目标PDF文件路径、指定页码。指定的页码通过List集合传递。比如需要提取第一页,可以调用PdfUtils.extract("D:\\Test\\test.pdf","D:\\Test\\test_out.pdf",Collections.singletonList(1));如果需要同时提取多个页面,比如第1、3、5页,可以调用PdfUtils.extract("D:\\Test\\test.pdf","D:\\Test\\test_out.pdf",Arrays.asList(1,3,5));当然,如果一个PDF有一百多页,现在需要提取10-60页,如果还是像上面那样传参数,那就很麻烦了。这时候可以重载一个方法,通过传入起始页码和结束页码来实现提取2.2重载提取起始页码和结束页码的extract方法,具体代码如下:/***提取PDF文件*@paramsourceFile源PDF文件路径*@paramtargetFile目标PDF文件路径*@paramfromPageNum起始页码*@paramtoPageNum结束页码*/publicstaticvoidextract(StringsourceFile,StringtargetFile,intfromPageNum,inttoPageNum){Objects.requireNonNull(sourceFile);Objects.requireNonNull(targetFile);PdfReader阅读器=null;文件document=null;FileOutputStreamoutputStream=null;try{//读取源文件reader=newPdfReader(sourceFile);//创建新文档document=newDocument();//创建目标PDF文件outputStream=newFileOutputStream(targetFile);PdfCopypdfCopy=newPdfSmartCopy(文档,outputStream);//获取源文件的页码intpages=reader.getNumberOfPages();文档.open();//注意这里的页码从1开始for(intpage=1;page<=pages;page++){if(page>=fromPageNum&&page<=toPageNum){pdfCopy.addPage(pdfCopy.getImportedPage(reader,page));}}}catch(IOException|DocumentExceptione){e.printStackTrace();}finally{if(reader!=null){reader.close();}if(document!=null){document.close();}if(outputStream!=null){try{outputStream.flush();outputStream.close();}catch(IOExceptione){e.printStackTrace();}}}}对于连续的页码,这种方法比较简单。比如要提取第10-60页,可以调用PdfUtils.extract("D:\\Test\\test.pdf","D:\\Test\\test_out.pdf",10,60);3、测试验证现在有一个PDF文件,一共2页,用上面的方法提取并拆分第一页,代码如下:packagecom.magic.itextpdf;importjava.util.Collections;publicclassTest{publicstaticvoidmain(String[]args){PdfUtils.extract("D:\\Test\\test.pdf","D:\\Test\\test_out_1.pdf",Collections.singletonList(1));PdfUtils.extract("D:\\Test\\test.pdf","D:\\Test\\test_out_2.pdf",1,1);}}运行后,分别生成两个test_out_1.pdf和test_out_2.pdf新文件为源文件的第一页。4、其他方法如果只处理单个PDF文件,可以使用WPS的打印功能或者Chrome浏览器的打印功能,非常方便。4.1WPS打印拆分4.2Chrome打印拆分