java操作pdf(pdfbox+poi)你想要的这里都有

说两句废话

本来我只是想把我的一个pdf文件,多余的地方删除掉,再把个别页面的内容改下(多余内容干掉~),然后打印出来,我想要的这些wps还有很多软件都有,但是…

java操作pdf(pdfbox+poi)你想要的这里都有

参考文献

https://www.baeldung.com/pdf-conversions-java

https://iowiki.com/pdfbox/pdfbox_merging_multiple_pdf_documents.html

基本功能就不多说了,看上面两个链接(创建、删除、拆分、合并等)

指定页码插入/替换

pdfbox好像没有专门提供这个方法,但是现有的方法多重组合起来也能实现这个功能,

需求:一个pdf文件A有10页,现在想在第6页插入一页新的pdf文件B,插入完成后整个pdf文件A变成11页。

思路1(插入):

先将这个10的pdf拆分成10个1页的pdf,按顺序放好,文件名分别是:1.pdf、2.pdf….10.pdf。再拆分到第6页的时候将文件B放进来,重命名问6.pdf,原本pdf文件A里面的第6页重命名为7.pdf,依次后推,最后的得到的1.pdf—–>11.pdf一共11个文件

然后使合并功能将这个11个pdf按顺序合并。

思路2(替换):

在插入的基础上,拆分的时候将pdf文件A里面的第6个页丢弃,使用新的页面来代替它命名6.pdf,然后合并就完事了。

pom依赖

<dependency>
    <groupId>org.apache.pdfboxgroupId>
    <artifactId>pdfbox-toolsartifactId>
    <version>2.0.25version>
dependency>
<dependency>
    <groupId>net.sf.cssboxgroupId>
    <artifactId>pdf2domartifactId>
    <version>2.0.1version>
dependency>

<dependency>
    <groupId>com.itextpdfgroupId>
    <artifactId>itextpdfartifactId>
    <version>5.5.10version>
dependency>
<dependency>
    <groupId>com.itextpdf.toolgroupId>
    <artifactId>xmlworkerartifactId>
    <version>5.5.10version>
dependency>
<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poi-ooxmlartifactId>
    <version>3.15version>
dependency>
<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poi-scratchpadartifactId>
    <version>3.15version>
dependency>

实现方法

/**
 * 指定页码插入页
 * @param filename1  源pdf路径
 * @param filename2  需要插入的pdf路径
 * @param number     插入的页码
 * @param newfilename   全新pdf的路径
 * @throws Exception
 */
public void insertPage(String filename1,String filename2,int number,String newfilename,String tempPath) throws Exception {
    PDDocument pdf1 = PDDocument.load(new File(filename1));
    PDDocument pdf2 = PDDocument.load(new File(filename2));

    //1、将第一个pdf按页码全部拆开
    Splitter splitter = new Splitter();
    List Pages = splitter.split(pdf1);

    Iterator iterator = Pages.listIterator();

    PDFMergerUtility PDFmerger = new PDFMergerUtility();

    int i = 1;
    while(iterator.hasNext()) {
        if(i==number){
            System.out.println("当前插入页码:"+number);
            pdf2.save(tempPath+"/"+ i +".pdf");
            i++;
        }
        PDDocument pd = iterator.next();
        String tempFile = tempPath+"/"+ i +".pdf";
        System.out.println("开始拆分:"+tempFile);
        pd.save(tempFile);
        i++;
    }

    //2、开始重组
    PDFmerger.setDestinationFileName(newfilename);

    //上面的i最后多加了一次,这里不取等
    for(int j=1;j){
        String tempFile = tempPath+"/"+ j +".pdf";
        System.out.println("开始合并:"+tempFile);
        PDFmerger.addSource(tempFile);
    }

    //合并文档
    PDFmerger.mergeDocuments();
    System.out.println("文档合并完成");

    pdf1.close();
    pdf2.close();
}

测试

@Test
void insertPage() throws Exception {
    PdfUtils pdfUtils = new PdfUtils();
    String filename1 = "F:\\Users\\admin\\Desktop\\A.pdf";
    String filename2 = "F:\\Users\\admin\\Desktop\\B.pdf";
    String newfilename = "F:\\Users\\admin\\Desktop\\newA.pdf";
    String tempPath = "F:\\Users\\admin\\Desktop\\temp";
    int insertNum = 32;

    pdfUtils.insertPage(filename1,filename2,insertNum,newfilename,tempPath);
}

啰嗦几句

1、我将要修改的页面先拆分出来了,比如这里的第6页,然后(我这个整页都是图片)将内容修改后,合并进来发现尺码不对,是的,你没有听错就是尺码不对,当我修改后的pdf在放进来合并的时候,这一页它变小了~,原来是我在将图片另存为pdf,或者使用打印另存为pdf的时候,纸张大小就那么几类(A4/A3等),那我就不干了啊,丑里吧唧的。

2、这个时候就用pdfbox的图片插入功能:将图片写入原来的6.pdf这一页里面来,你要问我为啥?因为原来的6.pdf尺码是对的,其中画图的时候开始位置x,y都从0开始。

总结一下

pdfbox基本上我能想到的pdf操作几乎都能实现,简单、易用、好上手、白嫖。又剩下几块钱….

java操作pdf(pdfbox+poi)你想要的这里都有

Original: https://www.cnblogs.com/unruly/p/15919506.html
Author: 福尔摩狼
Title: java操作pdf(pdfbox+poi)你想要的这里都有

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579634/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 官方文档中文版!Spring Cloud Stream 快速入门

    本文内容翻译自官方文档,spring-cloud-stream docs,对 Spring Cloud Stream的应用入门介绍。 一、Spring Cloud Stream 简…

    Java 2023年5月30日
    0119
  • Java开发学习(十)—-基于注解开发定义bean

    一、环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies> &#xA0; &#xA0;&…

    Java 2023年5月29日
    074
  • Netty源码分析之ByteBuf(一)—ByteBuf中API及类型概述

    ByteBuf是Netty中主要的数据容器与操作工具,也是Netty内存管理优化的具体实现,本章我们先从整体上对ByteBuf进行一个概述; AbstractByteBuf是整个B…

    Java 2023年6月9日
    083
  • [PostgreSql]生产级别数据库安装要考虑哪些问题?

    大家好,我是字母哥(coder)! 我让公司的小伙伴写一个生产级别的PostgreSQL的安装文档,结果他和我说:”不是用一个命令就能安装好么?还用写文档么?&#822…

    Java 2023年6月15日
    079
  • Spring Boot缓存应用实践

    缓存是最直接有效提升系统性能的手段之一。个人认为用好用对缓存是优秀程序员的必备基本素质。 本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统。 一、…

    Java 2023年5月30日
    084
  • 碎碎念五九

    04.01 我曾有一台华硕 F8P,是本科毕业时哥哥给我买的。虽然有点笨重,却陪我度过了近十年。它陪我度过读研三年(学习技术基础和师兄们做项目)、找到第一份不错的工作及在阿里云度过…

    Java 2023年6月9日
    092
  • Java动态脚本Groovy读取配置文件

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 核心涉及: @Value:作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值…

    Java 2023年6月5日
    085
  • 使用Android自带文件选择器

    工具类: public class UriTofilePath { public static String getFilePathByUri(Context context, U…

    Java 2023年6月7日
    089
  • SQL语句编写顺序与执行顺序

    一、SQL 语句编写顺序 SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc) LIM…

    Java 2023年6月8日
    097
  • “OneNote由于某种原因,无法连接到服务器。请尝试检查您的连接以查看服务器是否可用。”的解决方案

    最近开始新的学习生活,使用OneNote做笔记。作为一个强迫症,无法创建新的笔记的问题让我很是难受。在这里看到了一个解决的方法→解决办法 更改DNS:1.打开控制面板-网络共享中心…

    Java 2023年6月5日
    087
  • 1.18(设计模式)状态模式

    状态模式:当对象状态改变时行为也随之改变,看起来就像是这个类发生了改变。 首先对象有状态,行为由状态决定。 假设现在有一个游戏角色,有正常状态、加速状态、减速状态、眩晕状态。 游戏…

    Java 2023年6月8日
    080
  • Spring依赖注入

    java;gutter:true; /<em> </em>作者:呆萌老师 <em>☑csdn认证讲师 </em>☑51cto高级讲师…

    Java 2023年6月13日
    079
  • SpringMVC的请求和响应

    SpringMVC的请求和响应 1.SpringMVC的数据响应 1.1 SpringMVC的数据响应方式 页面跳转 直接返回字符串 通过ModelAndView对象返回 回写数据…

    Java 2023年6月5日
    082
  • 类与对象(一)

    类和对象之间的关系 类是对象的设计图,对象是类的实体 类是对象的模板,对象是类的实例 设计的基本步骤 发现类,根据对象去发现类 找出属性(名词),根据对象的共同属性 找出行为(动词…

    Java 2023年6月6日
    0102
  • Spring定时任务的实现

    出处:http://cnblogs.com/daishuguang Original: https://www.cnblogs.com/daishuguang/p/5210159….

    Java 2023年5月30日
    080
  • linux常用命令

    linux开放指定端口命令 1、开启防火墙 systemctl start firewalld查看防火墙状态systemctl status firewalld2、开放指定端口fi…

    Java 2023年6月16日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球