java利用pdfbox+poi往pdf插入数据

 更新时间:2022年02月23日 12:30:02   作者:fhadmin  
这篇文章主要给大家介绍了关于java利用pdfbox+poi如何往pdf插入数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

指定页码插入/替换

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开始。

总结

到此这篇关于java利用pdfbox+poi往pdf插入数据的文章就介绍到这了,更多相关java往pdf插入数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis实现MySQL批量插入的示例代码

    MyBatis实现MySQL批量插入的示例代码

    本文主要介绍了MyBatis实现MySQL批量插入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java写入zip文件后无法进行删除的问题及解决

    java写入zip文件后无法进行删除的问题及解决

    这篇文章主要介绍了java写入zip文件后无法进行删除的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • java实现合并图片的方法示例

    java实现合并图片的方法示例

    这篇文章主要介绍了java实现合并图片的方法,结合具体实例形式分析了java基于图片的读取、设置、生成等操作实现图片合并功能的相关实现技巧,需要的朋友可以参考下
    2017-02-02
  • Jmeter后置处理器实现过程及方法应用

    Jmeter后置处理器实现过程及方法应用

    这篇文章主要介绍了Jmeter后置处理器实现过程及方法应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring整合Quartz分布式调度的示例代码

    Spring整合Quartz分布式调度的示例代码

    本篇文章主要介绍了Spring整合Quartz分布式调度的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Mybatis之类型处理器TypeHandler的作用与自定义方式

    Mybatis之类型处理器TypeHandler的作用与自定义方式

    这篇文章主要介绍了Mybatis之类型处理器TypeHandler的作用与自定义方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot 自定义starter yaml提示失效问题及解决方法

    SpringBoot 自定义starter yaml提示失效问题及解决方法

    在自定义starter后,必不可少会有properties配置参数需要指定,而在有时又不知道为什么出现这个问题,这篇文章主要介绍了SpringBoot 自定义starter yaml提示失效问题,需要的朋友可以参考下
    2022-12-12
  • Java项目常见工具类详解

    Java项目常见工具类详解

    这篇文章主要为大家总结了平时在Java项目中使用的工具类:JWT工具类、MD5工具类、视频点播工具类、公共常量工具类、日期操作工具类、Http客户端工具类和获取IP工具类。需要的可以参考一下
    2021-12-12
  • java操作excel导入导出的3种方式

    java操作excel导入导出的3种方式

    项目需要,要实现一个导入导出excel的功能,于是任务驱动着我学习到了POI、easypoi和easyexcel这3个java操作Excel的工具,下面这篇文章主要给大家介绍了关于java操作excel导入导出的3种方式,需要的朋友可以参考下
    2023-05-05
  • SpringBoot如何进行业务校验实例详解

    SpringBoot如何进行业务校验实例详解

    这篇文章主要给大家介绍了关于SpringBoot如何进行业务校验的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01

最新评论