【问题标题】:PDFBox Split into 3 at specified page numbers (to insert pdf)PDFBox 在指定的页码处拆分为 3(插入 pdf)
【发布时间】:2016-06-28 03:20:11
【问题描述】:

我已经阅读了 How to split a PDF using Apache PDFBox?How to merge two PDF files into one in Java? 的帖子,但是,它只演示了如何在每个页面上将其拆分或分成相等的卡盘,并且 addSource() 的合并 api 似乎只有 File em>、StringInputStreamnot PDDocument。

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

我尝试过如下操作:

        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();

我哪里出错了或者有更好的方法吗?

【问题讨论】:

  • 我的回答有帮助还是您还有问题?

标签: java pdfbox


【解决方案1】:

这个答案是关于你真正想要实现的,即

我想将一个单页 pdf 文件插入到指定页码的较大 pdf 文件(例如 100 页)的 3 个位置,例如第 3、7 和 10 页。

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

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

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

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

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

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

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(...);

(InsertPages.java 方法testInsertPages)

注意, 不过,此代码假定为平面页面树。在更深的页面树的情况下,必须以不同的方式遍历页面列表:要将页面作为第 n 个文档页面插入,您不能简单地将其添加到位置 n-1 到 Pages 根目录,而是必须检查它的孩子一个接一个,如果遇到内部PDPageNode 对象,您必须阅读它的Count 值以检查它包含的页数;如果这个数字暗示要插入的位置包含在其中,则必须递归到该内部 PDPageNode 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2016-02-28
    • 2016-02-13
    • 2020-03-04
    • 2011-11-30
    相关资源
    最近更新 更多