【问题标题】:How to create Header in PDF generation using C# iText7如何使用 C# iText7 在 PDF 生成中创建页眉
【发布时间】:2019-03-22 03:28:21
【问题描述】:

我尝试使用 .NET C# 中的 iText 包在我的 PDF 的所有页面中添加页眉,但它不起作用。

注意:我使用的是 iText 版本 7

我尝试了以下 Stack Overflow 答案,它们仅针对页脚(即 END_PAGE)演示,而不针对 START_PAGE

我的代码

class Program {
    static void Main(string[] args) {

        var writer = new PdfWriter("E:/pdfSample/bala.pdf");
        var pdf = new PdfDocument(writer);
        var document = new Document(pdf,PageSize.A4);
        document.SetMargins(120,40,100,40);

        // Create a PdfFont
        var font = PdfFontFactory.CreateFont(StandardFonts.TIMES_ROMAN);

        List list = new List();

        // Add ListItem objects
        list.Add(new ListItem("Never gonna give you up"))
            .Add(new ListItem("Never gonna let you down"))    
            .Add(new ListItem("Never gonna run around and desert you"))
            .Add(new ListItem("Never gonna make you cry"))
            .Add(new ListItem("Never gonna say goodbye"))
            .Add(new ListItem("Never gonna tell a lie and hurt you"));
        // Add the list
        document.Add(list);

        // Add a Paragraph
        document.Add(new Paragraph("iText is:").SetFont(font));


        document.Add(logo);
        var tree = new Image(ImageDataFactory.CreateJpeg(new Uri("E:/pdfSample/RelatednessTree.jpg")));
        // document.Add(tree);

        pdf.AddEventHandler(PdfDocumentEvent.START_PAGE,new Paragraph("HEADER TEXT"));
        pdf.AddEventHandler(PdfDocumentEvent.END_PAGE,new Paragraph("FOOTER TEXT"));

        document.Close();

    }
}


public class TableFooter : IEventHandler {
    private Paragraph para;

    public TableFooter(Paragraph paraObj) {
        para = paraObj;
    }

    public void HandleEvent(Event @event) {
        PdfDocumentEvent docEvent = @event as PdfDocumentEvent;
        PdfDocument doc = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(),page.GetResources(),doc);

        new Canvas(canvas,doc, new Rectangle(20, -20, page.GetPageSize().GetWidth() - 80,80)).Add(para);
    }
}

请帮助我如何添加 Header(即 START_PAGE)以及在所有 PDF 页面中显示 Header 所需的配置。

【问题讨论】:

  • 您对START_PAGEEND_PAGE 所代表的含义感到困惑。它们不代表内容的位置,而是触发相关IEventHandler 的时间。即 START_PAGE 在新页面启动时触发,END_PAGE 在页面被填满时触发(有一些变化)。此矩形构造函数中的坐标 - Rectangle(20,20,page.GetPageSize().GetWidth() - 80,80) - 确定内容的放置位置,因此将其可视化为页眉或页脚。
  • Sreedharan - 你用@Jon 的评论解决了这个问题吗?他本可以给出答案而不是评论,因为这是解决问题所需的全部知识。

标签: .net itext pdf-generation c#-2.0 itext7


【解决方案1】:

我在代码中创建了两个类,一个用于页眉,一个用于页脚,因此我将这两个元素称为:

pdf.AddEventHandler(PdfDocumentEvent.START_PAGE,new HeaderClass("HEADER TEXT"));
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE,new FooterClass("FOOTER TEXT"));

在标题类的 HandleEvent 中,我更改了这一行:

PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(),page.GetResources(),doc);

用这个:

PdfCanvas canvas = new PdfCanvas(page.NewContentStreamAfter(),page.GetResources(),doc);

保留你编码的结构,但是,显然我改变了画布的页面坐标。

【讨论】:

    【解决方案2】:

    我过去曾使用 PdfEventHandler 通过覆盖这样的方法来做到这一点。

    class PdfEvents : PdfPageEventHelper
        {
    
            public override void OnStartPage(PdfWriter writer, Document document)
            {
    
            }
    
            public override void OnEndPage(PdfWriter writer, Document document)
            {  
    
            }
        }
    

    然后您可以通过获取 pdf 中的确切区域来编写您的内容:

    table.WriteSelectedRows(2, -1, 0, -1, 36, 806, canvas);
    

    【讨论】:

    • 我正在使用 iText7,我们没有接口 PdfPageEventHelper
    猜你喜欢
    • 2021-10-23
    • 2014-12-26
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多