我需要将目录从最后一页移动到第三页。我曾经通过删除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页已经刷新。
答案 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,关闭原始文档并覆盖它。这样,您就不必处理正在创建的多个文件。