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); } } }
几个重要的修正点
- API混用问题:你原来的代码混了iTextSharp和iText7的API(比如
iTextSharp.text.pdf.BaseFont.IDENTITY_H),iText7里对应的是PdfEncodings.IDENTITY_H和PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED,我已经帮你修正了。 - Canvas的正确使用:通过Canvas指定页眉的区域,我们可以直接把Paragraph添加进去,它会自动帮你把内容渲染到页面的指定位置。
- 资源优化:把字体初始化放到构造函数里,避免每次处理页面事件都重新加载字体文件,速度会快很多。
- 排版优化:给第二个段落加了
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
相关产品推荐
相关产品推荐

