gpt4 book ai didi

java - PDFBox 在指定页码处分成 3 个(以插入 pdf)

转载 作者:行者123 更新时间:2023-12-01 10:14:48 50 4
gpt4 key购买 nike

我已阅读帖子 How to split a PDF using Apache PDFBox?How to merge two PDF files into one in Java?但是,它仅演示了如何在每个页面上将其拆分或拆分为相等的 block ,并且 addSource() 的合并 api 似乎只有 FileStringInputStream 不是 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();

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

最佳答案

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

I would like to insert a one page pdf file into 3 places of a larger pdf file (say 100 pages) at specified pages numbers, e.g. pages 3, 7 and 10.

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

So, I need to split the larger document at page 3, 7, 10, then insert the one page pdf doc, and then merge all the splits parts together in a new pdf file.

此外,我假设您仍在使用 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 个文档页面,您不能简单地将其添加到 Pages 根的位置 n-1 处,而是必须检查它的 child 一个接一个,如果有一个内部 PDPageNode 对象,您必须读取它的 Count 值来检查它包含的页面数量;如果此数字意味着要插入的位置包含在其中,则必须递归到该内部 PDPageNode 对象。

关于java - PDFBox 在指定页码处分成 3 个(以插入 pdf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35964628/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com