iTextSharp在开头插入一个页面

时间:2015-03-23 00:51:32

标签: itextsharp

使用iTextSharp,当PdfWriter已经写入页面时,如何在页面开头插入新页面?假设索引页面的情况应该是文档的第一页,但在您编写整个文档之前,您不会知道其内容。特别是,每个部分/章节写在哪个页面上。

1 个答案:

答案 0 :(得分:2)

在您创建文档时,您无法返回第一页,但有多种方法可以解决您的问题。

如果您不希望有多个页面,可以考虑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();