导航

itextcsharp使用

Posted on 2012-07-20 10:56  kingwangzhen  阅读(711)  评论(0编辑  收藏  举报

http://www.cnblogs.com/islands/archive/2008/06/27/1231288.html

http://itextsharp.sourceforge.net/index.html

http://www.koders.com/csharp/fid9CD533EF4F80FA1F37332A8D9570B4D9BD4A2129.aspx?s=file

 

 

using System;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Collections.Generic;
using System.Data;


namespace DomainModel.Common
{
  public  class ItextSharpHelper
    { /// <summary>
        /// Document对象共有三个构造函数
        ///  PDF文档默认选项为A4纸,每边36磅页边距
        /// 如果你修改了页面尺寸,仅仅影响到下一页,如果你修改了页边距,则影响到全部,故慎用。
        /// </summary>
        /// <param name="rect">如果传入Null那么实现默认的格式</param>
        /// <returns></returns>
        public static Document CreateDocument(Rectangle rect)
        {
            Document document;
            if (rect == null)
            {
                document = new Document();
            }
            else
            {
                document = new Document(rect);
            }

        //document.AddAuthor("邮乐采购系统");
            document.AddCreationDate();
        //document.AddSubject("采购系统生成单据");
     
            return document;
        }

        /// <summary>
        /// PDF(目前计划的PDF只需要这些)文件的内部内容的组成
        /// (仅仅文字,仅仅图片,仅仅表格,文字-图片,文字-表格,图片,表格)
        /// </summary>
        /// <param name="strText"></param>
        public static PdfWriter GetPdfWriter(Document document, string strPass)
        {
          return  PdfWriter.GetInstance(document, new FileStream(strPass, FileMode.Create,FileAccess.ReadWrite));
        }

        ///// <summary>
        ///// 创建字体
        ///// </summary>
        ///// <param name="strFontName">字体名请参考FontFactory对象</param>
        ///// <param name="FontSize">字体大小</param>
        /////  <param name="TextColor">文字颜色请参考Color对象(iTextSharp.text命名空间)</param>
        ///// <param name="FontStyle">字体样式请参考Font对象</param>
        ///// <returns></returns>
        //public static Font CreateFont(string strFontName, float FontSize, Color TextColor, int FontStyle)
        //{
        //    Font font = FontFactory.GetFont(strFontName, FontSize, FontStyle, TextColor);
        //    return font;
        //}

        /// <summary>
        /// 创建中文字体(实现中文)
        /// </summary>
        /// <returns></returns>
        public static BaseFont CreateChineseFont()
        {
            string currentDir = System.Environment.CurrentDirectory;
            BaseFont.AddToResourceSearch(Path.Combine(currentDir,"iTextAsian.dll"));
            BaseFont.AddToResourceSearch(Path.Combine(currentDir,"iTextAsianCmaps.dll"));
            BaseFont basefont = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

         //  Font font = new Font(basefont, 11, Font.NORMAL, BaseColor.BLACK);
            return basefont;
        }

        ///// <summary>
        ///// 将一个DataTable对象的值转换为PDF文件中的表格
        ///// </summary>
        ///// <param name="DT">传入table,具体样式你可以在外部定义</param>
        //public static Table CreateTable(DataTable DT)
        //{
        //    int columnsCount = DT.Columns.Count;
        //    Table table = new Table(columnsCount);
        //    Font font = CreateChineseFont();
        //    for (int rowsindex = 0; rowsindex < DT.Rows.Count; rowsindex++)
        //    {
        //        for (int columnindex = 0; columnindex < columnsCount; columnindex++)
        //        {
        //            table.AddCell(new Paragraph(DT.Rows[rowsindex][columnindex].ToString(), font));
        //        }
        //    }
        //    return table;
        //}

        /// <summary>
        /// 建立一个类似于列表(HTML当中的OL或者是UL)
        /// </summary>
        /// <param name="strContent">如果传入True,那么列表符号为数字(1,2,3....)</param>
        /// <param name="blNumber">输入内容</param>
        public static List CreateList(bool blNumber, params string[] strContent)
        {
            List list = new List(blNumber, strContent.Length);
            foreach (string str in strContent)
            {
                list.Add(str);
            }
            return list;
        }

        /// <summary>
        /// 建立一个图片集合(输入图片地址)
        /// </summary>
        /// <param name="strLink"></param>
        /// <returns></returns>
        public static Image[] CreateImages(params string[] strLink)
        {
            int length = strLink.Length;
            Image[] images = new Image[length];
            for (int index = 0; index < length; index++)
            {
                images[index] = Image.GetInstance(strLink[index]);
            }
            return images;
        }

        /// <summary>
        /// 将多个图片流添加到Document对象当中
        /// 在调用这个方法之前必须打开对象
        /// </summary>
        /// <param name="images">传入图片集合</param>
        /// <param name="document">传入文档对象</param>
        public static void UpdateDocumentByImages(Image[] images, ref Document document)
        {
            foreach (Image img in images)
            {
                document.Add(img);
            }
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using DomainModel.Entities.Pms;
using DomainModel.Repositories.Pms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using log4net;

namespace DomainModel.Common.ExportFiles
{
    public class ExportPdf
    {
        private static readonly ILog Mylogger = LogManager.GetLogger("PushOrder");
        private static readonly string basePoDir = string.Empty;
        private static readonly string basehttpContextDir = string.Empty;
        private static readonly tab_configRepository _tabConfigRepository = new tab_configRepository();
        private static readonly tab_userinfoRepository _tab_userinfoRepository = new tab_userinfoRepository();
        private static readonly tab_stockinfoRepository _tab_stockinfoRepository = new tab_stockinfoRepository();
        private static readonly tab_wordsconfigRepository _tab_wordsconfigRepository = new tab_wordsconfigRepository();
        private static readonly string company = string.Empty;
        private static readonly string companyTel = string.Empty;

        static ExportPdf()
        {
            tab_config config = _tabConfigRepository.GetModelByKey("OrderDir");
            basePoDir = null != config ? config.value : "";

            config = _tabConfigRepository.GetModelByKey("HttpContextPath");
            basehttpContextDir = null != config ? config.value : "";

            config = _tabConfigRepository.GetModelByKey("Co_Name");
            company = null != config ? config.value : "";

            config = _tabConfigRepository.GetModelByKey("Co_Tel");
            companyTel = null != config ? config.value : "";
        }


        public static bool ExportRefundOrderPdf(tab_purchaselist pmain, List<tab_purchaseinfo> pinfoList,
                                                out string filepath)
        {
            bool result = false;
            filepath = string.Empty;
            if (null == pmain || pinfoList.Count < 1)
            {
                Mylogger.Info("ExportRefundOrderPdf 无数据不导出pdf");
                return false;
            }

            if (string.IsNullOrEmpty(basePoDir))
            {
                Mylogger.Info(" ExportRefundOrderPdf basePoDir为空");
                return false;
            }

            try
            {
                if (!pmain.createdate.HasValue)
                {
                    Mylogger.Info(" ExportPdf createdate为空");
                    return false;
                }
                DateTime createtime = pmain.createdate.Value;
                string directory = Path.Combine(basePoDir, createtime.ToString("yyyy"),
                                                createtime.ToString("MM.dd"));
             

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                //

                string filepathname = Path.Combine(directory,
                                                   pmain.purchaseOrderId +
                                                   (pmain.orderStatus == (int) WordsEnum.退货单状态_已完成 ? "_b" : "_t") +
                                                   ".pdf");
                filepath = filepathname;
                //==============================================================
                string logopath = Path.Combine(basehttpContextDir, "images", "title.jpg");
                string notespath = Path.Combine(basehttpContextDir, "notes_refundNotice.txt");
                //
                Document document = ItextSharpHelper.CreateDocument(PageSize.A4.Rotate());
                PdfWriter writer = ItextSharpHelper.GetPdfWriter(document, filepathname);
                BaseFont basefont = ItextSharpHelper.CreateChineseFont();
                float pwidth = document.PageSize.Width;
                float pheight = document.PageSize.Height;
                float offsetx = 10f;
                float offsety = pheight;
                float col2x = 400f;
                document.Open();
                PdfContentByte canvas = writer.DirectContent;
                writer.CompressionLevel = 0;

                #region Titles

                canvas.SaveState();
                canvas.BeginText();

              
              //  Font font=new Font(basefont, 18, Font.NORMAL, BaseColor.BLACK);
                offsety = offsety - 40;
                canvas.SetFontAndSize(basefont, 18);
              
                canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                       (pmain.orderStatus == (int) WordsEnum.退货单状态_已完成 ? "退货报告" : "退货通知单"),
                                       pwidth/2 - 70, offsety, 0);


                //Logo
                Image imgLogo = Image.GetInstance(System.Drawing.Image.FromFile(logopath), ImageFormat.Png);

                offsety = offsety - 10;
                imgLogo.SetAbsolutePosition(15, offsety);
                imgLogo.ScalePercent(80);
                canvas.AddImage(imgLogo);

                //bar
                Image imgbar = Image.GetInstance(BarCode39.GetCode39(pmain.purchaseOrderId), ImageFormat.Png);
                offsety = offsety - 30;
                imgbar.SetAbsolutePosition(10, offsety);
                imgbar.ScalePercent(100);
                canvas.AddImage(imgbar);


                canvas.SetFontAndSize(basefont, 11);
                offsety = offsety - 20;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("退货单号:{0}", pmain.purchaseOrderId), 12,
                                       offsety, 0);

                canvas.ShowTextAligned(Element.ALIGN_LEFT, "", col2x, pheight - 100,
                                       0);

                string settleType = Utility.ToString(pmain.settleType);
                if (!string.IsNullOrEmpty(settleType))
                {
                    string type = settleType;
                    tab_wordsconfig words = _tab_wordsconfigRepository.Get(
                        w => w.belongedId == (int) WordsEnum.销售模式 && w.wordsvalue == type);

                    settleType = null != words ? words.wordscontent : "";
                }

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("销售类型:{0}", settleType), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商编号:{0}", pmain.merchantId), col2x,
                                       offsety, 0);

                string dcid = Utility.ToString(pmain.stockId);
                tab_stockinfo stockinfo = _tab_stockinfoRepository.Get(st => st.stockId == dcid);
                string stockaddress = string.Empty;
                string stockcontact = string.Empty;
                if (null != stockinfo)
                {
                    stockaddress = stockinfo.stockAddress;
                    stockcontact = stockinfo.stockContact1 + " " + stockinfo.stockTel;
                }

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("仓库地址:{0}", stockaddress), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商名称:{0}", pmain.merchantFullName), col2x,
                                       offsety, 0);

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("联系人:{0}", stockcontact), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商地址:{0}", pmain.merchantAddress), col2x,
                                       offsety, 0);


                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                       string.Format("退货单生成日期:{0}",
                                                     pmain.createdate.HasValue
                                                         ? pmain.createdate.Value.ToString("yyyy.MM.dd")
                                                         : ""), 12,
                                       offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                       string.Format("供应商联系人:{0}", pmain.contactName + " " + pmain.contactPhone), col2x,
                                       offsety, 0);

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                       string.Format("退货截止日期:{0}",
                                                     pmain.validEndDate.HasValue
                                                         ? pmain.validEndDate.Value.ToString("yyyy.MM.dd")
                                                         : ""), 12, offsety, 0);

                if (pmain.orderStatus == (int) WordsEnum.退货单状态_已完成)
                {
                    canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                           string.Format("取货完成日期:{0}",
                                                         pmain.receiverDate.HasValue
                                                             ? pmain.receiverDate.Value.ToString("yyyy.MM.dd")
                                                             : ""), col2x,
                                           offsety, 0);
                }
                else
                {
                    canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                           string.Format("打印日期:{0}", DateTime.Today.ToString("yyyy.MM.dd")), col2x,
                                           offsety, 0);
                }


                string takeType = Utility.ToString(pmain.takeType);
                if (!string.IsNullOrEmpty(takeType))
                {
                    string type = takeType;
                    tab_wordsconfig words = _tab_wordsconfigRepository.Get(
                        w => w.belongedId == (int) WordsEnum.取货方式 && w.wordsvalue == type);

                    takeType = null != words ? words.wordscontent : "";
                }

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("取货方式:{0}", takeType), 12, offsety, 0);

                if (pmain.orderStatus == (int) WordsEnum.退货单状态_已完成)
                {
                    canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("物流公司:{0}", pmain.shippingCompany), 160,
                                           offsety, 0);
                    canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("运单号:{0}", pmain.expressNo), 260, offsety,
                                           0);
                    canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                           string.Format("称重:{0}千克",
                                                         (pmain.goodsWight.HasValue
                                                              ? pmain.goodsWight.Value.ToString("F2")
                                                              : "0.00")), 360, offsety, 0);
                }
                canvas.EndText();
                canvas.RestoreState();

                #region title table Info

                var table = new PdfPTable(4);
                var colwidth = new[] {70f, 70f, 70f, 160f};
                var cols = new[]
                               {
                                   "", "姓名", "日期", "有效证件号", "仓库发货人", "", "", "", "商家提货人", "", "", ""
                               };
                table.SetTotalWidth(colwidth);
                table.HorizontalAlignment = Element.ALIGN_CENTER;

                table.DefaultCell.Padding = 3;
                var font = new Font(basefont, 11);
                PdfPCell cell = null;
                foreach (string col in cols)
                {
                    cell = new PdfPCell(new Phrase(col, font));
                    cell.HorizontalAlignment = Element.ALIGN_CENTER;
                    cell.VerticalAlignment = Element.ALIGN_CENTER;
                    table.AddCell(cell);
                }

                table.CompleteRow();
                table.WriteSelectedRows(0, -1, pwidth/2 + 25, pheight - 25, canvas);

                #endregion

                #endregion

                #region 明细数据

                int colnum = pmain.orderStatus == (int) WordsEnum.退货单状态_已完成 ? 12 : 13;
                table = new PdfPTable(colnum);

                cell = null;
                cols = new[]
                           {
                               "序号", "物品ID", "国标码", "店内码", "商品名称", "规格/颜色", "供货价(含税)", "税率", "箱装数量", "退货数量", "订单金额",
                               "备注"
                           };
                colwidth = new[] {28f, 50f, 75f, 75f, 190f, 100f, 40f, 35f, 35f, 40f, 80f, 70f};

                if (pmain.orderStatus != (int) WordsEnum.退货单状态_已完成)
                {
                    cols = new[]
                               {
                                   "序号", "物品ID", "国标码", "店内码", "商品名称", "规格/颜色", "供货价(含税)", "税率", "箱装数量", "退货数量", "订单金额",
                                   "实退数", "备注"
                               };
                    colwidth = new[] { 28f, 50f, 75f, 75f, 180f, 100f, 40f, 35f, 35f, 40f, 60f, 40f, 65f };
                }

                table.SetTotalWidth(colwidth);
                table.HorizontalAlignment = Element.ALIGN_CENTER;

                table.DefaultCell.Padding = 3;
                font = new Font(basefont, 11);
                foreach (string col in cols)
                {
                    cell = new PdfPCell(new Phrase(col, font));
                    cell.HorizontalAlignment = Element.ALIGN_CENTER;
                    cell.VerticalAlignment = Element.ALIGN_CENTER;
                    table.AddCell(cell);
                }

                int refundNum = 0; //退货总数量
                double realamount = 0; //退货总金额
                int page = 1;
                offsety = offsety - 7;
                for (int rowidnex = 0; rowidnex < pinfoList.Count; rowidnex++)
                {
                    if (page == 1)
                    {
                        if (table.TotalHeight > offsety - 20)
                        {
                            table.CompleteRow();
                            table.WriteSelectedRows(0, -1, 12, offsety, canvas);

                            document.NewPage();
                            //============
                            table = new PdfPTable(colnum);
                            table.SetTotalWidth(colwidth);
                            table.HorizontalAlignment = Element.ALIGN_CENTER;

                            table.DefaultCell.Padding = 3;
                            font = new Font(basefont, 11);
                            foreach (string col in cols)
                            {
                                cell = new PdfPCell(new Phrase(col, font));
                                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                                cell.VerticalAlignment = Element.ALIGN_CENTER;
                                table.AddCell(cell);
                            }
                            //=============================
                            page++;
                            offsety = pheight - 5;
                        }
                    }
                    else
                    {
                        if (table.TotalHeight > pheight - 20)
                        {
                            table.CompleteRow();
                            table.WriteSelectedRows(0, -1, 12, offsety, canvas);
                            document.NewPage();
                            //============
                            table = new PdfPTable(colnum);
                            table.SetTotalWidth(colwidth);
                            table.HorizontalAlignment = Element.ALIGN_CENTER;

                            table.DefaultCell.Padding = 3;
                            font = new Font(basefont, 11);
                            foreach (string col in cols)
                            {
                                cell = new PdfPCell(new Phrase(col, font));
                                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                                cell.VerticalAlignment = Element.ALIGN_CENTER;
                                table.AddCell(cell);
                            }
                            //=============================
                            page++;
                            offsety = pheight - 5;
                        }
                    }
                    double purchaseprice = 0;
                    int amt = 0;
                    tab_purchaseinfo pinfo = pinfoList[rowidnex];
                    for (int colindex = 1; colindex <= cols.Length; colindex++)
                    {
                     
                        switch (colindex)
                        {
                            case 1:
                                {
                                    cell = new PdfPCell(new Phrase(Utility.ToString(rowidnex + 1), font));
                                }
                                break;
                            case 2:
                                {
                                    cell = new PdfPCell(new Phrase(Utility.ToString(pinfo.itemId), font));
                                }
                                break;
                            case 3:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemUPC, font));
                                }
                                break;
                            case 4:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.storeCode, font));
                                }
                                break;
                            case 5:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemName, font));
                                }
                                break;
                            case 6:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemAttribute, font));
                                }
                                break;
                            case 7:
                                {
                                    if (pinfo.purchasePrice.HasValue)
                                    {
                                        purchaseprice = pinfo.purchasePrice.Value;
                                    }

                                    cell = new PdfPCell(new Phrase(purchaseprice.ToString("N2"), font));
                                }

                                break;
                            case 8:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.taxRate, font));
                                }
                                break;
                            case 9:
                                {
                                    int packageamount = Utility.ToInt(pinfo.packageAmount, 0).Value;

                                    cell = new PdfPCell(new Phrase(packageamount.ToString("N0"), font));
                                }

                                break;
                            case 10:
                                {
                                    if (pmain.orderStatus == (int) WordsEnum.退货单状态_已完成)
                                    {
                                        amt = Utility.ToInt(pinfo.receiveAmount, 0).Value;
                                    }
                                    else if (pmain.orderStatus == (int) WordsEnum.退货单状态_备货完成)
                                    {
                                        amt = Utility.ToInt(pinfo.prepareAmount, 0).Value;
                                    }

                                    cell = new PdfPCell(new Phrase(amt.ToString("N0"), font));
                                }

                                break;
                            case 11:
                                {
                                    refundNum += amt;
                                    realamount += purchaseprice*amt;
                                    double orderamount = purchaseprice*amt;
                                    cell = new PdfPCell(new Phrase(orderamount.ToString("N2"), font));
                                }
                                break;
                            case 12:
                            {
                                    if (pmain.orderStatus == (int) WordsEnum.退货单状态_备货完成)
                                    {
                                        int receiveAmount = Utility.ToInt(pinfo.receiveAmount, 0).Value;

                                        cell = new PdfPCell(new Phrase(receiveAmount>0?receiveAmount.ToString("N0"):"", font));
                                    }else
                                    {
                                        cell = new PdfPCell(new Phrase(pinfo.purchaseNotes, font));
                                    }
                            }
                            break;
                            case 13:
                            {
                                if (pmain.orderStatus == (int)WordsEnum.退货单状态_备货完成)
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.purchaseNotes, font));
                                }
                                else
                                {
                                    cell = null;
                                }
                             
                            }
                            break;
                              
                        }

                        if (null != cell)
                        {
                            cell.HorizontalAlignment = Element.ALIGN_CENTER;
                            cell.VerticalAlignment = Element.ALIGN_CENTER;
                            table.AddCell(cell);
                        }
                    }
                }

                //for (int i = 0; i < pinfoList.Count; i++)
                //{
                //    for (int j = 0; j < cols.Length; j++)
                //    {
                //      cell=  table.GetRow(i).GetCells()[j];
                //      cell.HorizontalAlignment = Element.ALIGN_CENTER;
                //      cell.VerticalAlignment = Element.ALIGN_CENTER;
                //    }
                //}
                cell =
                    new PdfPCell(new Phrase(string.Format("退货总数量:{0:N0};退货总金额:¥{1:N2}", refundNum, realamount), font));
                cell.Colspan = pmain.orderStatus == (int)WordsEnum.退货单状态_已完成 ? 12 : 13;
                cell.HorizontalAlignment = Element.ALIGN_RIGHT;
                table.AddCell(cell);

                table.CompleteRow();
                table.WriteSelectedRows(0, -1, 10, offsety, canvas);
                offsety -= table.TotalHeight;
                //table.CompleteRow();
                //offsety = pheight - 185;
                //table.WriteSelectedRows(0, -1, 12, offsety, canvas);

                #endregion

                canvas.SaveState();
                canvas.BeginText();
                canvas.SetFontAndSize(basefont, 11);

                //offsety = pheight - 200 - table.TotalHeight;
                offsety -= 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("备注:{0}", pmain.remark), 12,
                                       offsety, 0);

                #region 读取notes

                try
                {
                    using (var dr = new StreamReader(notespath, Encoding.UTF8))
                    {
                        offsety = offsety - 15;
                        string nodes = dr.ReadLine();
                         while (null != nodes)
                        {
                            if (!string.IsNullOrEmpty(nodes))
                            {
                                offsety = offsety - 15f;

                                if (offsety < 15)
                                {
                                    canvas.EndText();
                                    canvas.RestoreState();

                                    document.NewPage();
                                    canvas.SaveState();
                                    canvas.BeginText();
                                    canvas.SetFontAndSize(basefont, 11);
                                    offsety = pheight - 30;
                                }
                                canvas.ShowTextAligned(Element.ALIGN_LEFT, nodes, 12,
                                                       offsety, 0);
                            }

                            nodes = dr.ReadLine();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Mylogger.Info("export pdf notes 读取异常:" + Common.GetExceptionMessage(ex));
                }

                #endregion

                canvas.EndText();
                canvas.RestoreState();
                document.Close();
                Mylogger.Info(string.Format("单据{0}pdf文件生成完成", pmain.purchaseOrderId));
                result = true;
            }
            catch (Exception ex)
            {
                Mylogger.Info(string.Format("{0}生成pdf异常:{1}", pmain.purchaseOrderId, Common.GetExceptionMessage(ex)));
                result = false;
            }
            return result;
        }

        /// <summary>
        /// PO单pdf生成
        /// </summary>
        /// <param name="pmain"></param>
        /// <param name="pinfoList"></param>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public static bool ExportPoPdf(tab_purchaselist pmain, List<tab_purchaseinfo> pinfoList, out string filepath)
        {
            bool result = false;
            filepath = string.Empty;
            if (null == pmain || pinfoList.Count < 1)
            {
                Mylogger.Info("ExportPdf 无数据不导出pdf");
                return false;
            }

            if (string.IsNullOrEmpty(basePoDir))
            {
                Mylogger.Info(" ExportPdf basePoDir为空");
                return false;
            }

            try
            {
                if(!pmain.createdate.HasValue)
                {
                    Mylogger.Info(" ExportPdf createdate为空");
                    return false;
                }
                DateTime createtime = pmain.createdate.Value;
                string directory = Path.Combine(basePoDir, createtime.ToString("yyyy"),
                                                createtime.ToString("MM.dd"));

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                //
                string filepathname = Path.Combine(directory, pmain.purchaseOrderId + ".pdf");
                filepath = filepathname;
                //==============================================================
                string logopath = Path.Combine(basehttpContextDir, "images", "title.jpg");
                string notespath = Path.Combine(basehttpContextDir, "notes.txt");
                //
                Document document = ItextSharpHelper.CreateDocument(PageSize.A4.Rotate());
                PdfWriter writer = ItextSharpHelper.GetPdfWriter(document, filepathname);
                BaseFont basefont = ItextSharpHelper.CreateChineseFont();
                float pwidth = document.PageSize.Width;
                float pheight = document.PageSize.Height;
                float offsetx = 10f;
                float offsety = pheight;
                document.Open();
                PdfContentByte canvas = writer.DirectContent;
                writer.CompressionLevel = 0;

                #region Titles

                canvas.SaveState();
                canvas.BeginText();

                offsety = offsety - 40;
                canvas.SetFontAndSize(basefont, 18);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, "商品采购订单", pwidth/2 - 70, offsety, 0);


                //Logo
                Image imgLogo = Image.GetInstance(System.Drawing.Image.FromFile(logopath), ImageFormat.Png);

                offsety = offsety - 10;
                imgLogo.SetAbsolutePosition(15, offsety);
                imgLogo.ScalePercent(80);
                canvas.AddImage(imgLogo);

                //bar
                Image imgbar = Image.GetInstance(BarCode39.GetCode39(pmain.purchaseOrderId), ImageFormat.Png);
                offsety = offsety - 30;
                imgbar.SetAbsolutePosition(10, offsety);
                imgbar.ScalePercent(100);
                canvas.AddImage(imgbar);


                canvas.SetFontAndSize(basefont, 11);
                offsety = offsety - 20;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("订单号:{0}", pmain.purchaseOrderId), 12,
                                       offsety, 0);
                string validPeriod = string.Empty;
                if (pmain.validStartDate.HasValue)
                    validPeriod = pmain.validStartDate.Value.ToString("yyyy.MM.dd");
                if (pmain.validEndDate.HasValue)
                    validPeriod += "-" + pmain.validEndDate.Value.ToString("yyyy.MM.dd");
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("订单有效期:{0}", validPeriod), 400, pheight - 100,
                                       0);

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("订购公司:{0}", company), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商编号:{0}", pmain.merchantId), 400,
                                       offsety, 0);

                string telphone = string.Empty;
                if (!string.IsNullOrEmpty(pmain.createUserName) || !string.IsNullOrEmpty(pmain.applyUser))
                {
                    var userinfo = new tab_userinfo();
                    if (!string.IsNullOrEmpty(pmain.createUserName))
                    {
                        userinfo = _tab_userinfoRepository.Get(u => u.username == pmain.createUserName);
                    }
                    else if (!string.IsNullOrEmpty(pmain.applyUser))
                    {
                        userinfo = _tab_userinfoRepository.Get(u => u.useremail == pmain.applyUser);
                    }

                    if (null != userinfo && !string.IsNullOrEmpty(userinfo.persontel))
                    {
                        telphone = companyTel + "*" + userinfo.persontel;
                    }
                }

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("联系电话:{0}", telphone), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商名称:{0}", pmain.merchantFullName), 400,
                                       offsety, 0);

                string dcid = Utility.ToString(pmain.stockId);
                tab_stockinfo stockinfo = _tab_stockinfoRepository.Get(st => st.stockId == dcid);
                string stockaddress = string.Empty;
                string stockcontact = string.Empty;
                if (null != stockinfo)
                {
                    stockaddress = stockinfo.stockAddress;
                    stockcontact = stockinfo.stockContact + " " + stockinfo.stockTel;
                }
                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("仓库地址:{0}", stockaddress), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("供应商地址:{0}", pmain.merchantAddress), 400,
                                       offsety, 0);

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("联系人:{0}", stockcontact), 12, offsety, 0);
                canvas.ShowTextAligned(Element.ALIGN_LEFT,
                                       string.Format("供应商联系人:{0}", pmain.contactName + " " + pmain.contactPhone), 400,
                                       offsety, 0);

                string listingtype = Utility.ToString(pmain.listingType);
                if (!string.IsNullOrEmpty(listingtype))
                {
                    tab_wordsconfig words = _tab_wordsconfigRepository.Get(
                        w => w.belongedId == (int) WordsEnum.顾客类型 && w.wordsvalue == (listingtype));

                    listingtype = null != words ? words.wordscontent : "";
                }

                offsety = offsety - 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("顾客类型:{0}", listingtype), 12, offsety, 0);
                canvas.EndText();
                canvas.RestoreState();

                #endregion

                #region 明细数据

                var table = new PdfPTable(13);

                PdfPCell cell = null;
                var cols = new[]
                               {
                                   "序号", "物品ID", "国标码", "店内码", "商品名称", "规格/颜色", "供货价(含税)", "税率", "箱装数量", "订货数量", "订单金额",
                                   "实收数", "备注"
                               };
                var colwidth = new[] {28f, 50f, 75f, 75f, 185f, 100f, 40f, 35f, 35f, 40f, 60f, 40f, 50f};

                table.SetTotalWidth(colwidth);
                table.HorizontalAlignment = Element.ALIGN_CENTER;

                table.DefaultCell.Padding = 3;
                var font = new Font(basefont, 11);
                foreach (string col in cols)
                {
                    cell = new PdfPCell(new Phrase(col, font));
                    cell.HorizontalAlignment = Element.ALIGN_CENTER;
                    cell.VerticalAlignment = Element.ALIGN_CENTER;
                    table.AddCell(cell);
                }

                double amount = 0; //订单总金额
                double realamount = 0; //实际订单总金额
                int page = 1;
                offsety = offsety - 7;
                for (int rowidnex = 0; rowidnex < pinfoList.Count; rowidnex++)
                {
                    if (page == 1)
                    {
                        if (table.TotalHeight > offsety - 20)
                        {
                            table.CompleteRow();
                            table.WriteSelectedRows(0, -1, 12, offsety, canvas);

                            document.NewPage();
                            //============
                            table = new PdfPTable(13);
                            table.SetTotalWidth(colwidth);
                            table.HorizontalAlignment = Element.ALIGN_CENTER;

                            table.DefaultCell.Padding = 3;
                            font = new Font(basefont, 11);
                            foreach (string col in cols)
                            {
                                cell = new PdfPCell(new Phrase(col, font));
                                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                                cell.VerticalAlignment = Element.ALIGN_CENTER;
                                table.AddCell(cell);
                            }
                            //=============================
                            page++;
                            offsety = pheight - 5;
                        }
                    }
                    else
                    {
                        if (table.TotalHeight > pheight - 20)
                        {
                            table.CompleteRow();
                            table.WriteSelectedRows(0, -1, 12, offsety, canvas);
                            document.NewPage();
                            //============
                            table = new PdfPTable(13);
                            table.SetTotalWidth(colwidth);
                            table.HorizontalAlignment = Element.ALIGN_CENTER;

                            table.DefaultCell.Padding = 3;
                            font = new Font(basefont, 11);
                            foreach (string col in cols)
                            {
                                cell = new PdfPCell(new Phrase(col, font));
                                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                                cell.VerticalAlignment = Element.ALIGN_CENTER;
                                table.AddCell(cell);
                            }
                            //=============================
                            page++;
                            offsety = pheight - 5;
                        }
                    }

                    tab_purchaseinfo pinfo = pinfoList[rowidnex];
                    for (int colindex = 1; colindex <= cols.Length; colindex++)
                    {
                        switch (colindex)
                        {
                            case 1:
                                {
                                    cell = new PdfPCell(new Phrase(Utility.ToString(rowidnex + 1), font));
                                }
                                break;
                            case 2:
                                {
                                    cell = new PdfPCell(new Phrase(Utility.ToString(pinfo.itemId), font));
                                }
                                break;
                            case 3:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemUPC, font));
                                }
                                break;
                            case 4:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.storeCode, font));
                                }
                                break;
                            case 5:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemName, font));
                                }
                                break;
                            case 6:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.itemAttribute, font));
                                }
                                break;
                            case 7:
                                {
                                    double purchaseprice = 0;

                                    if (pinfo.purchasePrice.HasValue)
                                    {
                                        purchaseprice = pinfo.purchasePrice.Value;
                                    }

                                    amount += purchaseprice*Utility.ToInt(pinfo.bookAmount, 0).Value;
                                    realamount += purchaseprice*Utility.ToInt(pinfo.receiveAmount, 0).Value;

                                    cell = new PdfPCell(new Phrase(purchaseprice.ToString("N2"), font));
                                }

                                break;
                            case 8:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.taxRate, font));
                                }
                                break;
                            case 9:
                                {
                                    int packageamount = Utility.ToInt(pinfo.packageAmount, 0).Value;

                                    cell = new PdfPCell(new Phrase(packageamount.ToString("N0"), font));
                                }

                                break;
                            case 10:
                                {
                                    int bookAmount = Utility.ToInt(pinfo.bookAmount, 0).Value;

                                    cell = new PdfPCell(new Phrase(bookAmount.ToString("N0"), font));
                                }

                                break;
                            case 11:
                                {
                                    double orderAmount = 0;

                                    if (pinfo.orderAmount.HasValue)
                                        orderAmount = pinfo.orderAmount.Value;

                                    cell = new PdfPCell(new Phrase(orderAmount.ToString("N2"), font));
                                }

                                break;
                            case 12:
                                {
                                    int receiveAmount = Utility.ToInt(pinfo.receiveAmount, 0).Value;

                                    cell = new PdfPCell(new Phrase(receiveAmount.ToString("N0"), font));
                                }
                                break;
                            case 13:
                                {
                                    cell = new PdfPCell(new Phrase(pinfo.purchaseNotes, font));
                                }
                                break;
                        }

                        if (null != cell)
                        {
                            cell.HorizontalAlignment = Element.ALIGN_CENTER;
                            cell.VerticalAlignment = Element.ALIGN_CENTER;
                            table.AddCell(cell);
                        }
                    }
                }

                //for (int i = 0; i < pinfoList.Count; i++)
                //{
                //    for (int j = 0; j < cols.Length; j++)
                //    {
                //      cell=  table.GetRow(i).GetCells()[j];
                //      cell.HorizontalAlignment = Element.ALIGN_CENTER;
                //      cell.VerticalAlignment = Element.ALIGN_CENTER;
                //    }
                //}
                cell = new PdfPCell(new Phrase(string.Format("订单总金额:¥{0:N2};订单实际总金额:¥{1:N2}", amount, realamount), font));
                cell.Colspan = 13;
                cell.HorizontalAlignment = Element.ALIGN_RIGHT;
                table.AddCell(cell);

                table.CompleteRow();
                table.WriteSelectedRows(0, -1, 12, offsety, canvas);
                offsety -= table.TotalHeight;
                //table.CompleteRow();
                //offsety = pheight - 185;
                //table.WriteSelectedRows(0, -1, 12, offsety, canvas);

                #endregion

                canvas.SaveState();
                canvas.BeginText();
                canvas.SetFontAndSize(basefont, 11);

                //offsety = pheight - 200 - table.TotalHeight;
                offsety -= 15;
                canvas.ShowTextAligned(Element.ALIGN_LEFT, string.Format("备注:{0}", pmain.remark), 12,
                                       offsety, 0);

                #region 读取notes

                try
                {
                    using (var dr = new StreamReader(notespath, Encoding.UTF8))
                    {
                        offsety = offsety - 15;
                        string nodes = dr.ReadLine();
                        while (null != nodes)
                        {
                            if (!string.IsNullOrEmpty(nodes))
                            {
                                offsety = offsety - 15f;

                                if (offsety < 15)
                                {
                                    canvas.EndText();
                                    canvas.RestoreState();

                                    document.NewPage();
                                    canvas.SaveState();
                                    canvas.BeginText();
                                    canvas.SetFontAndSize(basefont, 11);
                                    offsety = pheight - 30;
                                }
                                canvas.ShowTextAligned(Element.ALIGN_LEFT, nodes, 12,
                                                       offsety, 0);
                            }

                            nodes = dr.ReadLine();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Mylogger.Info("export pdf notes 读取异常:" + Common.GetExceptionMessage(ex));
                }

                #endregion

                canvas.EndText();
                canvas.RestoreState();
                document.Close();
                Mylogger.Info(string.Format("单据{0}pdf文件生成完成", pmain.purchaseOrderId));
                result = true;
            }
            catch (Exception ex)
            {
                Mylogger.Info(string.Format("{0}生成pdf异常:{1}", pmain.purchaseOrderId, Common.GetExceptionMessage(ex)));
                result = false;
            }
            return result;
        }
    }
}