iTextSharp生成pdf的一个简单例子

Posted 黑峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

以上是关于iTextSharp生成pdf的一个简单例子的主要内容,如果未能解决你的问题,请参考以下文章

iTextSharp 正在生成损坏的 PDF

使用iTextSharp生成的PDF生成水印给出错误

使用 iTextSharp 裁剪 PDF

C# 富文本内容生成PDF,用开源免费的类库

用 QuestPDF操作生成PDF更快更高效!

ASP.NET 转自定内容到 PDF - 使用 iTextSharp