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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,030评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,310评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,951评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,796评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,566评论 6 407
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,055评论 1 322
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,142评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,303评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,799评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,683评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,899评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,409评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,135评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,520评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,757评论 1 282
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,528评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,844评论 2 372

推荐阅读更多精彩内容