zoukankan      html  css  js  c++  java
  • iTextSharp生成pdf的一个简单例子

    效果图:

    参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html

             http://www.cnblogs.com/julyluo/p/3839788.html

    itextsharp版本:4.1.6.0

    代码:

      /// <summary>
            /// Compare页面生成pdf功能。
            /// </summary>
            /// <param name="country">国家</param>
            /// <param name="pns">pn</param>
            /// <param name="language">语言</param>
            /// <returns>响应对象</returns>
            public string ComparePdf(string country, string[] pns, string language)
            {
                var result = "";
                //生成pdf
                Document document = new Document();
    
                //这样写:是生成一个文件到某目录中
                //var directory = HttpContext.Current.Server.MapPath("~/pdf");
                //string host = HttpContext.Current.Request.Url.Host;
                //int port = HttpContext.Current.Request.Url.Port;
                //if (!Directory.Exists(directory))
                //{
                //    Directory.CreateDirectory(directory);
                //}
                //var fileName = "";
                //foreach (var item in pns)
                //{
                //    fileName += "_" + item + "_";
                //}
                //fileName = "Compare" + fileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
                //var pdfPath = directory + "\" + fileName;
                //var fileStream = new FileStream(pdfPath, FileMode.Create);
                //PdfWriter pw = PdfWriter.GetInstance(document, fileStream);
    
             //这样写:是生成文件到内存中去
                var memoryStream = new MemoryStream();
                PdfWriter pw = PdfWriter.GetInstance(document, memoryStream);//生成到内存中
    
                //数据
                var list = Compare(country, pns, language);
                document.Open();//打开文件
                //写入数据
                //注册字体
                string fontpath = HttpContext.Current.Server.MapPath("~/App_Data");
                BaseFont customfont = BaseFont.CreateFont(fontpath + "\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
                var baseFont = new Font(customfont, 14 * 0.667f, Font.NORMAL, new Color(68, 68, 68));
                var leftFont = new Font(customfont, 14 * 0.667f, Font.BOLD, new Color(68, 68, 68));
                #region 头部
                PdfPTable tableLogo = new PdfPTable(3);
                tableLogo.DefaultCell.Border = Rectangle.NO_BORDER;
                tableLogo.DefaultCell.MinimumHeight = 40f;
                float[] headWidths = new float[] { 60f, 60f, 150f };
                tableLogo.SetWidths(headWidths);
                //logo
                var logo = iTextSharp.text.Image.GetInstance("http://d1fyvoqprbjuee.cloudfront.net/smartfindimages/logo.png");
                logo.ScaleToFit(130 * 0.667f, 43 * 0.667f);
                var logoCell = new PdfPCell();
                logoCell.PaddingLeft = -1f;
                logoCell.MinimumHeight = 45f;
                logoCell.HorizontalAlignment = Element.ALIGN_LEFT;
                logoCell.Border = 0;
                logoCell.AddElement(logo);
                tableLogo.AddCell(logoCell);
    
                 var headFont = new Font(customfont, 26 * 0.667f, Font.BOLD, new Color(68, 68, 68));
                var sCell = new PdfPCell(new Paragraph("SmartFind", headFont));
                sCell.Border = 0;
                sCell.PaddingLeft = 3f;
                sCell.PaddingBottom = 17f;
                sCell.MinimumHeight = 45f;
                sCell.HorizontalAlignment = Element.ALIGN_LEFT;
                sCell.VerticalAlignment = Element.ALIGN_BOTTOM;
                tableLogo.AddCell(sCell);
    
                var aCell = new PdfPCell();
                aCell.Border = 0;
                aCell.MinimumHeight = 45f;
                aCell.PaddingBottom = 17f;
                aCell.HorizontalAlignment = Element.ALIGN_LEFT;
                aCell.VerticalAlignment = Element.ALIGN_BOTTOM;
                var accFont = new Font(customfont, 18 * 0.667f, Font.NORMAL, new Color(170, 170, 170));
                var acc = new Paragraph("|  Accessories", accFont);
                aCell.AddElement(acc);
                tableLogo.AddCell(aCell);
    
                document.Add(tableLogo);
                #endregion
    
                document.Add(new Paragraph(""));
    
                #region 中间的表格
                PdfPTable table = new PdfPTable(list.Count + 1);//n列的表格
                table.DefaultCell.Border = 0;
                table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
                table.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE;
    
                //根据图片数量确定列数及列宽
                if (pns.Count() == 1)
                {
                    float[] widths = new float[] { 2f, 3f };
                    table.SetWidths(widths);
                }
                else if (pns.Count() == 2)
                {
                    float[] widths = new float[] { 2f, 3f, 3f };
                    table.SetWidths(widths);
                }
                else if (pns.Count() == 3)
                {
                    float[] widths = new float[] { 2f, 3f, 3f, 3f };
                    table.SetWidths(widths);
                }
                else if (pns.Count() == 4)
                {
                    float[] widths = new float[] { 2f, 3f, 3f, 3f, 3f };
                    table.SetWidths(widths);
                }
                //左单元格
                var leftCell = new PdfPCell(new Paragraph("Images", leftFont));
                leftCell.MinimumHeight = 40f;
               leftCell.BackgroundColor = new Color(242, 242, 242);
                leftCell.HorizontalAlignment = Element.ALIGN_CENTER;
                leftCell.VerticalAlignment = Element.ALIGN_MIDDLE;
                table.AddCell(leftCell);
    
                //右单元格
                var rightCell = new PdfPCell();
                rightCell.HorizontalAlignment = Element.ALIGN_CENTER;
                rightCell.VerticalAlignment = Element.ALIGN_MIDDLE;
                rightCell.MinimumHeight = 40f;
    
                foreach (var item in list)
                {
                    var imageCell = new PdfPCell();
                    imageCell.Padding = 1f;
                    //根据图片数量确定左边距,确保图片在中间显示。这个地方写的不好,暂时这样
                    if (list.Count == 2)
                    {
                        imageCell.PaddingLeft = 30f;
                    }
                    if (list.Count == 1)
                    {
                        imageCell.PaddingLeft = 80f;
                    }
                    if (list.Count == 3)
                    {
                        imageCell.PaddingLeft = 10f;
                    }
                    //确保网络图片存在
                    if (!string.IsNullOrEmpty(item.Url) && Helper.IsExists(item.Url + "-218.png"))
                    {
                        var image = iTextSharp.text.Image.GetInstance(item.Url + "-218.png");
                        if (list.Count == 4)
                        {
                            image.ScaleToFit(80f, 80f);
                        }
                        else
                        {
                            image.ScaleToFit(100f, 100f);
                        }
                        imageCell.AddElement(image);
                    }
                    table.AddCell(imageCell);
                }
    
                //Product Title
                leftCell.Phrase = new Paragraph("Product Title", leftFont);
                var titleFont = new Font(customfont, 14 * 0.667f, Font.NORMAL, new Color(255, 105, 0));
                table.AddCell(leftCell);
                foreach (var item in list)
                {
                    rightCell.Phrase = new Paragraph(item.Title, titleFont);
                    table.AddCell(rightCell);
                }
    
                //List Price
                leftCell.Phrase = new Paragraph("List Price", leftFont);
                table.AddCell(leftCell);
                foreach (var item in list)
                {
                    rightCell.Phrase = new Paragraph(item.Currency + item.Price, baseFont);
                    table.AddCell(rightCell);
                }
    
                //Part Number
                leftCell.Phrase = new Paragraph("Part Number", leftFont);
                table.AddCell(leftCell);
                foreach (var item in list)
                {
                    rightCell.Phrase = new Paragraph(item.PN, baseFont);
                    table.AddCell(rightCell);
                }
    
                //facet
                var first = list.FirstOrDefault();
                foreach (var item in first.Facets)
                {
                    leftCell.Phrase = new Paragraph(item.Key, leftFont);
                    table.AddCell(leftCell);
                    rightCell.Phrase = new Paragraph(item.Value, baseFont);
                    table.AddCell(rightCell);
                    //其余的
                    list.Remove(first);
                    var other = list;
                    foreach (var one in other)
                    {
                        rightCell.Phrase = new Paragraph(one.Facets.FirstOrDefault(o => o.Key == item.Key).Value, baseFont);
                        table.AddCell(rightCell);
                    }
                }
                document.Add(table);
                #endregion
    
                //页脚
                PDFFooter footer = new PDFFooter();
                footer.OnEndPage(pw, document);
                document.Close();
                var bytes = memoryStream.ToArray();
                result = Convert.ToBase64String(bytes);
    
                return result;
            }
    
    /// <summary>
        /// 页脚类
        /// </summary>
        public class PDFFooter : PdfPageEventHelper
        {
            // write on top of document
            public override void OnOpenDocument(PdfWriter writer, Document document)
            {
                base.OnOpenDocument(writer, document);
                PdfPTable tabFot = new PdfPTable(new float[] { 1F });
                tabFot.SpacingAfter = 10F;
                PdfPCell cell;
                tabFot.TotalWidth = 300F;
                cell = new PdfPCell(new Phrase("Header"));
                tabFot.AddCell(cell);
                tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
            }
    
            // write on start of each page
            public override void OnStartPage(PdfWriter writer, Document document)
            {
                base.OnStartPage(writer, document);
            }
    
            // write on end of each page
            public override void OnEndPage(PdfWriter writer, Document document)
            {
                base.OnEndPage(writer, document);
                PdfPTable tabFot = new PdfPTable(new float[] { 1F });
                tabFot.TotalWidth = 700f;
                tabFot.DefaultCell.Border = 0;
              //  var footFont = FontFactory.GetFont("Lato", 12 * 0.667f, new Color(60, 60, 60));
                string fontpath = HttpContext.Current.Server.MapPath("~/App_Data");
                BaseFont customfont = BaseFont.CreateFont(fontpath + "\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
                var footFont = new Font(customfont, 12 * 0.667f, Font.NORMAL, new Color(170, 170, 170));
              
                PdfPCell cell;
                cell = new PdfPCell(new Phrase("@ 2016 . All Rights Reserved", footFont));
                cell.VerticalAlignment = Element.ALIGN_CENTER;
                cell.Border = 0;
                cell.PaddingLeft = 100f;
                tabFot.AddCell(cell);
                tabFot.WriteSelectedRows(0, -1, 150, document.Bottom, writer.DirectContent);
            }
    
            //write on close of document
            public override void OnCloseDocument(PdfWriter writer, Document document)
            {
                base.OnCloseDocument(writer, document);
            }
        } 
    

      

     /// <summary>
            /// 判断网络文件是否存在
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            public static bool IsExists(string url)
            {
                try
                {
                    using (new WebClient().OpenRead(url)) { }
                    return true;
                }
                catch (WebException)
                {
                    return false;
                }
            }
    

      其他注意点:

    1、当字体不支持中文、日文、繁体中文

     public string[] ChineseFont = new string[] { "Traditional Chinese [zh-tw]", "Japanese [ja]" };
    
     BaseFont customfont = BaseFont.CreateFont(fontpath + "\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
                if (ChineseFont.Contains(data.Language))
                {
                    customfont = BaseFont.CreateFont(fontpath + "\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                }

    要写BaseFont.IDENTITY_H

    2、表格的边框

    设置 table.DefaultCell.Border = 0;是不能约束单元格的边框的,必须每个单元格单独设置边框pnCell.Border=0或设置其他宽度及四面是否显示。

    3、表格位置

    一个表格默认是在页面中居中对齐,要设置 左对齐: pnTable.HorizontalAlignment = Element.ALIGN_LEFT;

    4、表格中嵌套表格

    嵌套的表格不会占满此行,设置了此表格左对齐,右边留白很多。要完全设置表格的宽度,并且锁定才行。

    pnTable.TotalWidth = 404 * 0.667f;
    pnTable.LockedWidth = true;

    5、链接。

    链接要用块来实现。

    var linkCell = new PdfPCell();
                linkCell.BorderWidthTop = 0;
                linkCell.Padding = 5f;
                linkCell.PaddingLeft = 10f;
                linkCell.PaddingBottom = 20f;
                var chunk = new Chunk("More Information", link14);
                chunk.SetAnchor("http://accsmartfind.lenovo.com/products/" + model.PN);
                linkCell.AddElement(chunk);
                table.AddCell(linkCell);

    6、样式。

    样式不行表格来凑,如果样式还不出来,再加一个表格。

    代码:https://pan.baidu.com/s/1bwjMZcfCwndFeSfmG9zd6w  ,里面的对象数据要自己添加些调试。vs2013.

  • 相关阅读:
    遇见Javascript类型数组
    编译Android常用命令
    V4L2驱动视频开发要点
    Windows Phone开发(27):隔离存储A
    Ubuntu10.04下Android开发环境搭建
    V4L2开发要点
    使用 php Header 报错的一个原因
    Windows Phone开发(28):隔离存储B
    用HTML5 Audio API开发游戏音乐
    php备份数据库类分享
  • 原文地址:https://www.cnblogs.com/heifengwll/p/6235383.html
Copyright © 2011-2022 走看看