当前位置: 首页 > 知识库问答 >
问题:

PDFBox按指定页码拆分为3个(插入pdf格式)

斜高翰
2023-03-14

我读过如何使用Apache PDFbox拆分PDF的帖子?以及如何在Java中将两个PDF文件合并为一个?但是,它只演示了如何在每个页面上拆分它或将其拆分为相等的卡盘,addSource()的合并API似乎只有File、String和InputStream,而不是PDDocument。

我想插入一个一页的pdf文件到一个较大的pdf文件的3个地方(比方说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();

我错在哪里,还是有更好的办法?

共有1个答案

殷学
2023-03-14

这个答案是关于你实际想要达到的目标,即。

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

而不是你认为你必须为此做什么,即。

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

但是,请注意,这段代码假设是一个扁平的页面树。在更深的页面树的情况下,必须以不同的方式遍历页面列表:要插入一个页面作为第N个文档页面,您不能简单地将其添加到页面根的位置n-1处,而是必须逐个检查其子页面,并且如果出现内部的PDPageNode对象,您必须读取其count值以检查其包含的页面数;如果这个数字意味着要插入的位置包含在内部,则必须递归到内部的pdpageNode对象中。

 类似资料:
  • 我有pdf文件。需要将它们导入系统并按页面分割。单独的页面=单独的文件。 我尝试使用FPDF和FPDI: 有些文件工作良好,但有些文件我得到了错误: 致命错误:未捕获异常“setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException”,消息为“此PDF文档已加密,无法使用Fpdi处理” 据我所知,这个文件是加密的(但我可以毫无问题地打

  • 在java Web应用程序中使用PDFBox。我有一个代表多页绘图或蓝图的PDF文件。还有其他PDF文件表示对父文件的修改。我想将这些页面插入到第1页和第2页之间的父PDF文件中。 我找到了关于合并和添加页面的文章,但不完全是我需要的。 一些指导会很有帮助。 到目前为止我的代码:

  • 问题内容: 我正在使用Apache PDFBox处理Java应用程序中的PDF文件。我想在每个页面上分割一个PDF文档。 是否有可能做到这一点Apache PDFBox?如果是这样,怎么办? 问题答案: 可以使用来实现。 这是一个示例代码,它将在每个页面上拆分文档: 您可以使用来控制每个拆分的PDF的页数。

  • 我需要根据发票编号拆分pdf。例如发票号D0000003011,所有pdf页面应合并为单个pdf,依此类推。我怎样才能做到。..

  • 我正在使用PDFbox下载PDF。我想在中间添加一些新页面。 此代码在PDF结尾处插入新页面。如何在另一个位置插入页面?

  • 在我的项目中,我按书签拆分了一个pdf文件。应该创建一个新的pdf文件,其中包含拆分的页面和一些新的书签。 这将导致以下异常: 线程“main”java.io.ioException中的异常:COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了? 如果删除行,则新的pdf包含拆分的页面(没有例外),但显然不包含书签。我想我尝试添加书签的方式有问题。 我的代码: Stack