• MVC 生成PDf表格并插入图片


    最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片。对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种。

    iTextSharp组件

    使用方法。

    1,引入itextsharp.dll

    2,  引入命名空间

    using iTextSharp;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
            Document document = new Document(); 
    string filepath = "/Upload/Pdf/"; Directory.CreateDirectory(HttpContext.Current.Server.MapPath(filepath));
    PdfWriter.GetInstance(document, new FileStream(HttpContext.Current.Server.MapPath(filepath + model.ExamNo + ".pdf"), FileMode.Create));

         document.Open();
    BaseFont bftitle = BaseFont.CreateFont(@"C:\WindowsFontsSIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Font fonttitle = new Font(bftitle, 20, Font.UNDERLINE); BaseFont bf1 = BaseFont.CreateFont(@"C:\WindowsFontsSIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Font font1 = new Font(bf1, 12); Font fonttitle10 = new Font(bf1, 12); Font fonttitle12 = new Font(bf1, 11); PdfPCell cellmode = new PdfPCell();
      //因为显示照片部分显示5列,而后续部分显示四列,所以创建两个table PdfPTable table = new PdfPTable(4); PdfPTable tablerow = new PdfPTable(5);

     不一步一步赘述了,将详细代码奉上。

     public void CreatePersonInfo(RBS.Models.UserConfirmModel model)
            {
                Document document = new Document();
                string filepath = "/Upload/Pdf/";
                Directory.CreateDirectory(HttpContext.Current.Server.MapPath(filepath));
                PdfWriter.GetInstance(document, new FileStream(HttpContext.Current.Server.MapPath(filepath + model.ExamNo + ".pdf"), FileMode.Create));
                document.Open();
                BaseFont bftitle = BaseFont.CreateFont(@"C:\WindowsFontsSIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                Font fonttitle = new Font(bftitle, 20, Font.UNDERLINE);
                BaseFont bf1 = BaseFont.CreateFont(@"C:\WindowsFontsSIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                Font font1 = new Font(bf1, 12);
                Font fonttitle10 = new Font(bf1, 12);
                Font fonttitle12 = new Font(bf1, 11);
                PdfPCell cellmode = new PdfPCell();
                PdfPTable table = new PdfPTable(4);
                PdfPTable tablerow = new PdfPTable(5);
                float padding = 0f;
                #region 个人信息
    //这种写法感觉很像silverlight,一个萝卜一个坑,习惯了html的感觉这样很不适应 CreateCell(5, 5, 1, "个人信息", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "考生面试编号", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.ExamNo, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "姓名", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Name, fonttitle10, "left", tablerow); CreateCell(model.UserId.ToString(), model.Ext, 0, 1, padding, padding, tablerow); CreateCell(1, 5, 1, "性别", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Sex == RBS.Models.Gender.Male ? "男" : "女", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "出生日期", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.BirthDate.ToString("yyyy-MM-dd"), fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "身份证号码", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.IdentificationNo, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "户口所在地", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Country, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "出生地", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.State, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "婚姻状况", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.IsMarrage == RBS.Models.Marriage.Naught ? "未婚" : "已婚", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "联系地址", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Address, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "邮政编码", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Postcode, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "联系电话", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Telephone, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "手机", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Mobile, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "邮箱", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, model.Email, fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "", fonttitle10, "left", tablerow); CreateCell(1, 5, 1, "", fonttitle10, "left", tablerow); #endregion #region 教育经历 CreateCell(4, 5, 1, "教育经历", fonttitle10, "left", table); CreateCell(4, 5, 1, "教育经历1", fonttitle10, "left", table); CreateCell(1, 5, 1, "入学时间", fonttitle10, "left", table); CreateCell(1, 5, 1, model.EduBegin != null ? Convert.ToDateTime(model.EduBegin).ToString("yyyy-MM-dd") : "", fonttitle10, "left", table); CreateCell(1, 5, 1, "毕业时间", fonttitle10, "left", table); CreateCell(1, 5, 1, model.EduEnd != null ? Convert.ToDateTime(model.EduEnd).ToString("yyyy-MM-dd") : "", fonttitle10, "left", table); CreateCell(1, 5, 1, "学校名称", fonttitle10, "left", table); CreateCell(1, 5, 1, model.Graduated, fonttitle10, "left", table); CreateCell(1, 5, 1, "专业", fonttitle10, "left", table); CreateCell(1, 5, 1, model.Specialty, fonttitle10, "left", table); CreateCell(1, 5, 1, "学历", fonttitle10, "left", table); CreateCell(1, 5, 1, model.EduBackground, fonttitle10, "left", table); CreateCell(1, 5, 1, "学位", fonttitle10, "left", table); CreateCell(1, 5, 1, model.Degree, fonttitle10, "left", table); #endregion document.Add(tablerow); document.Add(table); document.Close(); }
        private void CreateCell(int Colspan, bool Border, string Content, Font font, string alignment, PdfPTable table)
            {
                if (Border)
                    CreateCell(Colspan, 0, 1, Content, font, alignment, table);
                else
                    CreateCell(Colspan, 0, Content, font, alignment, table);
            }
            ///
            /// 生成单元格
            ///
            /// 合并列数
            /// 间距
            /// 内容
            /// 字体
            /// 对齐方式
            /// 此单元格填充的表
            private void CreateCell(int Colspan, int Padding, string Content, Font font, string alignment, PdfPTable table)
            {
                CreateCell(Colspan, Padding, 0, Content, font, alignment, table);
            }
            ///
            /// 生成单元格
            ///
            /// 合并列数
            /// 间距
            /// 边框线
            /// 内容
            /// 字体
            /// 对齐方式
            /// 此单元格填充的表
            private void CreateCell(int Colspan, int Padding, int Border, string Content, Font font, string alignment, PdfPTable table)
            {
                CreateCell(Colspan, Padding, Border, 0, 0, Content, font, alignment, table);
            }
    
    
            private void CreateCell(int Colspan, int Rowspan, int Padding, int Border, string Content, Font font, string alignment, PdfPTable table)
            {
                CreateCell(Colspan, Rowspan, Padding, Border, 0, 0, Content, font, alignment, table);
            }
    
            ///
            /// 生成单元格
            ///
            /// 合并列数
            /// 间距
            /// 边框线
            /// 水平对齐方式
            /// 垂直对齐方式
            /// 内容
            /// 字体
            /// 对齐方式
            /// 此单元格填充的表
            private void CreateCell(int Colspan, int Padding, int Border, int HorizontalAlignment, int VerticalAlignment, string Content, Font font, string alignment, PdfPTable table)
            {
                PdfPCell cell = new PdfPCell();
                cell.Colspan = Colspan;
                cell.Padding = Padding;
                if (HorizontalAlignment > 0)
                    cell.HorizontalAlignment = HorizontalAlignment;
                if (VerticalAlignment > 0)
                    cell.VerticalAlignment = VerticalAlignment;
                if (Border == 0)
                    cell.Border = Border;
                Paragraph table_t = new Paragraph(Content, font);
                table_t.SetAlignment(alignment);
                cell.AddElement(table_t);
                table.AddCell(cell);
            }
            private void CreateCell(int Colspan, int Rowspan, int Padding, int Border, int HorizontalAlignment, int VerticalAlignment, string Content, Font font, string alignment, PdfPTable table)
            {
                PdfPCell cell = new PdfPCell();
                cell.Colspan = Colspan;
                cell.Rowspan = Rowspan;
                cell.Padding = Padding;
                if (HorizontalAlignment > 0)
                    cell.HorizontalAlignment = HorizontalAlignment;
                if (VerticalAlignment > 0)
                    cell.VerticalAlignment = VerticalAlignment;
                if (Border == 0)
                    cell.Border = Border;
                Paragraph table_t = new Paragraph(Content, font);
                table_t.SetAlignment(alignment);
                cell.AddElement(table_t);
                table.AddCell(cell);
            }
    
          #region 向表格中插入照片,如果向表格中插入照片,这是关键的重载
            /// <param name="imgName">照片名称</param>
            /// <param name="imgExt">照片后缀</param>
            /// <param name="align"></param>
            /// <param name="colSpan"></param>
            /// <param name="padTop"></param>
            /// <param name="padBottom"></param>
            /// <param name="table"></param>
            public void CreateCell(string imgName, string imgExt, int align, int colSpan, float padTop, float padBottom, PdfPTable table)
            {
                PdfPCell cell = new PdfPCell();
                Paragraph ph = new Paragraph();
                string url = HttpContext.Current.Server.MapPath("~/Upload/Images/" + imgName + imgExt + "");
                Image jpg = Image.GetInstance(new Uri(url));
    
            //设置照片的宽度和高度
                jpg.ScaleAbsolute(80, 130);
                Chunk ck = new Chunk(jpg, 4, -4); //图片可设置 偏移
                ph.SetAlignment("right");
                ph.Add(ck);
    
                cell.AddElement(ph);
                if (padTop > 0) { cell.PaddingTop = padTop; }
                if (padBottom > 0) { cell.PaddingBottom = padBottom; }
                if (colSpan > 0) { cell.Colspan = colSpan; }
    
      //因为表格插入图片部分需要跨行,为了美观,跨7行,这里需要注意的是,设置几行必须跨几行,否则图片不会显示,当我刚跨2行准备看下效果的时候,pdf照片位置显示空文本框,没有照片,当跨行跟设置的所对应时照片显示出来。
                cell.Rowspan = 7;
                //cell.Border = 0; 设置表格线
                cell.HorizontalAlignment = align;
                table.AddCell(cell);
            } 
            #endregion
    

      

     附上下载方法

     public static  void DownLoad(string path)
            {
                try
                {
                    HttpContext.Current.Response.Charset = "UTF-8";
                    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                    HttpContext.Current.Response.HeaderEncoding = Encoding.UTF8;
                    HttpContext.Current.Response.AppendHeader("Content-disposition",
                                                  "attachment; filename=" +
                                                  HttpUtility.UrlEncode(Path.GetFileName(path), Encoding.UTF8));
                    HttpContext.Current.Response.WriteFile(path);
                }
                catch (Exception ex)
                {
                    HttpContext.Current.Response.Write("下载文件出错,原因:" + ex.Message);
                }
                finally
                {
                    HttpContext.Current.Response.End();
                }
            }
    

      下载itextpdf.dll

  • 相关阅读:
    4个python常用高阶函数的使用方法
    Python基础教程:input()输入与数据类型转换
    vue.js 使用 fastclick解决移动端click事件300毫秒延迟方法
    react组件通信
    深入了解react中 this.setState方法
    Ant Design Mobile 报Cannot find module 'react-scripts/package.json' 错误
    vue-router的两种模式的区别
    Vue项目优化指南
    React开发常用设计模式-组件样式
    axios发送post请求,提交表单数据
  • 原文地址:https://www.cnblogs.com/zlzly/p/3732542.html
Copyright © 2020-2023  润新知