Ejemplo n.º 1
0
        //Парсим выходную таблицу
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }