文章目录

  • 一、需求
  • 二、准备
  • 三、功能开发
    • 1.按页拆分
    • 2.PDF切分

一、需求

将一个PDF文件按页拆分成多个PDF,或者将某一页中某一部分内容单独拆分出来作为一个新的PDF

二、准备

本文使用pdfbox实现,因此需要先导入pdfbox的依赖

     <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>jbig2-imageio</artifactId><version>3.0.2</version></dependency>

三、功能开发

1.按页拆分

代码如下(示例):

    public static void splitPdf(File sourceFile) throws IOException {splitPdf(sourceFile, 1);}public static void splitPdf(File sourceFile, String targetPath) throws IOException {splitPdf(sourceFile, targetPath, 1);}public static void splitPdf(File sourceFile, Integer pageStep) throws IOException {splitPdf(sourceFile, sourceFile.getParentFile().getPath(), 1);}/*** @return void* @Description //TODO pdf拆分,结果命名规则为原文件名-startPage_endPage.pdf* @Date 2022/2/16 10:20* @Param [sourceFile:要拆分的pdf文件, targetPath:结果输出目录, pageStep:以多少页为基准拆分]**/public static void splitPdf(File sourceFile, String targetPath, Integer pageStep) throws IOException {String fileName = sourceFile.getName().replace(".pdf", "");PDDocument document = PDDocument.load(sourceFile);int pageSize = document.getNumberOfPages();int count = pageSize / pageStep + (pageSize % pageStep == 0 ? 0 : 1);log.info("pageSize : {}, pageStep : {}, count : {}", pageSize, pageStep, count);PDDocument doc = new PDDocument();PDPage page = null;String splitName = null;for (int i = 0; i < count; i++) {PDFContentTool.clearDocument(doc);int startPage = i * pageStep;int endPage = startPage + pageStep;if (endPage > pageSize) {endPage = pageSize;}splitName = fileName + "-" + (startPage + 1) + "_" + endPage + ".pdf";for (int index = startPage; index < endPage; index++) {page = document.getPage(index);doc.addPage(page);}File outFile = new File(targetPath, splitName);doc.save(outFile);}document.close();doc.close();}/*** @return void* @Description //TODO pdf拆分,结果命名规则为原文件名-startPage_endPage.pdf* @Date 2022/2/16 10:20* @Param [sourceFile:要拆分的pdf文件, targetPath:结果输出目录, pageIndex,:从哪里开始拆分]**/public static void splitPdfWithPageIndex(File sourceFile, String targetFile, Integer pageIndex) throws IOException {splitPdfWithPageIndex(sourceFile,targetFile,pageIndex,1);}/*** @return void* @Description //TODO pdf拆分,结果命名规则为原文件名-startPage_endPage.pdf* @Date 2022/2/16 10:20* @Param [sourceFile 要拆分的pdf文件, targetFile 结果输出目录, pageIndex 从哪里开始拆分, totalPages 总共拆出多少页]**/public static void splitPdfWithPageIndex(File sourceFile, String targetFile, Integer pageIndex, Integer totalPages) throws IOException {PDDocument document = PDDocument.load(sourceFile);PDDocument doc = new PDDocument();PDPage page = null;for (int index = pageIndex; index < pageIndex + totalPages; index++) {page = document.getPage(index - 1);doc.addPage(page);}doc.save(targetFile);document.close();doc.close();}

代码解析:
splitPdf:splitPdf的作用在于将一个pdf以pageStep为步长,按照没pageStep页拆分一个PDF的规则将整个PDF文件全部拆出。
splitPdfWithPageIndex:splitPdfWithPageIndex的作用在于将一个PDF文件从pageIndex位置开始,选totalPages页数据,生成一个新的PDF文件。

2.PDF切分

将PDF中某一部分内容拆分出来,这一部分的处理思路是先将PDF文件转换成图片,然后采用截图的方式将需要的内容截取出来生成新的图片,然后再将这个图片转换成PDF文件。
PDF转换图片的部分在java使用pdfbox将PDF转化为图片这一篇中有描述,感兴趣的可以去看看

代码如下(示例):

    public static BufferedImage splitPdfWithImage(PDDocument document, Integer page) throws IOException {PDFRenderer renderer = new PDFRenderer(document);BufferedImage bufferedImage = renderer.renderImage(page - 1, 5);return bufferedImage;}public static void cutPdfWithImage(PDDocument document, CutInfoEntity cutInfo) throws IOException {File file = new File(cutInfo.getOutFile());cutPdfWithImage(document, cutInfo.getPage(), cutInfo.getReceiptCount(), cutInfo.getCutRange().getStart(), cutInfo.getCutRange().getEnd(), file);}public static void cutPdfWithImage(PDDocument document, Integer page, Integer receiptCount, Integer start, Integer end, String outFile) throws IOException {File file = new File(outFile);cutPdfWithImage(document, page, receiptCount, start, end, file);}/*** @Description //TODO 纵向切分,切分内容为宽为PDF文件宽度,高为制动高度的矩形区域* @Date 2022/3/4 16:35* @Param [document 要切分的PDF文件*           page表示要切分的内容在第几页*           receiptCount 本工具哟用于拆分银行回单,一页可能有多张回单,这个参数表示一页PDF有多少张。主要用于计算切分后的内容转换成A4大小的PDF时的高度。*             start 从x轴哪个位置开始切分*          end 切到那个位置*             outFile 输出文件* @return void**/public static void cutPdfWithImage(PDDocument document, Integer page, Integer receiptCount, Integer start, Integer end, File outFile) throws IOException {BufferedImage image = splitPdfWithImage(document, page);int subWidth = image.getWidth();int subHeight = end - start;image = image.getSubimage(0, start, subWidth, subHeight);PDDocument outDocument = new PDDocument();PDImageXObject imageXObject = LosslessFactory.createFromImage(outDocument, image);PDPage pdPage = new PDPage(PDRectangle.A4);PDPage documentPage = document.getPage(page - 1);PDResources resources = documentPage.getResources();Iterable<COSName> fontNames = resources.getFontNames();for (COSName cosName : fontNames) {PDFont font = resources.getFont(cosName);PDResources pdResources = pdPage.getResources();if (pdResources == null) {pdResources = new PDResources();pdPage.setResources(pdResources);}pdPage.getResources().put(cosName, font);}outDocument.addPage(pdPage);PDPageContentStream pageContentStream = new PDPageContentStream(outDocument, pdPage);float height = pdPage.getMediaBox().getHeight() / receiptCount;float y = pdPage.getMediaBox().getHeight() - height;pageContentStream.drawImage(imageXObject, 0, y, pdPage.getMediaBox().getWidth(), height);pageContentStream.close();if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}outDocument.save(outFile);outDocument.close();}

java使用pdfbox拆分PDF文件相关推荐

  1. Java使用 PDFBox创建 PDF 文件并将文本写入其中

    在本 PDFBox 教程中,我们将了解如何使用 PDFBox 2.0 创建 PDF 文件并将文本写入其中.我们将在此过程中逐步了解. 以下是使用 PDFBox 2.0 创建文本并将其写入 PDF 文件 ...

  2. Java使用PDFBox操作PDF文件

    1首先,导入jar (maven方式导入) PS: 这个jar里面囊括了所有的pdfbox操作工具类,导入这一个就够了 <dependency><groupId>org.apa ...

  3. Java使用PDFBOX操作pdf文件(一,加载和创建pdf)

    前言: 之前想学习使用Java操作pdf的时候看过了IText的文档.确实IText的文档很全,也有一个官网可以很方便的查找信息.但IText的开源协议为AGPL,使用者必须传染性的开源代码,商业使用 ...

  4. java调用pdfbox转pdf文件为图片文件,有中文时在windows上正常,部署到linux下乱码

    最近遇到了一个很头疼的问题,我们的项目移动端需要一个读pdf的功能,但是手机端开发人员说移动端是用jquerymobile做的,不能直接甩pdf文件过去(原因是pdf文件太大),于是乎我们想到了2个解 ...

  5. java 用PDFBox 删除 PDF文件中的一页 ,空白页啥的,此处删除最后一页为例 spring boot

    依赖: <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app&l ...

  6. java中pdfbox处理pdf常用方法(读取、写入、合并、拆分、写文字、写图片)

    本篇文档将介绍pdfbox处理pdf常用方法(读取.写入.合并.拆分.写文字.写图片). 图中为pdfbox用到的包 1.读取pdf 方法代码: /*** 读取pdf中文字信息(全部)* @param ...

  7. 使用pdfbox将PDF文件一页拆分为两页

    使用pdfbox将PDF文件一页拆分为两页,自测是可以正常拆分的. 代码如下: import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.p ...

  8. java pdfbox 提取pdf 标题_java – 使用pdfbox从PDF文件中提取文本

    我试图使用pdfbox从PDF文件中提取文本,但不是作为命令行工具,而是在我的 Java应用程序中.我正在使用jsoup下载pdf. res = Jsoup .connect(host+action) ...

  9. 代码示例:使用Java以编程方式拆分PDF文件

    有时需要将一个PDF拆分为多个PDF文件时,可能会有多种情况.例如,可能必须分割包含发票/收据的PDF的每一页,并将它们另存为单独的文件.另一方面,可能要从PDF文件中拆分页面的特定集合.为了解决上述 ...

  10. 使用 Apache PDFBox 操作PDF文件

    简介 Apache PDFBox库是一个用于处理PDF文档的开源Java工具.该项目允许创建新的PDF文档,操作现有PDF文档,并从PDF文档中提取内容.Apache PDFBox还包括几个命令行实用 ...

最新文章

  1. Boost:重复计数器测试程序
  2. What's going on in background?
  3. Can not load “libqxcb.so”
  4. XML DOM Object Model in .NET [3/3] - Samples
  5. UHDTV(超高清电视) 的帧率规格:120fps
  6. 环保工位机重装系统需要备份的文件
  7. 搭建nginx代理,为前端页面跨域调用接口
  8. Linux设置node的process.env.NODE_ENV
  9. 实用主义学python爬虫_麻瓜编程 实用主义学Python2018
  10. 如何为水晶报表rpt文件添加数据连接
  11. 更改文件夹目录、硬盘、U盘的图标
  12. Geospatial-地理空间
  13. 针对Android设备的开源手机银行木马BankBot / Mazain分析
  14. 基于C++的社交应用的数据存储与实现
  15. 马尔科夫随机场Markov Random Field
  16. C语言——报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  17. 第4代计算机的应用,在第四代计算机期间内计算机的应用逐步进入到().docx
  18. PS CC 2018 图层
  19. Adobe Lightroom Classic 入门教程(七)修改照片 --- 暗角颗粒与相机配置校正
  20. Linux——vim/vi文本编辑器

热门文章

  1. 全景图拍摄设备有哪些?全景图拍摄方法
  2. 利用百度api接口制作在线语音合成软件
  3. 超全面Figma,Pixso和Sketch工具盘点
  4. python程序设计实用教程答案_Python程序设计实用教程
  5. Matlab闪退打不开解决方法
  6. gc方法写法_Unity3D研究院之字符串拼接0GC(一百零四)
  7. java显示系统当前时间_Java获取系统当前时间
  8. python中temp是什么意思_.temp(temp是什么意思?)
  9. 算法提高 7-2求arccos值
  10. 1194. 锦标赛优胜者