【问题标题】:iTextSharp insert a page at the beginningiTextSharp 在开头插入一个页面
【发布时间】:2015-03-23 00:51:31
【问题描述】:

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

【问题讨论】:

    标签: itextsharp


    【解决方案1】:

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

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

    【讨论】:

    • 首先,感谢您帮助我!其次,它几乎起作用了,但我仍然有一个问题:.ReorderPages() 方法正在处理的页面数。实际上,writer.CurrentPageNumber 和 writer.PageNumber 都给了我正确的页数,但是 writer.ReorderPages(null) 它总是给我页数-1,如果我尝试用新的顺序加 1 设置一个 int 数组更多页面(匹配实际页数),writer.reorderPages(order);吹,因为它说数组超过了页数,这是有道理的。
    • 如果您使用writer.CurrentPageNumber,请务必减一,因为页码从 1 开始计数,但重新排序索引从 0 开始计数。
    • 不是这样的。该文档实际上有 24 页,但 writer.ReorderPages(null) 返回 23,因此它需要一个包含 23 个项目的数组。它正确地重新排序,但它把最后一页(第 24 页)留在了最后(原来的位置),因为它忽略了该页面,因为它认为只有 23 个而不是 24 个。
    • 这一直对我有用。我真的认为您很困惑,因为页面从 1 开始计数,而订单从 0 开始计数。无论如何:它在 Java 中完美运行。我不明白为什么它在 C# 中不起作用。只需创建您自己的包含 23 个项目的数组,例如从 23 倒数到 0,仅用于测试。
    • 我没有混淆,这不是索引计数的问题。 pdf 文件有 24 页,writer.ReorderPages(null) 返回 23。因此,它被忽略的最后一页(实际上,我希望在文档开头的那一页)。 C# 端口可能有一个错误,我不知道..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-05-20
    • 2020-09-22
    • 2012-11-07
    相关资源
    最近更新 更多