我最后生成目录,我想在开始时移动目录。假设我的PDF中有16页,并且TOC从第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);
但这会将您的目录放在第一页。根据您的描述,这不是您想要的。
您想要这样的东西:
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]
Page 1
Page 2
Page 16
页面现在按此顺序排列:第1页,第13页,第14页,第15页,第2页,第3页,第4页,第5页,第6页,第7页,第8页,第9页,第10页,第11页第12页,第16页。这是您在问题中描述的顺序。
更新:
在一条评论中,您正在询问String.format()在这种情况下如何工作。
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
这是一种硬编码模式,其中两个变量很重要:
startToc
n
从这些变量中,我们可以得出另外两个变量:
n - 1
startToc - 1
我们现在可以这样重写模式:
1, startToc-(n - 1), 2-(startToc - 1), n
我们需要将其设置为String,这就是为什么我们使用String.format():
String
String.format("1,%s-%s, 2-%s, %s", startToc, n-1, startToc - 1, n)
的第一次出现%s由后面的第一个参数替换String,第二次出现%s由后面的第二个参数替换String,依此类推…
%s
如果startToc = 13和n = 16,则结果为:
startToc = 13
n = 16