首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDFBox按指定页码拆分为3(插入pdf)

PDFBox按指定页码拆分为3(插入pdf)
EN

Stack Overflow用户
提问于 2016-03-12 23:33:01
回答 1查看 1.5K关注 0票数 0

然而,我读过如何使用Apache PDFBox拆分PDF?如何在Java中将两个PDF文件合并成一个文件?的文章,它只演示了如何在每个页面或将其分割为相等的块,addSource()的合并apis似乎只有文件、字符串、InputStream和而不是 PDDocument。

我想将一个一页pdf文件插入到指定页码的较大pdf文件(例如100页)的三个位置,例如第3、7和10页。因此,我需要在第3、7、10页拆分较大的文档,然后插入一页pdf文档,然后将所有拆分部分合并到一个新的pdf文件中。

我所做的工作如下:

代码语言:javascript
复制
        PDDocument doc;
        PDDocument onePage;
        Splitter splitDoc = new Splitter();
        PDFMergerUtility mergedDoc = new PDFMergerUtility();

        onePage = PDDocument.load("/path/onepage.pdf");
        doc = PDDocument.load("/path/hundredpages.pdf");
        splitDoc.setSplitAtPage(1); // inefficient
        // is there a better solution for split?
        List<PDDocument> splitDocs = splitDoc.split(doc);

        for (int i=0; i<splitDocs.size(); i++) {

            if (i==2 || i==7 || i==10) { // only to demonstrate

                mergeFiles.addSource(onePage); // see comment below

            } else {

                // doesn't accept PDDocument 
                // what's the alternative without resorting to InputStream
                mergeFiles.addSource(splitDocs.remove(0)); 

            }


        }

        mergedDoc.setDestinationFileName("/path/mergeddoc.pdf");
        mergedDoc.mergeDocuments();

我哪里出问题了,还是有更好的办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-15 15:59:58

这个答案是关于你真正想要达到的目标。

我想插入一个一页pdf文件到三个地方较大的pdf文件(例如100页)在指定的页码,例如第3,7和10页。

而不是你认为你必须为此做的事,即

因此,我需要在第3,7,10页拆分较大的文档,然后插入一页pdf文档,然后将所有拆分部分合并到一个新的pdf文件中。

此外,我假设您仍然使用的是PDFBox版本1.8.x,而不是2.0.0版本的候选版本。

要将页面插入文档(由PDDocument实例表示),实际上不需要拆分和重新合并该文档,只需在给定的索引处添加页面即可。因此,我们可以简化方法。

同时,您的任务中有一个细节再次使其复杂化:您不能多次将相同的页对象插入同一个目标文档中,至少必须创建它的浅表副本。

考虑到这一点,您可以将一个一页pdf文件插入到一个较大pdf的三个位置。

代码语言:javascript
复制
PDDocument document = ...;
PDDocument singlePageDocument = ...;
PDPage singlePage = (PDPage) singlePageDocument.getDocumentCatalog().getAllPages().get(0);

PDPageNode rootPages = document.getDocumentCatalog().getPages();
rootPages.getKids().add(3-1, singlePage);
singlePage.setParent(rootPages);
singlePage = new PDPage(new COSDictionary(singlePage.getCOSDictionary()));
rootPages.getKids().add(7-1, singlePage);
singlePage = new PDPage(new COSDictionary(singlePage.getCOSDictionary()));
rootPages.getKids().add(10-1, singlePage);
rootPages.updateCount();

document.save(...);

(https://github.com/mkl-public/testarea-pdfbox1/blob/master/src/test/java/mkl/testarea/pdfbox1/merge/InsertPages.java testInsertPages__)

不过,Beware,,这段代码假设是一个平面页面树。如果页面树较深,则必须以不同的方式遍历页面列表:要将页面插入为第n页文档页,不能简单地将其添加到 pages 根目录中,而是必须逐个检查其子节点,如果沿着内部的PDPageNode对象,则必须读取其Count值以检查其包含的页数;如果这个数字意味着要插入的位置包含在其中,则必须恢复到该内部PDPageNode对象中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35964628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档