• itextcsharp使用


    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;
            }
        }
    }

  • 相关阅读:
    [RxSwift]4.4、Operator
    [RxSwift]4.3.6、ControlProperty
    [RxSwift]4.3.5、Variable (已弃用)
    [RxSwift]4.3.0、Observable & Observer 既是可监听序列也是观察者
    [RxSwift]4.2.2、Binder
    [RxSwift]4.2.1、AnyObserver
    Java重温学习笔记,Java8新特性:接口的默认方法
    Tomcat下,MySQL连接池的配置和使用(Tomcat9,MySQL5.5)
    MyEclipse2020配置JDK1.8及Tomcat9
    Java重温学习笔记,Java7新特性
  • 原文地址:https://www.cnblogs.com/kingwangzhen/p/2600788.html
Copyright © 2020-2023  润新知