java - 如何重新排列 PDF 文件的页面?

标签 java pdf itext

我正在生成目录,我想在开头移动目录。 假设我的 PDF 中有 16 页,目录从第 13 页开始到第 15 页结束。 我想将 TOC 移动到第二页,以便第一页保留为第 1 页,最后一页保留为第 16 页。 这段代码没有给我我想要的:

public void changePagesOrder()  {
    try {
         PdfReader sourcePDFReader = new PdfReader(RESULT1);    
         int n = sourcePDFReader.getNumberOfPages();
         System.out.println("no of pages in pdf files..."+n);
         int totalNoPages=n;
         int tocStartsPage=13;

         sourcePDFReader.selectPages(String.format("%d-%d, 2-%d", tocStartsPage, totalNoPages-1, tocStartsPage -2));
         PdfStamper stamper = new PdfStamper(sourcePDFReader, new FileOutputStream(RESULT2));
         stamper.close();   

         System.out.println("pdf changes are done.....");
    }
    catch(Exception ex) {
    }
}

请提出一些解决方案。

最佳答案

你的公式是错误的。你有:

sourcePDFReader.selectPages(String.format("%d-%d, 2-%d", tocStartsPage, totalNoPages-1, tocStartsPage -2);

但这会将您的目录放在第 1 页。根据您的描述,这不是您想要的。

你想要这样的东西:

PdfReader reader = new PdfReader(baos.toByteArray());
int startToc = 13;
int n = reader.getNumberOfPages();
reader.selectPages(String.format("1,%s-%s, 2-%s, %s", startToc, n-1, startToc - 1, n));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();

此代码已使用 ReorderPage 进行测试例如,一个 16 页的 PDF,内容为 Page 1, Page 2, ..., Page 16。结果是以下 PDF:(reordered.pdf)[ http://itextpdf.com/sites/default/files/reordered.pdf]

页面现在的顺序是:第 1 页、第 13 页、第 14 页、第 15 页、第 2 页、第 3 页、第 4 页、第 5 页、第 6 页、第 7 页、第 8 页、第 9 页、第 10 页、第 11 页、第 12 页、第 16 页。这是您在问题中描述的顺序。

更新:

在评论中,您询问了 String.format() 在这种情况下是如何工作的。

让我们先看看我们想要实现什么。我们的页面顺序如下:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

我们想像这样重新排序它们:

1, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16

这意味着我们需要这种模式:

1, 13-15, 2-12, 16

这是一个硬编码模式,其中两个变量很重要:

  • TOC 的开始:第 13 页(startToc)
  • 最后一页:16 (n)

从这些变量中,我们推导出另外两个变量:

  • 目录的最后一页。这是最后一页减去一页,即 16 - 1 = 15 (n - 1)
  • TOC 之前的最后一页:13 - 1 = 12 (startToc - 1)

我们现在可以像这样重写模式:

1, startToc-(n - 1), 2-(startToc - 1), n

我们需要将其设为 String,因此我们使用 String.format():

String.format("1,%s-%s, 2-%s, %s", startToc, n-1, startToc - 1, n)

第一次出现的 %s 被替换为 String 之后的第一个参数,第二次出现的 %s 被替换为String 之后的第二个参数,依此类推...

如果 startToc = 13n = 16,结果是:

1, 13-15, 2-12, 16

关于java - 如何重新排列 PDF 文件的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30911216/

相关文章:

java - 表格的绝对位置用什么度量单位表示?我可以用厘米来表达这个位置吗?

php - 如何仅使用 php 将 .docx/.doc 文件转换为 .pdf

android - iText 尝试创建 PDF 文件时出现问题

c# - 在 iText 7 .NET/C# 中为 PDF 创建图像表单域

java - JPA 从 XML 文件访问常量

java - Jenkins 和 Tomcat 7 - 已部署应用程序,但上下文无法启动

java - 作为电子邮件附件发送的 PDF 文件已损坏 (java)

java - 带有 Itext 的背景图案

java - 为什么将我的代码拆分到不同的类时会出现堆栈溢出错误?

java - 使用ajax加载弹出窗口