使用pdfbox在pdf中间插入新页面

时间:2013-12-02 08:55:27

标签: java pdf pdfbox

我正在使用PDFbox下载PDF。我想在中间添加一些新页面。

PDPage page = new PDPage();
pdoc.addPage(page);

此代码将新页面插入PDF的末尾。 如何在其他位置插入页面?

3 个答案:

答案 0 :(得分:3)

使用PDF-Box创建PDF时的结果

doc.getDocumentCatalog().getPages().getKids();

是一个单一的列表。它包含序列中的所有页面。

PDPageNode
|- Page1
|- Page2
|- Page3

如果PDF不是用PDF-Box创建的,则可能不是这样,而是所有页面的PDPageNode都可以在树形结构中布局

PDPageNode
|-Page1
|-PDPageNode
|  |- Page2
|  |- Page3
|- Page4

在这种情况下,其他答案中提到的示例代码将不起作用。相反,您可以使用以下

public void addPage(PDDocument doc, final int index, final PDRectangle size) {
    // Use the normal method if the page comes after all other pages
    if (index >= doc.getNumberOfPages())
        doc.addPage(new PDPage(size));
    else {
        final PDPage page = new PDPage(size);

        // Find the existing page that is currently at the index
        // the new page will be
        final PDPage nextPage = (PDPage) doc.getDocumentCatalog().getAllPages().get(index);

        // Get the node the current page is stored in
        PDPageNode pageNode = nextPage.getParent();

        // Set the appropriate node as the new pages parent
        page.setParent(pageNode);

        // Insert the new page in the node at the index of the current page is stored
        // this shifts all pages in the node forward
        pageNode.getKids().add(pageNode.getKids().indexOf(nextPage), page);

        // Update the current node and all parent nodes
        while (pageNode != null) {
            pageNode.updateCount();
            pageNode = pageNode.getParent();
        }
    }
}

答案 1 :(得分:1)

也许这会有所帮助: Apache PDFBox: Move the last page to first Page

您似乎无法直接插入页面,因此您必须重新排列列表。

您也可以尝试

PDDocument doc = PDDocument.load( file );
// Open this pdf to edit. 
PDPage page = new PDPage(); 
PDPageNode rootPages = doc.getDocumentCatalog().getPages();
rootPages.getKids().add(100, page ); 
//Write some text page.setParent( rootPages ); 
rootPages.updateCount(); 
doc.save( file );
doc.close();

但这似乎只适用于pdfbox创建的pdf。

答案 2 :(得分:0)

您可以使用以下方法将页面添加到另一个页面之前:

PDPageTree pages = document.getDocumentCatalog().getPages();
pages.insertBefore(page, pages.get(0));  //0 - index of the page before that you wish to add your new page

或在另一页之后显示:

PDPageTree pages = document.getDocumentCatalog().getPages();
pages.insertAfter(page, pages.get(0));  //0 index of the page after that you wish to add your new page

通过PDFBox v2.0.21测试