示例#1
0
        public string CreatePDF(int poid)
        {
            var po = OrderRepository.Single(poid);

            if (po == null)
            {
                throw new ItemNotFoundException <Ordering.PurchaseOrder>(x => x.POID, poid);
            }

            var basePath = ConfigurationManager.AppSettings["PdfBasePath"];

            if (string.IsNullOrEmpty(basePath))
            {
                throw new InvalidOperationException("Missing required appSetting: PdfBasePath");
            }

            if (!Directory.Exists(basePath))
            {
                throw new InvalidOperationException($"Directory not found: {basePath}");
            }

            string tempPath = Path.Combine(basePath, "temp");

            if (!Directory.Exists(tempPath))
            {
                Directory.CreateDirectory(tempPath);
            }

            string imagePath = Path.Combine(basePath, "images");

            if (!Directory.Exists(imagePath))
            {
                Directory.CreateDirectory(imagePath);
            }

            string template = Path.Combine(basePath, "IOFTemplate.pdf");

            if (!File.Exists(template))
            {
                throw new InvalidOperationException($"Missing template file: {template}");
            }

            string templatePage2 = Path.Combine(basePath, "IOFTemplatePage2.pdf");

            if (!File.Exists(templatePage2))
            {
                throw new InvalidOperationException($"Missing template page 2 file: {templatePage2}");
            }

            var c = ClientRepository.Single(po.ClientID);

            string pdfName = $"IOF_{po.POID}_{c.LName}{c.FName}_{DateTime.Now:yyMmddHHmmss}.pdf";
            string pdfPath = Path.Combine(tempPath, pdfName);

            if (File.Exists(pdfPath))
            {
                File.Delete(pdfPath);
            }

            using (var fs = new FileStream(pdfPath, FileMode.Create, FileAccess.Write))
            {
                PdfReader  pr = new PdfReader(template);
                PdfStamper ps = new PdfStamper(pr, fs);
                AcroFields af = ps.AcroFields;

                var info = pr.Info;
                info["Title"] = $"IOF #{po.POID} : {po.VendorName} : {c.FName} {c.LName}";
                ps.MoreInfo   = info;

                using (var ms = new MemoryStream())
                {
                    var xmp = new XmpWriter(ms, info);
                    ps.XmpMetadata = ms.ToArray();
                    xmp.Close();
                }

                af.SetField("poID", $"IOF # {po.POID}");
                af.SetField("RequestedBy", c.DisplayName);
                af.SetField("Email", c.Email);
                af.SetField("Phone", c.Phone);

                var approver = ClientRepository.GetApprover(po);

                if (po.IsApproved())
                {
                    string imageFile = Path.Combine(imagePath, $"{approver.LName}.tif");
                    if (File.Exists(imageFile))
                    {
                        var sig = Image.GetInstance(imageFile);
                        ps.GetOverContent(1).AddImage(sig, 50, 0, 0, 24, 231, 539);
                    }
                    af.SetField("ApprovedBy", approver.DisplayName);
                }

                // fill in shipping info
                af.SetField("Date", po.CreatedDate.ToShortDateString());
                af.SetField("DateNeeded", po.NeededDate.ToShortDateString());
                af.SetField("Advisor", approver.DisplayName);
                af.SetField("Shipping", po.ShippingMethodName);

                var acct = AccountRepository.Single(po.ClientID, po.AccountID);

                if (acct == null)
                {
                    af.SetField("Account", string.Empty);
                }
                else
                {
                    af.SetField("Account", acct.ShortCode);
                }

                if (po.Oversized)
                {
                    af.SetField("chkOverSized", "Yes");
                }
                af.SetField("PurchaseTotal", po.TotalPrice.ToString("#,##0.00"));

                // fill in vendor info
                var vendor = VendorRepository.Single(po.VendorID);
                af.SetField("Vendor", vendor.VendorName);
                af.SetField("VendAddr1", vendor.Address1);
                af.SetField("VendAddr2", vendor.Address2);
                af.SetField("VendAddr3", vendor.Address3);
                af.SetField("Contact", vendor.Contact);
                af.SetField("ContactPhone", vendor.Phone);
                af.SetField("ContactFax", vendor.Fax);
                af.SetField("VendorWWW", vendor.URL);
                af.SetField("ContactEmail", vendor.Email);

                // in the 'office use only' box
                af.SetField("VendorOffice", vendor.VendorName);

                // notes
                var items = GetItems(po.POID).ToList();

                if (!string.IsNullOrEmpty(po.Notes))
                {
                    items.Add(new PdfItem()
                    {
                        Description = po.Notes, IsNotes = true
                    });
                }

                // items
                int   x          = 0;
                float y          = 410F; //page 1 starting position
                int   pageNumber = 1;
                float width      = pr.GetPageSize(pageNumber).Width - x;

                //DrawLine(ps.GetOverContent(page), 280)

                foreach (var item in items.OrderByDescending(i => i.PODID))
                {
                    var tbl = CreateTable(item, width);
                    if (pageNumber < 2)
                    {
                        if (y + tbl.TotalHeight < 280)
                        {
                            pageNumber = 2;
                            y          = 580; //page 2 starting position
                            ps.InsertPage(pageNumber, pr.GetPageSize(1));
                            var p2reader = new PdfReader(templatePage2);
                            ps.ReplacePage(p2reader, 1, 2);
                            ps.Writer.FreeReader(p2reader);
                            p2reader.Close();

                            //DrawLine(ps.GetOverContent(page), 60)
                        }
                    }
                    else
                    {
                        if (y + tbl.TotalHeight < 60)
                        {
                            pageNumber += 1;
                            y           = 580; //page n starting position
                            ps.InsertPage(pageNumber, pr.GetPageSize(1));
                            var p2reader = new PdfReader(templatePage2);
                            ps.ReplacePage(p2reader, 1, pageNumber);
                            ps.Writer.FreeReader(p2reader);
                            p2reader.Close();

                            //DrawLine(ps.GetOverContent(page), 60)
                        }
                    }

                    var ct = new ColumnText(ps.GetOverContent(pageNumber))
                    {
                        Alignment = Element.ALIGN_LEFT
                    };

                    ct.SetSimpleColumn(x, y, width, y + 100);
                    ct.AddElement(tbl);
                    ct.Go();
                    y -= tbl.TotalHeight;
                }

                AddPageNumberFooter(ps, pr.NumberOfPages, width);

                ps.FormFlattening = true;
                ps.Close();
            }

            return(pdfPath);
        }