【发布时间】:2015-03-23 00:51:31
【问题描述】:
使用 iTextSharp,当 PdfWriter 已经在编写页面时,如何在页面开头插入新页面?假设索引页应该是文档的第一页,但在编写整个文档之前您不会知道它的内容。特别是,每个部分/章节写在哪个页面上。
【问题讨论】:
标签: itextsharp
使用 iTextSharp,当 PdfWriter 已经在编写页面时,如何在页面开头插入新页面?假设索引页应该是文档的第一页,但在编写整个文档之前您不会知道它的内容。特别是,每个部分/章节写在哪个页面上。
【问题讨论】:
标签: itextsharp
您在创建文档时无法返回到第一页,但有不同的方法可以解决您的问题。
如果您不希望有很多页面,您可以考虑在iText in Action - Second Edition 的第 5 章中解释的解决方案,更具体地说是在 MovieHistory1.java 示例中。
在此示例中,我们在关闭文档之前重新排序页面:
// step 1
Document document = new Document();
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(RESULT));
// IMPORTANT: set linear page mode!
writer.setLinearPageMode();
// step 3
document.open();
// step 4
// Add all your content
// Create a new order for the pages
int total = writer.reorderPages(null);
// change the order
int[] order = new int[total];
for (int i = 0; i < total; i++) {
order[i] = i + toc;
if (order[i] > total)
order[i] -= total;
}
// apply the new order
writer.reorderPages(order);
// step 5
document.close();
为什么我只建议对页数有限的文档使用此方法?为了使这个功能起作用,我们需要创建一个线性页面树:
writer.setLinearPageMode();
线性页面树并不是真正的树(它是没有任何分支的树)并且在 PDF 中不是最优的。
最好再重新排序页面。这在The Best iText Questions on StackOverflow(免费电子书)中捆绑的两个问题中进行了解释。
问题是:
我知道拥有关于 SO 的冗余信息并不理想,但这是您需要的代码:
PdfReader reader = new PdfReader(baos.toByteArray());
int n = reader.getNumberOfPages();
reader.selectPages(String.format("%d, 1-%d", n, n-1));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename));
stamper.close();
【讨论】:
writer.CurrentPageNumber,请务必减一,因为页码从 1 开始计数,但重新排序索引从 0 开始计数。