java 往 pdf 插入数据 (pdfbox+poi)

简介: java 往 pdf 插入数据 (pdfbox+poi)

指定页码插入/替换

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,然后合并就完事了。

1.pom
<!--pdfbox-->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.25</version>
</dependency>
<dependency>
    <groupId>net.sf.cssbox</groupId>
    <artifactId>pdf2dom</artifactId>
    <version>2.0.1</version>
</dependency>
<!--poi-->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.15</version>
</dependency>
2.实现方法
/**from fhadmin.cn
 * 指定页码插入页
 * @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<PDDocument> Pages = splitter.split(pdf1);
    Iterator<PDDocument> 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<i;j++){
        String tempFile = tempPath+"/"+ j +".pdf";
        System.out.println("开始合并:"+tempFile);
        PDFmerger.addSource(tempFile);
    }
    //合并文档
    PDFmerger.mergeDocuments();
    System.out.println("文档合并完成");
    pdf1.close();
    pdf2.close();
}
3.测试
//from fhadmin.cn
@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开始。

目录
相关文章
|
26天前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
131 3
|
2月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
88 16
|
6月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
93 0
|
4月前
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
100 4
|
10月前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
481 3
|
5月前
|
安全 BI
AiPy实战:批量解析 PDF 漏洞报告,今日高风险数据一键归档
作为安全合规部门的效率神器,AiPy工具让处理200+份PDF漏洞报告变得简单高效。只需三步:批量导入文件、精准提取高风险漏洞数据(如编号、名称、类型等),并生成无重复的Excel报表,极大减少手动操作与错误。示例中,从指定目录提取含“高”字样的漏洞信息,并按要求保存为以日期命名的Excel文件,确保数据唯一且完整。相比传统手动方式,AiPy不仅提升工作效率,还留出更多时间专注安全策略优化与技术研究,助你成为团队核心骨干!
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
7月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现

热门文章

最新文章