using System; using System.Globalization; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using iTextSharp; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using Acumatica.Default_20_200_001.Model; namespace uri_import.PClasses { public class PDFHelper { private static string _note = "<200# USE UPS 3RD PARTY ACCT# 266E8F>\n200# USE LTL ROUTING GUIDE- - - - - - - -828-485-5145\nhttp://routeshipment.com/R9322/\nBill to: United Rentals, INC\nC/O TRANSPORTATION INSIGHT\nPO BOX 23000\nHICKORY, NC 28601\nEMAIL LOADCENTER@UR.COM"; private static List RemoveLine(List list, string contains) { string line = list.Find(x => x.ToUpper().Contains(contains.ToUpper())); if (line != null) list.Remove(line); return list; } private static List RemovePhoneAndFax(List list) { string line = list.Find(x => x.ToUpper().Contains("PHONE:")); if (line != null) list.Remove(line); line = list.Find(x => x.ToUpper().Contains("FAX")); if (line != null) { int index = list.FindIndex(x => x == line); Regex regex = new Regex(@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"); string faxLine = list[index + 1]; if (regex.IsMatch(faxLine)) { list.Remove(line); list.Remove(faxLine); } else list.Remove(line); } return list; } private static SalesOrder CityStateZip(ref List lines, SalesOrder order) { int index = 0; int numIndexes = 2; Regex rCSZ = new Regex(@"^.*(\s\s\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}).*$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); foreach (string line in lines) { if (rCSZ.IsMatch(line)) { DateTime dt; index = lines.FindIndex(x => x == line); if (DateTime.TryParse(lines[index - 4], out dt)) { numIndexes = 3; order.ShipToAddress = new Address(); order.ShipToAddress.AddressLine1 = lines[index - 3].Trim(); order.ShipToAddress.AddressLine2 = string.Format("{0}\r\n{1}", lines[index - 2].Trim(), lines[index - 1].Trim()); string[] csz = line.Split(','); order.ShipToAddress.City = csz[0].Trim(); csz[1] = csz[1].Replace(" ", "|"); string[] sz = csz[1].Trim().Split('|'); order.ShipToAddress.State = sz[0].Trim(); order.ShipToAddress.PostalCode = sz[1].Trim(); break; } else { order.ShipToAddress = new Address(); order.ShipToAddress.AddressLine1 = lines[index - 2].Trim(); order.ShipToAddress.AddressLine2 = lines[index - 1].Trim(); string[] csz = line.Split(','); order.ShipToAddress.City = csz[0].Trim(); csz[1] = csz[1].Replace(" ", "|"); string[] sz = csz[1].Trim().Split('|'); order.ShipToAddress.State = sz[0].Trim(); order.ShipToAddress.PostalCode = sz[1].Trim(); break; } } } string pc = order.ShipToAddress.PostalCode.Value; pc = pc.Replace("-", ""); int i = 0; bool result = int.TryParse(pc, out i); if (result) order.ShipToAddress.Country = "US"; else order.ShipToAddress.Country = "CA"; for (int r = index; r >= numIndexes; r--) { lines.RemoveAt(r); } string startLine = lines.Find(x => x.Trim().StartsWith("Qty")); if (startLine != null) { index = lines.IndexOf(startLine); for (int iIndex = index; iIndex >= 0; iIndex--) { lines.RemoveAt(iIndex); } } return order; } private static SalesOrder GetDetails(SalesOrder order, ref List lines) { order.Details = new List(); int lrNumb = 1; for (int i = 0; i < lines.Count; i++) { string line = lines[i].Trim().Substring(0, 3).Trim(); int isInt = 0; if (int.TryParse(line, out isInt)) { try { lines[i] = Regex.Replace(lines[i], @"\s+", "|"); string[] clmns = lines[i].Split('|'); SalesOrderDetail detail = new SalesOrderDetail(); detail.OrderQty = int.Parse(clmns[0].Trim()); detail.InventoryID = clmns[1].Trim(); detail.LineNbr = lrNumb; detail.RowNumber = lrNumb; order.Details.Add(detail); lrNumb = lrNumb + 1; } catch { } } } return order; } private static SalesOrder FindThePhoneNumber(ref List list, SalesOrder order) { bool found = false; Regex regex = new Regex(@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"); foreach (string line in list) { string[] segments = line.Split(' '); foreach (string segment in segments) { string s = segment.Trim(); if (regex.IsMatch(s)) { order.ShipToContact = new DocContact(); order.ShipToContact.Phone1 = s; found = true; break; } } if (found) { list.Remove(line); break; } } return order; } public static SalesOrder PDFBuildSalesOrder(List lines) { SalesOrder order = new SalesOrder(); for (int l = 0; l < lines.Count; l++) { lines[l] = lines[l].Trim(); } lines = RemoveLine(lines, "PURCHASE ORDER"); lines = RemoveLine(lines, "179054"); lines = RemoveLine(lines, "RPM INDUSTRIES LLC"); lines = RemoveLine(lines, "Purchase Order Number"); lines = RemoveLine(lines, "1660 JEFFERSON AVE"); lines = RemoveLine(lines, "WASHINGTON, PA 15301"); lines = RemoveLine(lines, "ORDER DATE:"); lines = RemoveLine(lines, "Phone "); lines = RemoveLine(lines, "ORDERED BY:"); lines = RemoveLine(lines, "LOCATION #:"); lines = RemoveLine(lines, "Fax "); lines = RemoveLine(lines, "ADDRESS"); lines = RemoveLine(lines, "DO NOT SHIP TO"); lines = RemoveLine(lines, "STAMFORD, CT 06902"); lines = RemoveLine(lines, "SEE BELOW"); lines = RemoveLine(lines, "THE FOLLOWING MUST APPEAR"); lines = RemoveLine(lines, "SHIPPING PAPERS"); lines = RemovePhoneAndFax(lines); order.CustomerOrder = lines[0]; DateTime orderDate = DateTime.Parse(lines[1].Trim()); order.Date = DateTime.Parse(lines[1]); if (orderDate.Day > 15) { orderDate = orderDate.AddMonths(1); int lastDay = DateTime.DaysInMonth(orderDate.Year, orderDate.Month); orderDate = new DateTime(orderDate.Year, orderDate.Month, lastDay); if (orderDate.DayOfWeek == DayOfWeek.Sunday) orderDate = new DateTime(orderDate.Year, orderDate.Month, orderDate.Day - 2); if (orderDate.DayOfWeek == DayOfWeek.Saturday) orderDate = new DateTime(orderDate.Year, orderDate.Month, orderDate.Day - 1); } else { int lastDay = DateTime.DaysInMonth(orderDate.Year, orderDate.Month); orderDate = new DateTime(orderDate.Year, orderDate.Month, lastDay); if (orderDate.DayOfWeek == DayOfWeek.Sunday) orderDate = new DateTime(orderDate.Year, orderDate.Month, orderDate.Day - 2); if (orderDate.DayOfWeek == DayOfWeek.Saturday) orderDate = new DateTime(orderDate.Year, orderDate.Month, orderDate.Day - 1); } order.CustomerID = "000000001433"; order.RequestedOn = orderDate; FindThePhoneNumber(ref lines, order); order.ShipToAddressOverride = true; order = CityStateZip(ref lines, order); order.Note = _note; order = GetDetails(order, ref lines); return order; } public static List PDFLinesToText(string filePath) { List list = new List(); using (PdfReader reader = new PdfReader(filePath)) { StringBuilder text = new StringBuilder(); ITextExtractionStrategy Strategy = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy(); for (int i = 1; i <= reader.NumberOfPages; i++) { string page = ""; page = PdfTextExtractor.GetTextFromPage(reader, i, Strategy); string[] lines = page.Split('\n'); list.AddRange(lines); } } return list; } } public class SBTextRenderer : IRenderListener { private StringBuilder _builder; public SBTextRenderer(StringBuilder builder) { _builder = builder; } #region IRenderListener Members public void BeginTextBlock() { Console.Write("Begin Text Block"); } public void EndTextBlock() { Console.Write("End Text Block"); } public void RenderImage(ImageRenderInfo renderInfo) { } public void RenderText(TextRenderInfo renderInfo) { _builder.Append(renderInfo.GetText()); } #endregion } }