iText7.1 movePage导致错误:无法在部分刷新的文档中移动页面

时间:2018-07-26 23:52:12

标签: itext7

我需要将目录从最后一页移动到第三页。我曾经通过删除iText7.0,将PdfPage设置为与removePage返回的值相等,然后将页面添加到所需的位置来对它进行处理。但是,似乎iText 7.1对此进行了更改,并且removePage现在返回void。我不能只使用movePage,因为它说它不能在部分刷新的文档中移动页面。

有效的iText7.0代码(“目录”页面是最后一页):

PdfPage page = pdf.removePage(pdf.getNumberOfPages());
pdf.addPage(3, page)

使用iText7.1时,removePage不会返回已删除的页面,所以我这样做:

PdfPage page = pdf.getPage(pdf.getNumberOfPages()); 
pdf.movePage(page, 3)

我也尝试过

pdf.movePage(pdf.getNumberOfPages(), 3)

无论哪种方式,我都会收到相同的错误消息:

  

com.itextpdf.kernel.PdfException:无法在部分刷新的文档中移动页面。第1页已经刷新。

1 个答案:

答案 0 :(得分:3)

使用iText 7.1.2并使用下面的代码,我可以使它工作:

public static void manipulatePdf(String src, String dest) throws Exception {
    PdfDocument pdfDocument = new PdfDocument(new PdfReader(src), new PdfWriter(dest));

    PdfPage page = pdfDocument.getPage(pdfDocument.getNumberOfPages());
    pdfDocument.movePage(page, 1);

    pdfDocument.close();
}

您还可以执行以下操作:

public static void manipulatePdf(String src, String dest) throws Exception {
    PdfDocument srcDoc = new PdfDocument(new PdfReader(src));
    PdfDocument resultDoc = new PdfDocument(new PdfWriter(dest));
    resultDoc.initializeOutlines();
    List<Integer> pages = new ArrayList<>();

    int lastPage = srcDoc.getNumberOfPages();

    pages.add(lastPage);
    for (int i = 1; i <=lastPage-1; i++){
        pages.add(i);
    }

    srcDoc.copyPagesTo(pages, resultDoc);
    resultDoc.close();
    srcDoc.close();
}

在这里创建新的PDF文档,然后按照需要在页面上进行复制。 您可以将最后一个代码示例更改为更通用,但总体思路保持不变。 根据您的用例,您还可以将更改后的PDF文件保存到OutputStream,关闭原始文档并覆盖它。这样,您就不必处理正在创建的多个文件。