You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iText 7(C#)添加段落作为页眉的代码修正求助

搞定iText7 PageEventHandler添加页眉的问题

嘿,我看了你的代码,里面有几个关键误区导致页眉加不上,我逐个给你理清楚,然后给你完整的可运行代码:

第一个问题:多余的Header变量

你写的protected internal PdfNumber Header = PrintPdf.PORTRAIT;完全是没用的,这段代码和添加页眉半毛钱关系都没有,直接删掉就行——我们不需要用这个变量来控制页面旋转或者页眉内容。

第二个问题:错误的页眉添加方式

docEvent.GetPage().Put(...)是用来操作PDF页面底层字典属性的,根本不能直接用来添加Paragraph这种布局元素。要在页面上画文本段落,得用Canvas对象,这是iText7专门用来把布局元素渲染到PDF页面的工具。

第三个问题:错误的DisplayDocTitle调用

docEvent.GetPage().Put(PdfName.DisplayDocTitle, this.Header)是用来设置PDF的文档标题显示属性的,和页眉一点关系都没有,我们得把这段代码换成用Canvas绘制第二个页眉段落的逻辑。


完整修正后的代码

protected internal class PageEventHandler : IEventHandler
{
    // 把字体提前初始化,避免每次处理事件都重复加载,提升性能
    private readonly PdfFont _headerFont;

    public PageEventHandler()
    {
        // 注意:iText7的字体API和iTextSharp不一样,这里已经修正
        _headerFont = PdfFontFactory.CreateFont(@"D:\Inetpub\wwwroot\Prog\Font\David.TTF", 
            PdfEncodings.IDENTITY_H, 
            PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED);
    }

    public virtual void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();

        // 创建Canvas,指定页眉的区域:页面顶部,高度60(可以根据自己的需求调整)
        Rectangle headerArea = new Rectangle(pageSize.GetLeft(), pageSize.GetTop() - 60, pageSize.GetWidth(), 60);
        using (Canvas canvas = new Canvas(page, headerArea))
        {
            // 第一个页眉段落
            string strFirstHeader = "ךוניחה דרשמ";
            Paragraph pargraphFirstHeader = new Paragraph(strFirstHeader)
                .SetTextAlignment(TextAlignment.CENTER)
                .SetFont(_headerFont)
                .SetBold()
                .SetFontSize(14)
                .SetFontColor(ColorConstants.BLUE)
                .SetBaseDirection(BaseDirection.RIGHT_TO_LEFT);

            canvas.Add(pargraphFirstHeader);

            // 第二个页眉段落,加了点上边距让排版更舒服
            string strsecondHeader = "עדימ תוכרעמו היגולונכט בושקית להנימ\nינוכית לע יגולונכט ךוניח חוקיפ";
            Paragraph pargraphsecondHeader = new Paragraph(strsecondHeader)
                .SetTextAlignment(TextAlignment.CENTER)
                .SetFont(_headerFont)
                .SetBold()
                .SetFontSize(12)
                .SetFontColor(ColorConstants.BLUE)
                .SetBaseDirection(BaseDirection.RIGHT_TO_LEFT)
                .SetBorderBottom(new SolidBorder(ColorConstants.BLUE, 2))
                .SetMarginTop(5);

            canvas.Add(pargraphsecondHeader);
        }
    }
}

几个重要的修正点

  1. API混用问题:你原来的代码混了iTextSharp和iText7的API(比如iTextSharp.text.pdf.BaseFont.IDENTITY_H),iText7里对应的是PdfEncodings.IDENTITY_H和PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED,我已经帮你修正了。
  2. Canvas的正确使用:通过Canvas指定页眉的区域,我们可以直接把Paragraph添加进去,它会自动帮你把内容渲染到页面的指定位置。
  3. 资源优化:把字体初始化放到构造函数里,避免每次处理页面事件都重新加载字体文件,速度会快很多。
  4. 排版优化:给第二个段落加了SetMarginTop(5),让两个页眉段落之间有一点间距,看起来更舒服。

最后,别忘了在你的PDF生成代码里注册这个事件处理器:

using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter("你的输出文件路径.pdf")))
{
    // 注册页面事件处理器
    pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new PageEventHandler());
    
    // 这里继续添加你的文档内容,比如创建Document对象并添加元素
    using (Document doc = new Document(pdfDoc))
    {
        doc.Add(new Paragraph("你的正文内容"));
        // ...其他内容
    }
}

内容的提问来源于stack exchange,提问作者Avi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:18:13