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