美文网首页
iTextSharp 生成pdf时自动生成页眉页脚

iTextSharp 生成pdf时自动生成页眉页脚

作者: ONEDAYLOG | 来源:发表于2020-05-01 21:46 被阅读0次

    用iTextSharp生成pdf的时候往往需要添加页眉页脚,本人开始使用手动生成页眉页脚。也就是在每次document.NewPage();前进行document.Add(**)进行插入需要的页眉页脚。具体如下

    iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(directoryName + "/Nymoi Logo.jpg");
    instance.ScaleToFit(80f, 20f);
    
    iTextSharp.text.Paragraph element = new iTextSharp.text.Paragraph("www.nymoi.com", font10) { Alignment = 2 };
    document.Add(instance);
    document.Add(element);
    

    这样就手动添加了,但是当页面的内容超出当页范围的时候,会自动创建一页,这个时候就无法手动添加页眉页脚。所以需要通过pdf模板来实现该功能

    新建一个HeaderAndFooterEvent的cs文件必须继承PdfPageEventHelper, IPdfPageEvent接口

    namespace NymoiAnalyzer.UI
    {
        public class HeaderAndFooterEvent : PdfPageEventHelper, IPdfPageEvent
        {
            public static PdfTemplate tpl = null; //模版
            public static bool PAGE_NUMBER = false; //为True时就生成 页眉和页脚
    
            iTextSharp.text.Font font = BaseFontAndSize("msyh",8, Font.NORMAL, BaseColor.GRAY);
    
            iTextSharp.text.Font font8 = BaseFontAndSize("msyh",8, Font.BOLD, BaseColor.GRAY);
            iTextSharp.text.Font font8Blk = BaseFontAndSize("msyh", 8, Font.NORMAL, BaseColor.BLACK);
    
            iTextSharp.text.Font font16 = BaseFontAndSize("begok", 16, Font.BOLD, BaseColor.BLACK);
    
    
            //重写 关闭一个页面时
            public override void OnEndPage(PdfWriter writer, Document document)
            {
                if (PAGE_NUMBER)
                {
                    Phrase header1 = new Phrase("NYMOI", font16);
                    Phrase header2 = new Phrase("www.nymoi.com", font8Blk);
    
                    Phrase footer1 = new Phrase("NYMOI Analyzer 4.0 ", font);
                    Phrase footer2 = new Phrase("PAGE " + writer.PageNumber, font);
                    PdfContentByte cb = writer.DirectContent;
    
                    //模版 显示总共页数
                    cb.AddTemplate(tpl, document.Right - 54 + document.LeftMargin, document.Bottom - 8); //调节模版显示的位置
    
                    //页眉显示的位置
                    ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, header1, 30 + document.LeftMargin, document.Top+10, 0);
                    ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, header2, document.Right - 45 + document.LeftMargin, document.Top+10, 0);
    
                    //页脚显示的位置
                    ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, footer1, 30 + document.LeftMargin, document.Bottom, 0);
                    ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, footer2, document.Right - 60 + document.LeftMargin, document.Bottom , 0);
                    
                }
            }
    
            //重写 打开一个新页面时
            public override void OnStartPage(PdfWriter writer, Document document)
            {
                if (PAGE_NUMBER)
                {
                    writer.PageCount = writer.PageNumber - 1;
                }
            }
            //关闭PDF文档时发生该事件
            public override void OnCloseDocument(PdfWriter writer, Document document)
            {
                BaseFont bf = BaseFont.CreateFont(Path.GetDirectoryName(Application.ExecutablePath) + "\\Fonts\\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                tpl.BeginText();
                //tpl.SetFontAndSize(bf, 16); //生成的模版的字体、颜色
                //tpl.ShowText((writer.PageNumber - 2).ToString()); //模版显示的内容
                tpl.EndText();
                tpl.ClosePath();
            }
            //定义字体 颜色
            public static Font BaseFontAndSize(string fontName, Int32 size, int style, BaseColor baseColor)
            {
                BaseFont baseFont = null;
    
                Font font = null;
                string file_name = "";
                int fontStyle;
    
                if (fontName == "msyh")
                {
                    baseFont = BaseFont.CreateFont(Path.GetDirectoryName(Application.ExecutablePath) + "\\Fonts\\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                }else if(fontName == "begok")
                {
                    baseFont = BaseFont.CreateFont(Path.GetDirectoryName(Application.ExecutablePath) + "\\Fonts\\Begok regular.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    
                }
                
    
                if (style < -1)
                {
                    fontStyle = Font.NORMAL;
                }
                else
                {
                    fontStyle = style;
                }
                font = new Font(baseFont, size, fontStyle, baseColor);
                return font;
            }
    
            //定义输出文本
            public static Paragraph InsertTitleContent(string text)
            {
    
                iTextSharp.text.Font font = BaseFontAndSize( "msyh",16, Font.BOLD, BaseColor.BLACK);
    
                //BaseFont bfSun = BaseFont.CreateFont(@"c:\windows\fonts\STZHONGS.TTF", BaseFont.IDENTITY_H, false); //调用的字体
                //Font font = new Font(bfSun, 15);
    
                Paragraph paragraph = new Paragraph(text, font); //新建一行
                paragraph.Alignment = Element.ALIGN_CENTER; //居中
                paragraph.SpacingBefore = 5;
                paragraph.SpacingAfter = 5;
                paragraph.SetLeading(1, 2); //每行间的间隔
                return paragraph;
            }
        }
    }
    

    在新建pdf并打开的时候插入如下代码:

    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfFilePath, FileMode.Create));
    writer.PageEvent = new HeaderAndFooterEvent();
    HeaderAndFooterEvent.PAGE_NUMBER = true;//不实现页眉跟页脚
    HeaderAndFooterEvent.tpl = writer.DirectContent.CreateTemplate(100, 100); //模版的宽度和高度
    PdfContentByte cb = writer.DirectContent;
    cb.AddTemplate(HeaderAndFooterEvent.tpl, 266, 714);//调节模版显示的位置
    

    这样就可以了,但是在页眉页脚中无法使用图片,希望哪位实现了,告诉我一下。

    原来的站点停运,整合到简书
    2016年4月13日

    相关文章

      网友评论

          本文标题:iTextSharp 生成pdf时自动生成页眉页脚

          本文链接:https://www.haomeiwen.com/subject/xgjcghtx.html