如何将元素插入到 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
填写保留框。
我正在探索 .NET PDF 库的不同选项。我的一个要求是在第一页的底部放置一个框,如果任何内容到达框,它应该溢出到下一页。
例如:
如上所示,第 7 段通常会占用一些 space 被“保留”区域占用的空间。相反,本应占用 space 的部分移到了下一页。
该图像是使用 Gembox.Document 实现的,方法是将框添加为仅在首页呈现的页脚元素。但是,在 iText7 中,我看到的添加页脚 (
我还尝试在没有 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
填写保留框。