//Парсим выходную таблицу public void ParseBomDataTable() { //Открываем "виртуальный" PdfDoc using (PdfDocument PdfDoc = new PdfDocument(new PdfReader(FilePath))) { //Итерируем по каждой паре ключ-значение в словаре DrawingElementsCoords foreach (var kvp in DrawingElementsCoords) { //Определяем прямоугольник по координатам значения словаря Rectangle Rectan = new Rectangle(kvp.Value[0], kvp.Value[1], kvp.Value[2], kvp.Value[3]); //Извлекаем текст из прямоугольника string AreaText = GetTextFromArea(PdfDoc, Rectan); //Задаем значение по-умоланию для столбца, который называется так же как извлекаемая область BomDataTable.Columns[kvp.Key].DefaultValue = AreaText; //Заполняем словарь DrawingElements полученным значением DrawingElements[kvp.Key] = AreaText; } } //Выбрать индексы строк, которые являются началом описания компонента //Это те строки в Parameters, которые не пустые var NewComponentIndexes = Parameters.Select((v, i) => new { Index = i, Value = v }) .Where(r => !string.IsNullOrWhiteSpace(r.Value)).Select(r => r.Index).ToArray(); //По каждому индексу foreach (var index in NewComponentIndexes) { //Вычисляем следующий индекс, чтобы понять, до какой строки продолжается описание текущего компонента //Если следующего индекса нет, значит это последний компонент, и нужно брать строки до конца списка var next_index = NewComponentIndexes.Where(r => r > index).Any() ? NewComponentIndexes.Where(r => r > index).First() : Parameters.Count - 1; //Среди списка строк Components выбрать индекс строки и значение строки... var ComponentDescriptionStrings = Components.Select((v, i) => new { Index = i, Value = v }) .Where(r => r.Index >= index & r.Index < next_index) //.. где индекс строки >= индекс строки начала описания текущего компонента И < индекса следующего компонента .Where(r => !IsComponentCategory(r.Value)) // где строка не является категорией компонента .Select(r => r.Value).ToArray(); //Выбрать значение этих строк в массив //Полученный массив склеить в строку var ComponentDescription = string.Join(" ", ComponentDescriptionStrings).Trim(); //Получить категорию компонента //Это первая строка до начала описания текущего компонента, которая является категорий компонента var ComponentCategory = Components.Select((v, i) => new { Index = i, Value = v }) .Where(r => r.Index < index & IsComponentCategory(r.Value)) .Last().Value; //Создаём новый ряд нашей таблицы и добавляем все данные var row = BomDataTable.NewRow(); row["Номенклатура"] = ComponentDescription; row["Категория компонента"] = ComponentCategory; var ParametersList = Parameters[index].Split(null).ToList(); row["ММ"] = ParametersList[0].Trim(); row["Идент. код"] = ParametersList[1].Trim(); row["Количество"] = ParametersList[2].Trim(); //Задаем Ед. изм согласно условиям ТЗ row["Ед. изм"] = ParametersList.Count == 4 ? ParametersList[3].Trim() : "PIECE"; BomDataTable.Rows.Add(row); } }
protected override void Execute(CodeActivityContext context) { var BOME = new BOM_Extractor { FilePath = PdfPath.Get(context) }; BOME.ExtractRawData(); BOME.ParseBomDataTable(); BomDataTable.Set(context, BOME.BomDataTable); DrawingElements.Set(context, BOME.DrawingElements); }