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

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

常翰
2023-03-14

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

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

此代码在PDF结尾处插入新页面。如何在另一个位置插入页面?

共有3个答案

邓鸿彩
2023-03-14

您可以在另一个页面之前添加您的页面:

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

宇文弘懿
2023-03-14

也许这会有帮助:Apache PDFBox:将最后一页移到第一页

似乎你不能直接插入页面,所以你必须重新排列列表。

你也可以试试

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。

景信瑞
2023-03-14

当使用PDF-Box创建PDF时

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

这是一个简单的列表。它按顺序包含所有页面。

PDPageNode
|- Page1
|- Page2
|- Page3

如果PDF不是用PDF框创建的,那么这可能不是真的,而是所有页面的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();
        }
    }
}
 类似资料:
  • 我正在尝试创建一个简单的pdf多页文档中的字段。为此,我有一个模板pdf,在代码中,我根据需要多次克隆这个模板,以便创建文档本身。 问题是在其中插入一些数据。我尝试插入到文档中的数据类型不应该在不同的页面中改变。相反,它在所有页面中保持静态,就像“pages”数字表示文档中包含的页面数。 现在,在我的模板pdf中,我有一些文本字段,例如,“shipper1”和“pages”。我希望能够将我的数据插

  • 我试过以下方法。它似乎使每个页面后面的空白页的方向和大小是源PDF页面的方向和大小,但源PDF页面的方向和大小似乎是前一个空白页的方向和大小:

  • 我想删除PDF中每个页面的底部部分,但不改变页面大小,什么是推荐的方式在PDFBOX中的java中做到这一点?如何删除页脚从PDF中的每个页面? 是否有可能使用PDRectgle删除其中的所有文本/图像? 我所尝试的片段,使用setCropBox矩形似乎失去页面大小,也许cropBox不打算这样做? 在pdfbox cookbook示例中,我能找到的最接近的例子是如何删除整个页面,但这不是我想要的

  • 问题内容: 如何使用PDFBox从PDF文档中读取特定页面(具有页码)? 问题答案: 这应该工作: 如本教程的“ 书签”部分中所示 更新2015年,版本2.0.0快照 似乎已将其删除并放回(?)。 getPage 在2.0.0 javadoc中。要使用它: 该 getAllPages 方法已更名 GETPAGES

  • 问题内容: 我正在尝试使用具有以下代码的iText 7创建PDF文档,并且生成时,我的PDF文档内容在同一页面中重叠(即,在第1页中)。 我看到了 document.newPage(); iText 7中缺少该方法。如何在itext 7中不使用pdfDocumet.copyPages(…)或PDFmerger将页面添加到我的PDF文档中。 问题答案: 在iText 7中,该方法已成为区域中断的特殊