首页 > 解决方案 > 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);

         }
}

非常感谢您提前提供的帮助。

标签: c#pdfitext

解决方案


您可以通过以下两种方式执行此操作:

  1. 添加所有段落,此时您就知道有多少页,并且可以向这些页面添加其他内容,包括标题。
  2. 添加 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();
    }
}

推荐阅读