c# - C# itext - 在将其写入新 PDF 时,我如何知道它是否进入了下一页?
问题描述
我正在尝试使用iText7 library创建 PDF 文档。我将有一个标题,然后继续添加新的文本行。但是在添加新行文本时,当它到达页面末尾并且新行必须转到下一页时,我想添加另一个标题(不同的标题)。当我不断添加这行文本时,我怎么知道新行会进入下一页?
例如,我的代码如下所示:
static void Main(string[] args)
{
// Must have write permissions to the path folder
PdfWriter writer = new PdfWriter("C:\\test\\demo.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// Header
Paragraph header = new Paragraph("HEADER")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(20);
// New line
Paragraph newline = new Paragraph(new Text("\n"));
document.Add(newline);
document.Add(header);
// Add sub-header
Paragraph subheader = new Paragraph("SUB HEADER")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(15);
document.Add(subheader);
// Line separator
LineSeparator ls = new LineSeparator(new SolidLine());
document.Add(ls);
// Add paragraphs - HOW DO I KNOW THE NEW Pharagraph WILL BE ON THE NEXT PAGE?
for (int i = 0; i < 200; i++)
{
Paragraph paragraph1 = new Paragraph("Lorem ipsum " +
"dolor sit amet, consectetur adipiscing elit, " +
"sed do eiusmod tempor incididunt ut labore " +
"et dolore magna aliqua.");
document.Add(paragraph1);
}
}
非常感谢您提前提供的帮助。
解决方案
您可以通过以下两种方式执行此操作:
- 添加所有段落,此时您就知道有多少页,并且可以向这些页面添加其他内容,包括标题。
- 添加 END_PAGE 事件处理程序。像这样的东西:
private void TestPdfHeader()
{
string fileName = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\test.pdf";
PdfWriter pdfWriter = new PdfWriter(fileName);
PdfDocument pdf = new PdfDocument(pdfWriter);
Document doc = new Document(pdf);
var font = PdfFontFactory.CreateFont(StandardFonts.COURIER);
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));
for (int i = 0; i < 100; i++)
{
Paragraph p = new Paragraph("test test test");
p.SetFont(font);
doc.Add(p);
}
doc.Close();
}
private class TextFooterEventHandler : IEventHandler
{
Document doc;
PdfFont headerFont = null;
public TextFooterEventHandler(Document doc)
{
this.doc = doc;
this.headerFont = PdfFontFactory.CreateFont(StandardFonts.HELVETICA_OBLIQUE);
}
public void HandleEvent(Event currentEvent)
{
PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
int numPages = docEvent.GetDocument().GetNumberOfPages();
// This event is fired after the next page has been added.
// In this case we want to skip header on page 1.
// Thus, we start adding headers when the 3rd page has been added.
if (numPages < 3) return;
string pageHeader = "This is page header";
iText.Kernel.Geom.Rectangle pageSize = docEvent.GetPage().GetPageSize();
float coordX = pageSize.GetLeft() + doc.GetLeftMargin() + 50;
float headerY = pageSize.GetTop() - doc.GetTopMargin() + 10;
Canvas c = new Canvas(docEvent.GetPage(), pageSize);
c.SetFont(headerFont);
c.ShowTextAligned(pageHeader, coordX, headerY, TextAlignment.CENTER);
c.Close();
}
}
推荐阅读
- reactjs - 使用 react-material-ui 关闭全屏对话框后,OnClick 侦听器不起作用
- python - 如何使用 request 和 bs4 模块而不使用 Virustotal 的 PublicAPI 在 Virustotal 上获得文件哈希的声誉?
- javascript - 从 gapi 调用 grantOfflineAccess 方法时,Google OAuth 始终显示同意屏幕
- r - 如何通过 shinyheatmaply 部署交互式热图
- python - 使用月份日期时间合并多个数据框
- c# - 使用 Ingress 提供的证书在 Kubernetes 中提供 HTTPS 的 ASP.net Core OData
- dialogflow-es - 在将请求发送到完整端点之前在 js 中编辑请求
- angular - 使用 onclick 菜单项在 ngb-tab 中显示我的组件
- javascript - 如何访问和使用 redux-form 上子组件的值以使复选框工作并启用有条件渲染的额外选项
- docker - 向外部用户打开 docker daemon 命令错误