然而,我读过如何使用Apache PDFBox拆分PDF?和如何在Java中将两个PDF文件合并成一个文件?的文章,它只演示了如何在每个页面或将其分割为相等的块,addSource()的合并apis似乎只有文件、字符串、InputStream和而不是 PDDocument。
我想将一个一页pdf文件插入到指定页码的较大pdf文件(例如100页)的三个位置,例如第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();我哪里出问题了,还是有更好的办法?
发布于 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的三个位置。
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对象中。
https://stackoverflow.com/questions/35964628
复制相似问题