itextpdf提取PDF文件中的任意页码实现示例
需求
有一个几十页的PDF文件,现在需要从中拆分出指定的页码,然后生成一个新的PDF文件。
这个时候,可以使用开源的 itextpdf 库来实现,itextpdf
的官方 github 地址为:https://github.com/itext/itextpdf.
下面通过具体的代码来演示。
引入依赖
目前 itextpdf
最新版本为 5.5.13.3
,可以在 https://search.maven.org/ 网站进行搜索。
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency>
代码实现
指定页码抽取
package com.magic.itextpdf; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Objects; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfSmartCopy; /** * PDF工具类 */ public class PdfUtils { /** * 抽取PDF文件 * @param sourceFile 源PDF文件路径 * @param targetFile 目标PDF文件路径 * @param extractedPageNums 需要抽取的页码 */ public static void extract(String sourceFile, String targetFile, List<Integer> extractedPageNums) { Objects.requireNonNull(sourceFile); Objects.requireNonNull(targetFile); PdfReader reader = null; Document document = null; FileOutputStream outputStream = null; try { // 读取源文件 reader = new PdfReader(sourceFile); // 创建新的文档 document = new Document(); // 创建目标PDF文件 outputStream = new FileOutputStream(targetFile); PdfCopy pdfCopy = new PdfSmartCopy(document, outputStream); // 获取源文件的页数 int pages = reader.getNumberOfPages(); document.open(); // 注意此处的页码是从1开始 for (int page = 1; page <= pages; page++) { // 如果是指定的页码,则进行复制 if (extractedPageNums.contains(page)) { pdfCopy.addPage(pdfCopy.getImportedPage(reader, page)); } } } catch (IOException | DocumentException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } if (document != null) { document.close(); } if (outputStream != null) { try { outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
extract()
方法有三个参数,分包是源PDF文件路径、目标PDF文件路径和指定页码,其中指定页码采用List集合进行传递,比如需要抽取第1页,可以像下面这样调用
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页,如果还是像上面一样传递参数,则会非常麻烦,此时就可以重载一个方法,实现传递起始页码和结束页码来抽取了。
起始结束页码抽取
重载 extract
方法,具体的代码如下:
/** * 抽取PDF文件 * @param sourceFile 源PDF文件路径 * @param targetFile 目标PDF文件路径 * @param fromPageNum 起始页码 * @param toPageNum 结束页码 */ public static void extract(String sourceFile, String targetFile, int fromPageNum, int toPageNum) { Objects.requireNonNull(sourceFile); Objects.requireNonNull(targetFile); PdfReader reader = null; Document document = null; FileOutputStream outputStream = null; try { // 读取源文件 reader = new PdfReader(sourceFile); // 创建新的文档 document = new Document(); // 创建目标PDF文件 outputStream = new FileOutputStream(targetFile); PdfCopy pdfCopy = new PdfSmartCopy(document, outputStream); // 获取源文件的页数 int pages = reader.getNumberOfPages(); document.open(); // 注意此处的页码是从1开始 for (int page = 1; page <= pages; page++) { if (page >= fromPageNum && page <= toPageNum) { pdfCopy.addPage(pdfCopy.getImportedPage(reader, page)); } } } catch (IOException | DocumentException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } if (document != null) { document.close(); } if (outputStream != null) { try { outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
对于连续页码而言,这个方式更加简单,比如要抽取 10-60页,那么可以这样调用
PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out.pdf", 10, 60);
测试验证
现在有一个总共2页的PDF文件,分别使用上面的方法进行抽取拆分第1页,代码如下:
package com.magic.itextpdf; import java.util.Collections; public class Test { public static void main(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
两个新文件,新文件都是源文件的第一页。
其他方法
如果只是处理单个PDF文件的话,那么可以使用WPS的打印功能,或者Chrome浏览器的打印功能都可以实现,非常方便。
WPS打印拆分
Chrome打印拆分
以上就是itextpdf提取PDF文件中的任意页码实现示例的详细内容,更多关于itextpdf提取PDF文件的资料请关注脚本之家其它相关文章!
相关文章
SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示
这篇文章主要介绍了SSH框架网上商城项目第16战之Hibernate的二级缓存处理首页的热门显示,感兴趣的小伙伴们可以参考一下2016-06-06java集合类ArrayList和Vector的区别面试精讲
这篇文章主要为大家介绍了java集合类ArrayList和Vector的区别面试全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-10-10SpringBoot整合Swagger和Actuator的使用教程详解
Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。本篇文章主要介绍的是SpringBoot整合Swagger(API文档生成框架)和SpringBoot整合Actuator(项目监控)使用教程。感兴趣的朋友一起看看吧2019-06-06Java NumberFormat格式化float类型的bug
今天小编就为大家分享一篇关于Java NumberFormat格式化float类型的bug,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10解析Spring框架中的XmlBeanDefinitionStoreException异常情况
这篇文章主要介绍了解析Spring框架中的XmlBeanDefinitionStoreException异常情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-04-04
最新评论