zoukankan      html  css  js  c++  java
  • PDF C#操作

    一:PDF

    1.Adobe Acrobat 8 Professional 可以修改和制作模板

    2.向模板插入数据(代码)例子,需要用到itextsharp.dll引用文件

    using System;
    using System.Collections.Generic;
    using System.Web;
    using iTextSharp.text;
    using System.IO;
    using iTextSharp.text.pdf;
    using System.Data;
    using Suryani.Commerce.Core.Common;
    using System.Text;
    using Suryani.Commerce.Core.Order_Mgmt;
    using Diapers.Intranet.Manager;

    /// <summary>
    /// Summary description for InvoiceEmailGenerator
    /// </summary>
    public class InvoiceEmailGenerator
    {
        private const string DIAPERS_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_Diapers";
        private const string SOAP_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_Soap";
        private const string BEAUTYBAR_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_BeautyBar";
        private const string WAG_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_Wag";
        private const string YOYO_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_Yoyo";
        private const string CASA_CUSTOMER_TEMPLATE_NAME = "customerEmail_PDF_Invoice_Casa";
        private const string USER_TEMPLATE_NAME = "1800diapers_PdfInvoiceForUser";
        private const string USER_TEMPLATE_NAME_POREINVOICE = "customerEmail_PDF_Invoice_PoOrder";
        private int CatalogID = 1;  //default is diapers
        private int SentTime = 1;  //default is diapers
        public InvoiceEmailGenerator()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        /// <summary>
        /// this function is for send invoice for customer
        /// </summary>
        /// <param name="orderId"></param>
        /// <param name="email"></param>
        /// <param name="templatePath"></param>
        /// <param name="isSendToCustomer"></param>
        /// <param name="shipmentId"></param>
        /// <returns></returns>
        public string GenerateAndSendInvoiceEmail(int orderId, string email, string templatePath, bool isSendToCustomer, int shipmentId,string dueDate)
        {
            if (orderId != -1 && !string.IsNullOrEmpty(email))
            {
                CatalogID = GetOrderCatalog(orderId);
                SentTime = GetPoOrderInvoiceTimes(orderId);
                //get catalog info
                DataTable catalog = new CatalogManager().GetAllCatalog();
                DataRow[] row = catalog.Select("CatalogId='" + CatalogID + "'");
                string contractPhoneInfo =row[0]["AddressToName"].ToString()+": " + row[0]["ShipperPhone"].ToString();
                string catalogName = row[0]["catalogName"].ToString();

                string fileName = "InvoiceTemplate" + System.DateTime.Now.Millisecond.ToString() + new Random().Next().ToString() + ".pdf";
                //sendResultLable.InnerText = "";
                Suryani.Commerce.Core.Order_Mgmt.Order order = new Suryani.Commerce.Core.Order_Mgmt.Order_Manager().GetOrder(orderId);
                string trackingNumber = string.Empty;
                bool isNotPaid = CheckPOOrderPaid(order);
                if (order != null && order.OrderItems != null && order.OrderItems.Rows.Count > 0)
                {
                    Document document = null;
                    FileStream invoicePdfStream = null;
                    PdfCopy copy = null;
                    PdfReader template1 = null;
                    PdfReader template2_1 = null;
                    PdfReader template2_2 = null;
                    PdfStamper stamper = null;
                    AcroFields fields = null;
                    document = new Document();
                    invoicePdfStream = new FileStream(string.Format("{0}\\{1}", templatePath, fileName), FileMode.Create);
                    copy = new PdfCopy(document, invoicePdfStream);
                    copy.SetFullCompression();
                    copy.CloseStream = true;
                    document.Open();
                    //judge orderitems first,if the num of orderItems less than 16,we use template1
                    //or we use template 2_1(29 rows) and template 2_2(15 rows), and how many template 2_1 will used result with this num.
                    if (order.OrderItems.Rows.Count <= 16)
                    {
                        template1 = GetTemplateByCatalogId(templatePath, 1);// new PdfReader(string.Format("{0}\\InvoiceTemplate1.pdf", templatePath));
                        MemoryStream invoiceStream = new MemoryStream();
                        stamper = new PdfStamper(template1, invoiceStream);
                        stamper.SetFullCompression();
                        fields = stamper.AcroFields;
                        if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                        {
                            FillBillToAndShipTo(order, fields, contractPhoneInfo, dueDate, SentTime);
                            //Order List
                            int rowIndex = 0;
                            foreach (DataRow orderItem in order.OrderItems.Rows)
                            {
                                FillOneOrderItem(fields, rowIndex, orderItem);
                                rowIndex++;
                            }
                            FillTotal(order, fields,catalogName,dueDate);
                        }
                        stamper.FormFlattening = true;
                        stamper.Close();
                        template1 = new PdfReader(invoiceStream.ToArray());
                        template1.RemoveUnusedObjects();
                        copy.AddPage(copy.GetImportedPage(template1, 1));
                    }
                    else
                    {
                        template2_1 = GetTemplateByCatalogId(templatePath, 2);// new PdfReader(string.Format("{0}\\InvoiceTemplate2_1.pdf", templatePath));
                        template2_2 = GetTemplateByCatalogId(templatePath, 3);// new PdfReader(string.Format("{0}\\InvoiceTemplate2_2.pdf", templatePath));
                        int template2_1Num = order.OrderItems.Rows.Count / 29;
                        bool isNeedReserve = false;
                        if (order.OrderItems.Rows.Count % 29 > 15)
                        {
                            template2_1Num += 1;
                            isNeedReserve = true;
                        }
                        if (order.OrderItems.Rows.Count % 29 == 0)
                        {
                            isNeedReserve = true;
                        }
                        int totalItemsOfTemp2_1 = order.OrderItems.Rows.Count;
                        if (isNeedReserve)
                        {
                            totalItemsOfTemp2_1 -= 2;
                        }
                        for (int i = 0; i < template2_1Num; i++)  //how many template2_1 will used
                        {
                            template2_1 = GetTemplateByCatalogId(templatePath, 2);
                            MemoryStream template2_1InvoiceStream = new MemoryStream();
                            stamper = new PdfStamper(template2_1, template2_1InvoiceStream);
                            stamper.SetFullCompression();
                            //begin to fill fields
                            fields = stamper.AcroFields;
                            if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                            {
                                FillBillToAndShipTo(order, fields, contractPhoneInfo, dueDate, SentTime);
                                //Order List
                                int rowIndex = 0;
                                int pageNst = i * 29;
                                for (int j = i * 29; j < (pageNst + 29) && j < totalItemsOfTemp2_1; j++)
                                {
                                    DataRow orderItem = order.OrderItems.Rows[j];
                                    FillOneOrderItem(fields, rowIndex, orderItem);
                                    rowIndex++;
                                }
                                fields.SetField("CurrentPage", (i + 1).ToString());
                                fields.SetField("TotalPage", (template2_1Num + 1).ToString());
                            }
                            stamper.FormFlattening = true;
                            stamper.Close();
                            template2_1 = new PdfReader(template2_1InvoiceStream.ToArray());
                            template2_1.RemoveUnusedObjects();
                            copy.AddPage(copy.GetImportedPage(template2_1, 1));
                        }
                        //one template2_2 will used
                        MemoryStream template2_2InvoiceStream = new MemoryStream();
                        stamper = new PdfStamper(template2_2, template2_2InvoiceStream);
                        stamper.SetFullCompression();
                        fields = stamper.AcroFields;
                        if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                        {
                            FillBillToAndShipTo(order, fields, contractPhoneInfo, dueDate, SentTime);
                            //Order List
                            if (order.OrderItems.Rows.Count % 29 <= 15 && order.OrderItems.Rows.Count % 29 > 0)
                            {
                                int rowIndex = order.OrderItems.Rows.Count % 29 - 1;
                                int lastRowIndex = order.OrderItems.Rows.Count - 1;
                                if (rowIndex >= 0)
                                {
                                    for (int k = rowIndex; k >= 0; k--)
                                    {
                                        DataRow orderItem = order.OrderItems.Rows[lastRowIndex];
                                        FillOneOrderItem(fields, rowIndex, orderItem);
                                        rowIndex--;
                                        lastRowIndex--;
                                    }
                                }
                            }
                            else  //reserve 2 records for InvoiceTemplate2_2
                            {
                                int rowIndex = 0;
                                for (int i = order.OrderItems.Rows.Count - 2; i < order.OrderItems.Rows.Count; i++)
                                {
                                    DataRow orderItem = order.OrderItems.Rows[i];
                                    FillOneOrderItem(fields, rowIndex, orderItem);
                                    rowIndex++;
                                }
                            }
                            fields.SetField("CurrentPage", (template2_1Num + 1).ToString());
                            fields.SetField("TotalPage", (template2_1Num + 1).ToString());
                            FillTotal(order, fields,catalogName,dueDate);
                        }
                        stamper.FormFlattening = true;
                        stamper.Close();
                        template2_2 = new PdfReader(template2_2InvoiceStream.ToArray());
                        template2_2.RemoveUnusedObjects();
                        copy.AddPage(copy.GetImportedPage(template2_2, 1));
                    }

                    document.Close();
                    if (invoicePdfStream != null)
                    {
                        invoicePdfStream.Close();
                    }
                    if (template1 != null)
                    {
                        template1.Close();
                    }
                    if (template2_1 != null)
                    {
                        template2_1.Close();
                    }
                    if (template2_2 != null)
                    {
                        template2_2.Close();
                    }

                    bool isSuccess = SendEmail(fileName, email, templatePath, isSendToCustomer, orderId, shipmentId, CatalogID, SentTime);
                    if (isSuccess)
                    {
                        new Order_Manager().UpdatePoInvoiceTimes(orderId, SiCommerce.Intranet.Security.Secure.GetUserName());
                        return "Invoice email has been sent.";
                    }
                    else
                    {
                        return "Customer invoice template lost.";
                    }
                }
                else
                {
                    throw new Exception("No order item to print.");
                }
            }
            return "";
        }

        private bool CheckPOOrderPaid(Suryani.Commerce.Core.Order_Mgmt.Order order)
        {
            if (order.GL.ToUpper() == "PO" || (order.OrderShippings[0].PaymentInfo != null && order.OrderShippings[0].PaymentInfo.IsPO.Trim().ToUpper() == "Y"))
            {
                if (order.OrderShippings[0].PaymentInfo.Paid == "N")
                {
                    return true;
                }
            }
            return false;
        }

        private static void FillBillToAndShipTo(Suryani.Commerce.Core.Order_Mgmt.Order order, AcroFields fields, string contractPhoneInfo,string dueDate,int times)
        {
            fields.SetField("ContractNumber", contractPhoneInfo);
            fields.SetField("InvoiceDate", string.Format("{0:d}", Convert.ToDateTime(order.OrderDate)));
            fields.SetField("InvoiceNumber", order.OrderId.ToString());
            fields.SetField("PONumber", order.OrderShippings[0].ShippingInfo.PO);
            if (times==2)
            {
                fields.SetField("SecondCopy","2nd COPY");
                //fields.SetField("SecondCopy", times.ToString()+"nd COPY");
            }
            else if (times == 3)
            {
                fields.SetField("SecondCopy", "3rd COPY");
                //fields.SetField("SecondCopy", times.ToString()+"nd COPY");
            }
            else if (times >3)
            {
                fields.SetField("SecondCopy", times.ToString() + "th COPY");
            }
            else
            {
                fields.SetField("SecondCopy", " ");
            }
            if (string.IsNullOrEmpty(dueDate))
            {
                dueDate = new Suryani.Commerce.Core.Order_Mgmt.Order_Manager().GetDueDateByOrderId(order.OrderId);
                if (string.IsNullOrEmpty(dueDate))
                    dueDate = "Upon Receipt";
            }
            fields.SetField("DueDate", dueDate);
            //Bill To
            int index = 0;
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToName))
            {
                fields.SetField("BillTo" + index, order.OrderShippings[0].PaymentInfo.BillToName);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToAddress1))
            {
                fields.SetField("BillTo" + index, order.OrderShippings[0].PaymentInfo.BillToAddress1);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToAddress2))
            {
                fields.SetField("BillTo" + index, order.OrderShippings[0].PaymentInfo.BillToAddress2);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToAddress3))
            {
                fields.SetField("BillTo" + index, order.OrderShippings[0].PaymentInfo.BillToAddress3);
                index++;
            }
            StringBuilder cityStateZipStringBuilder = new StringBuilder();
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToCity))
            {
                cityStateZipStringBuilder.Append(order.OrderShippings[0].PaymentInfo.BillToCity);
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToState))
            {
                if (cityStateZipStringBuilder.Length > 0)
                {
                    cityStateZipStringBuilder.Append(", ");
                }
                cityStateZipStringBuilder.Append(order.OrderShippings[0].PaymentInfo.BillToState);
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToZIP))
            {
                if (cityStateZipStringBuilder.Length > 0)
                {
                    cityStateZipStringBuilder.Append(" ");
                }
                cityStateZipStringBuilder.Append(order.OrderShippings[0].PaymentInfo.BillToZIP);
            }
            if (cityStateZipStringBuilder.Length > 0)
            {
                fields.SetField("BillTo" + index, cityStateZipStringBuilder.ToString());
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.BillToCountryCode))
            {
                fields.SetField("BillTo" + index, order.OrderShippings[0].PaymentInfo.BillToCountryCode);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].PaymentInfo.Phone))
            {
                fields.SetField("BillTo" + index, "Phone: " + order.OrderShippings[0].PaymentInfo.Phone);
            }

            //Ship TO
            index = 0;
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.RecipientName))
            {
                fields.SetField("ShipTo" + index, order.OrderShippings[0].ShippingInfo.RecipientName);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingAddr1))
            {
                fields.SetField("ShipTo" + index, order.OrderShippings[0].ShippingInfo.ShippingAddr1);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingAddr2))
            {
                fields.SetField("ShipTo" + index, order.OrderShippings[0].ShippingInfo.ShippingAddr2);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingAddr3))
            {
                fields.SetField("ShipTo" + index, order.OrderShippings[0].ShippingInfo.ShippingAddr3);
                index++;
            }
            cityStateZipStringBuilder = new StringBuilder();
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingCity))
            {
                cityStateZipStringBuilder.Append(order.OrderShippings[0].ShippingInfo.ShippingCity);
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingState))
            {
                if (cityStateZipStringBuilder.Length > 0)
                {
                    cityStateZipStringBuilder.Append(", ");
                }
                cityStateZipStringBuilder.Append(order.OrderShippings[0].ShippingInfo.ShippingState);
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingZip))
            {
                if (cityStateZipStringBuilder.Length > 0)
                {
                    cityStateZipStringBuilder.Append(" ");
                }
                cityStateZipStringBuilder.Append(order.OrderShippings[0].ShippingInfo.ShippingZip);
            }
            if (cityStateZipStringBuilder.Length > 0)
            {
                fields.SetField("ShipTo" + index, cityStateZipStringBuilder.ToString());
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.ShippingCountry))
            {
                fields.SetField("ShipTo" + index, order.OrderShippings[0].ShippingInfo.ShippingCountry);
                index++;
            }
            if (!string.IsNullOrEmpty(order.OrderShippings[0].ShippingInfo.DayPhone))
            {
                fields.SetField("ShipTo" + index, "Phone: " + order.OrderShippings[0].ShippingInfo.DayPhone);
            }
        }

        private static void FillOneOrderItem(AcroFields fields, int rowIndex, DataRow orderItem)
        {
            fields.SetField("ItemNo" + rowIndex, orderItem["sku"].ToString());
            fields.SetField("Description" + rowIndex, orderItem["productname"].ToString());
            fields.SetField("QtyOrdered" + rowIndex, orderItem["quantity"].ToString());
            fields.SetField("QtyShipped" + rowIndex, orderItem["shipQty"].ToString());
            fields.SetField("UnitPrice" + rowIndex, string.Format("{0:c}", Convert.ToDouble(orderItem["discountprice"])));
            fields.SetField("Discount" + rowIndex, string.Format("{0:c}", Convert.ToDouble(orderItem["discount"])));
            fields.SetField("Subtotal" + rowIndex, string.Format("{0:c}", Convert.ToDouble(orderItem["Subtotal"]) - Convert.ToDouble(orderItem["discount"])));
        }

        private static void FillTotal(Suryani.Commerce.Core.Order_Mgmt.Order order, AcroFields fields, string catalogName,string dueDate)
        {
            fields.SetField("Subtotal", string.Format("{0:c}", order.TotalAmount - order.Discount));
            fields.SetField("Shipping", string.Format("{0:c}", order.OrderShippings[0].ShippingInfo.ShippingFee));
            fields.SetField("Credit", "-" + string.Format("{0:c}", order.Credit + order.Commission_Credit + order.GCCredit));
            fields.SetField("Coupon", "-" + string.Format("{0:c}", order.CouponValue));
            fields.SetField("GiftCertificate", "-" + string.Format("{0:c}", order.GCCredit));
            fields.SetField("Tax", string.Format("{0:c}", order.Tax));
            fields.SetField("Total", string.Format("{0:c}", order.TotalAmount + order.Tax - order.Credit + order.OrderShippings[0].ShippingInfo.ShippingFee - order.CouponValue - order.Discount - order.GCCredit - order.Commission_Credit));
            if (string.IsNullOrEmpty(dueDate))
            {
                dueDate = new Suryani.Commerce.Core.Order_Mgmt.Order_Manager().GetDueDateByOrderId(order.OrderId);
                if (string.IsNullOrEmpty(dueDate))
                    dueDate = "Upon Receipt";
            }
            if (!dueDate.Equals("Paid"))
            {
                fields.SetField("msg1", "Please make check payable to \"Quidsi Retail LLC.\" and send to:");
                fields.SetField("msg2", catalogName);
                fields.SetField("msg3", "ATTN Accounts Receivable");
                fields.SetField("msg4", "10 Exchange PL, 25th FL");
                fields.SetField("msg5", "Jersey City, NJ 07302");
            }
        }

        private bool SendEmail(string fileName, string email, string templatePath, bool isSendToCustomer, int orderId, int shipmentId,int catalogID,int times)
        {
            string subject = string.Empty;
            string body = string.Empty;
            string from = string.Empty;
            if (isSendToCustomer)
            {
                if (times>1)
                {
                    DataTable customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(USER_TEMPLATE_NAME_POREINVOICE);
                    if (customerTemplate != null && customerTemplate.Rows.Count > 0)
                    {
                        string title = new CatalogManager().GetCatalogCode(catalogID);
                        if (!string.IsNullOrEmpty(title))
                        {
                            title = title + ".com";
                        }
                        //if(catalogID==2)
                        //{
                        //    title="Soap.com";
                        //}
                        //else if(catalogID==3)
                        //{
                        //    title="BeautyBar.com";
                        //}
                        //else if(catalogID==4)
                        //{
                        //    title="Wag.com";
                        //}
                        //else if(catalogID==5)
                        //{
                        //    title="Yoyo.com";
                        //}
                        //else
                        //{
                        //    title="Diapers.com";
                        //}
                        from =customerTemplate.Rows[0]["FromEmailAddress"].ToString();
                        subject = customerTemplate.Rows[0]["Subject"].ToString();
                        body = string.Format(customerTemplate.Rows[0]["Body"].ToString(), title);     
                    }
                }
                else
                {
                DataTable customerTemplate = GetInvoiceTemplate(catalogID);
                string fromAddres = "";
                if (SiCommerce.Intranet.Security.Secure.IsPOTeam())
                {
                    fromAddres = "purchase.orders@diapers.com";
                }
                if (customerTemplate != null && customerTemplate.Rows.Count > 0)
                {   
                    from = string.IsNullOrEmpty(fromAddres) ? customerTemplate.Rows[0]["FromEmailAddress"].ToString() : fromAddres; ;
                    fromAddres=string.IsNullOrEmpty(fromAddres)?customerTemplate.Rows[0]["ReplyTo"].ToString():fromAddres;
                    subject = customerTemplate.Rows[0]["Subject"].ToString();
                    body = string.Format(customerTemplate.Rows[0]["Body"].ToString(),fromAddres,fromAddres);     
                }
                }
            }
            else
            {
                DataTable userTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(USER_TEMPLATE_NAME);
                string trackingNumber = new Suryani.Commerce.Core.Shipping_Mgmt.ShipmentData().GetTrackingNumberByShipmentId(shipmentId);
                if (userTemplate != null && userTemplate.Rows.Count > 0)
                {
                    subject = string.Format(userTemplate.Rows[0]["Subject"].ToString(), orderId.ToString(), trackingNumber);
                    body = string.Format(userTemplate.Rows[0]["Body"].ToString(), orderId, trackingNumber);
                }
            }
            if (!string.IsNullOrEmpty(subject) && !string.IsNullOrEmpty(body) && !string.IsNullOrEmpty(from))
            {
                new MailManager().BeginInvoiceSend(from, email, string.Format("{0}\\{1}", templatePath, fileName), subject, body);
                return true;
            }
            return false;
        }

        public string GenerateClaimsInvoice(int orderId, string templatePath, string filePath, string filename)
        {
            if (orderId != -1)
            {
                CatalogID = GetOrderCatalog(orderId);
                SentTime = 1;
                //get catalog info
                DataTable catalog = new CatalogManager().GetAllCatalog();
                DataRow[] row = catalog.Select("CatalogId='" + CatalogID + "'");
                string contractPhoneInfo = row[0]["AddressToName"].ToString() + ": " + row[0]["ShipperPhone"].ToString();
                string catalogName = row[0]["catalogName"].ToString();

                string fileName = filename;
                //sendResultLable.InnerText = "";
                Suryani.Commerce.Core.Order_Mgmt.Order order = new Suryani.Commerce.Core.Order_Mgmt.Order_Manager().GetOrder(orderId);
                string trackingNumber = string.Empty;
                bool isNotPaid = CheckPOOrderPaid(order);
                if (order != null && order.OrderItems != null && order.OrderItems.Rows.Count > 0)
                {
                    Document document = null;
                    FileStream invoicePdfStream = null;
                    PdfCopy copy = null;
                    PdfReader template1 = null;
                    PdfReader template2_1 = null;
                    PdfReader template2_2 = null;
                    PdfStamper stamper = null;
                    AcroFields fields = null;
                    try
                    {
                        document = new Document();
                        invoicePdfStream = new FileStream(string.Format("{0}\\{1}", filePath, fileName), FileMode.Create);
                        copy = new PdfCopy(document, invoicePdfStream);
                        copy.SetFullCompression();
                        copy.CloseStream = true;
                        document.Open();
                        //judge orderitems first,if the num of orderItems less than 16,we use template1
                        //or we use template 2_1(29 rows) and template 2_2(15 rows), and how many template 2_1 will used result with this num.
                        if (order.OrderItems.Rows.Count <= 16)
                        {
                            template1 = GetTemplateByCatalogId(templatePath, 1);
                            MemoryStream invoiceStream = new MemoryStream();
                            stamper = new PdfStamper(template1, invoiceStream);
                            stamper.SetFullCompression();
                            fields = stamper.AcroFields;
                            if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                            {
                                FillBillToAndShipTo(order, fields, contractPhoneInfo, "", SentTime);
                                //Order List
                                int rowIndex = 0;
                                foreach (DataRow orderItem in order.OrderItems.Rows)
                                {
                                    FillOneOrderItem(fields, rowIndex, orderItem);
                                    rowIndex++;
                                }
                                FillTotal(order, fields,catalogName,"");
                            }
                            stamper.FormFlattening = true;
                            stamper.Close();
                            template1 = new PdfReader(invoiceStream.ToArray());
                            template1.RemoveUnusedObjects();
                            copy.AddPage(copy.GetImportedPage(template1, 1));
                        }
                        else
                        {
                            template2_1 = GetTemplateByCatalogId(templatePath, 2);
                            template2_2 = GetTemplateByCatalogId(templatePath, 3);
                            int template2_1Num = order.OrderItems.Rows.Count / 29;
                            bool isNeedReserve = false;
                            if (order.OrderItems.Rows.Count % 29 > 15)
                            {
                                template2_1Num += 1;
                                isNeedReserve = true;
                            }
                            if (order.OrderItems.Rows.Count % 29 == 0)
                            {
                                isNeedReserve = true;
                            }
                            int totalItemsOfTemp2_1 = order.OrderItems.Rows.Count;
                            if (isNeedReserve)
                            {
                                totalItemsOfTemp2_1 -= 2;
                            }
                            for (int i = 0; i < template2_1Num; i++)  //how many template2_1 will used
                            {
                                template2_1 = GetTemplateByCatalogId(templatePath, 2);
                                MemoryStream template2_1InvoiceStream = new MemoryStream();
                                stamper = new PdfStamper(template2_1, template2_1InvoiceStream);
                                stamper.SetFullCompression();
                                //begin to fill fields
                                fields = stamper.AcroFields;
                                if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                                {
                                    FillBillToAndShipTo(order, fields, contractPhoneInfo, "",SentTime);
                                    //Order List
                                    int rowIndex = 0;
                                    int pageNst = i * 29;
                                    for (int j = i * 29; j < (pageNst + 29) && j < totalItemsOfTemp2_1; j++)
                                    {
                                        DataRow orderItem = order.OrderItems.Rows[j];
                                        FillOneOrderItem(fields, rowIndex, orderItem);
                                        rowIndex++;
                                    }
                                    fields.SetField("CurrentPage", (i + 1).ToString());
                                    fields.SetField("TotalPage", (template2_1Num + 1).ToString());
                                }
                                stamper.FormFlattening = true;
                                stamper.Close();
                                template2_1 = new PdfReader(template2_1InvoiceStream.ToArray());
                                template2_1.RemoveUnusedObjects();
                                copy.AddPage(copy.GetImportedPage(template2_1, 1));
                            }
                            //one template2_2 will used
                            MemoryStream template2_2InvoiceStream = new MemoryStream();
                            stamper = new PdfStamper(template2_2, template2_2InvoiceStream);
                            stamper.SetFullCompression();
                            fields = stamper.AcroFields;
                            if (order.OrderShippings != null && order.OrderShippings.Length > 0)
                            {
                                FillBillToAndShipTo(order, fields, contractPhoneInfo, "", SentTime);
                                //Order List
                                if (order.OrderItems.Rows.Count % 29 <= 15 && order.OrderItems.Rows.Count % 29 > 0)
                                {
                                    int rowIndex = order.OrderItems.Rows.Count % 29 - 1;
                                    int lastRowIndex = order.OrderItems.Rows.Count - 1;
                                    if (rowIndex >= 0)
                                    {
                                        for (int k = rowIndex; k >= 0; k--)
                                        {
                                            DataRow orderItem = order.OrderItems.Rows[lastRowIndex];
                                            FillOneOrderItem(fields, rowIndex, orderItem);
                                            rowIndex--;
                                            lastRowIndex--;
                                        }
                                    }
                                }
                                else  //reserve 2 records for InvoiceTemplate2_2
                                {
                                    int rowIndex = 0;
                                    for (int i = order.OrderItems.Rows.Count - 2; i < order.OrderItems.Rows.Count; i++)
                                    {
                                        DataRow orderItem = order.OrderItems.Rows[i];
                                        FillOneOrderItem(fields, rowIndex, orderItem);
                                        rowIndex++;
                                    }
                                }
                                fields.SetField("CurrentPage", (template2_1Num + 1).ToString());
                                fields.SetField("TotalPage", (template2_1Num + 1).ToString());
                                FillTotal(order, fields,catalogName,"");
                            }
                            stamper.FormFlattening = true;
                            stamper.Close();
                            template2_2 = new PdfReader(template2_2InvoiceStream.ToArray());
                            template2_2.RemoveUnusedObjects();
                            copy.AddPage(copy.GetImportedPage(template2_2, 1));
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    finally
                    {
                        document.Close();
                        if (invoicePdfStream != null)
                        {
                            invoicePdfStream.Close();
                        }
                        if (template1 != null)
                        {
                            template1.Close();
                        }
                        if (template2_1 != null)
                        {
                            template2_1.Close();
                        }
                        if (template2_2 != null)
                        {
                            template2_2.Close();
                        }
                    }
                }
                else
                {
                    throw new Exception("No order item to print.");
                }
            }
            return "";
        }

        private int GetOrderCatalog(int orderId)
        {
            Order order = new Order_Manager().GetOrder(orderId);
            if (order != null)
            {
                return order.PlacedCatalogId;
            }
            return 1;
        }
        private int GetPoOrderInvoiceTimes(int orderId)
        {
            int times = 1;
            times = new Order_Manager().GetPoInvoiceTimes(orderId);
            return times;
        }

        /// <summary>
        /// Harry on Dec/22/2010
        /// if catalogID = 1, then diapers template
        /// if catalogID = 2, then soap template
        /// if catalogID = 3, then bb template
        /// if whichTemplate = 1, use template 1
        /// if whichTemplate = 2, use template 2_1
        /// if whichtemplate = 3, use template 2_2
        /// </summary>
        /// <param name="templatePath"></param>
        /// <param name="whichTemplate"></param>
        /// <returns></returns>
        private PdfReader GetTemplateByCatalogId(string templatePath, int whichTemplate)
        {
            PdfReader pdfReader = null;
            string templateName = string.Empty;
            if (CatalogID == 1)
            {
                if (whichTemplate == 1)
                {
                    templateName = "InvoiceTemplate1_Diapers.pdf";
                }
                else if (whichTemplate == 2)
                {
                    templateName = "InvoiceTemplate2_1_Diapers.pdf";
                }
                else if (whichTemplate == 3)
                {
                    templateName = "InvoiceTemplate2_2_Diapers.pdf";
                }
            }
            else if (CatalogID == 2)
            {
                if (whichTemplate == 1)
                {
                    templateName = "InvoiceTemplate1_Soap.pdf";
                }
                else if (whichTemplate == 2)
                {
                    templateName = "InvoiceTemplate2_1_Soap.pdf";
                }
                else if (whichTemplate == 3)
                {
                    templateName = "InvoiceTemplate2_2_Soap.pdf";
                }
            }
            else if (CatalogID == 3)
            {
                if (whichTemplate == 1)
                {
                    templateName = "InvoiceTemplate1_BeautyBar.pdf";
                }
                else if (whichTemplate == 2)
                {
                    templateName = "InvoiceTemplate2_1_BeautyBar.pdf";
                }
                else if (whichTemplate == 3)
                {
                    templateName = "InvoiceTemplate2_2_BeautyBar.pdf";
                }
            }
            else if (CatalogID == 4)
            {
                if (whichTemplate == 1)
                {
                    templateName = "InvoiceTemplate1_Wag.pdf";
                }
                else if (whichTemplate == 2)
                {
                    templateName = "InvoiceTemplate2_1_Wag.pdf";
                }
                else if (whichTemplate == 3)
                {
                    templateName = "InvoiceTemplate2_2_Wag.pdf";
                }
            }
            else if (CatalogID == 5)
            {
                if (whichTemplate == 1)
                {
                    templateName = "InvoiceTemplate1_Yoyo.pdf";
                }
                else if (whichTemplate == 2)
                {
                    templateName = "InvoiceTemplate2_1_Yoyo.pdf";
                }
                else if (whichTemplate == 3)
                {
                    templateName = "InvoiceTemplate2_2_Yoyo.pdf";
                }
            }
            else if(CatalogID==6)
            {
                if(whichTemplate==1)
                {
                    templateName = "InvoiceTemplate1_Casa.pdf";
                }
                else if(whichTemplate==2)
                {
                    templateName = "InvoiceTemplate2_1_Casa.pdf";
                }
                else if(whichTemplate==3)
                {
                    templateName = "InvoiceTemplate2_2_Casa.pdf";
                }
            }
            pdfReader = new PdfReader(string.Format("{0}\\" + templateName, templatePath));
            return pdfReader;
        }

        private DataTable GetInvoiceTemplate(int catalogID)
        {
            DataTable customerTemplate = null;
            if (catalogID == 1)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(DIAPERS_CUSTOMER_TEMPLATE_NAME);
            }
            else if (catalogID == 2)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(SOAP_CUSTOMER_TEMPLATE_NAME);
            }
            else if (catalogID == 3)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(BEAUTYBAR_CUSTOMER_TEMPLATE_NAME);
            }
            else if (catalogID == 4)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(WAG_CUSTOMER_TEMPLATE_NAME);
            }
            else if (catalogID == 5)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(YOYO_CUSTOMER_TEMPLATE_NAME);
            }
            else if (catalogID == 6)
            {
                customerTemplate = new Suryani.Commerce.Core.Manager.TemplateManager().GetCustomerEmailTemplateForHoldOrderReport(CASA_CUSTOMER_TEMPLATE_NAME);
            }
            return customerTemplate;
        }
    }

  • 相关阅读:
    Odoo中的Widget
    Odoo中的domain
    Odoo中的模型详解
    Odoo中的模型继承、视图继承、Qweb模板继承详解
    Odoo权限控制详解
    Odoo字段类型详解
    WSGI——python web 服务器网关接口
    Backbone——数据驱动UI的js开发模式
    Underscore——JS函数库
    Werkzeug——python web开发工具包
  • 原文地址:https://www.cnblogs.com/scottpei/p/2442785.html
Copyright © 2011-2022 走看看