如何将元素插入到 iText7 中特定页面的底部?

How can I insert an element to the bottom of a specific page in iText7?

我正在探索 .NET PDF 库的不同选项。我的一个要求是在第一页的底部放置一个框,如果任何内容到达框,它应该溢出到下一页。

例如:

如上所示,第 7 段通常会占用一些 space 被“保留”区域占用的空间。相反,本应占用 space 的部分移到了下一页。

该图像是使用 Gembox.Document 实现的,方法是将框添加为仅在首页呈现的页脚元素。但是,在 iText7 中,我看到的添加页脚 () 的示例将内容作为浮动元素放置在现有内容之上,并且不会影响其余内容的 layout/flow文档。

我还尝试在没有 canvas 的 PageEnd 事件处理程序上添加一个段落(下面的代码段),但没有将其添加到指定页面,而是添加到整个文档的末尾。

public void HandleEvent(Event evt)
{
    var docEvent = (PdfDocumentEvent)evt;
    var page = docEvent.GetPage();
    int pageNum = docEvent.GetDocument().GetPageNumber(page);

    if (pageNum == 1)
    {
        doc.Add(new Paragraph("Testing a thing"));
    }
}

我正在寻找可以使用 iText7 复制的效果类型吗?

如您所说,您正在探索不同的 .NET PDF 库。所以我会建议 PDFFlow library,这正是您所需要的。 如果您有页脚,主文档流将占据页面的其余部分,并自动在下一页继续,而不覆盖页脚。

DocumentBuilder.New()
    .AddSection()
        .AddParagraph("long text")
    .ToSection()
        .AddFooterToBothPages(40)
            .AddParagraph("this a footer set for each page of this section")
.ToDocument()
    .Build("result.pdf");

这是一个教程,其中包含使用页眉、页脚和 left/right 重复区域的代码示例:AddingRepeatingArea tutorial

希望这对您有所帮助:)

我相信你可以结合https://github.com/itext/i7ns-samples/blob/develop/itext/itext.samples/itext/samples/sandbox/acroforms/AddExtraTable.cs and https://github.com/itext/i7ns-samples/blob/develop/itext/itext.samples/itext/samples/sandbox/events/TextFooter.cs的概念来实现你所需要的。

思路如下:

  • 通过使 iText 减少第一页的文档渲染器 space 来为您的框保留位置
  • 借助 iText 的结束页面事件填写此框

中建议了另一个选项:您可以临时调用 Document#setBottomMargin ,因为通过 Document#add 添加的元素不会放置在边距上。然后,在第一页布局完成后,您可以再次设置初始页边距。但是,此选项需要了解您的布局流程,因为只有在第一页内容布局后才应设置页边距。

再提一个建议:虽然事件功能比较灵活好用,但好像动不动就用大锤子砸。您需要调用 Canvas#ShowTextAligned,这可以在没有任何事件处理的情况下完成。所以理想情况下,我更愿意执行以下操作:

  • 通过 DocumentRenderer
  • 的扩展处理页面布局区域
  • 调用Canvas#ShowTextAligned填写保留框。