Перевантажуємо дані з XPS обробку 1С без OCR

Доброго часу доби.

Зіткнувся, значить, з такою проблемою. Є обробка в 1С 8.2 і туди треба запхати в автоматичному режимі купу даних. Купа даних перебувала у своїй базі даних, у своїй архітектурі і підключити базу до 1С або переформатувати таблиці не представлялося можливим. Єдиний спосіб, як мені здалося, вивести таблицю на віртуальний принтер, а звідти і танцювати почнемо.

Отже, маємо документ у форматі *.xps, який нам дав турботливий віртуальний принтер:



Власне, з цього все, мені потрібні тільки рядки самої роботи, рядки подработ (починаються зі знака "-") і колонка норми часу для кожної роботи. Спочатку я подумав, що формат XPS графічний і доведеться отриманий файл заганяти в будь-яку програму OCR, там розпізнавати таблиці та зберігати дані у форматі Excel. Спочатку так і сталося, але є величезні мінуси:

— ні автоматизації процесу при конвертуванні XPS -> 1C.
— OCR програми можуть накосячілі в розпізнаванні тексту.
— процес конвертації займає багато часу.

Тому довелося розбиратися з форматом XPS безпосередньо.

Власне, як виявляється, формат XPS — це звичайний ZIP-файл. Вся інформація там знаходиться у вигляді XML. Картинки йдуть картинками, текст текстом. Але нам-то текст і потрібен…

Всередині маємо таку картину:



Не буду вдаватися в подробиці і зміст кожної папки — там все просто, якщо цікаво, то можна полазити і самому. Мене конкретно цікавить тільки один файл:
..\ Documents\1\FixedDocument.fdoc
Ось лістинг файлу:

<?xml version="1.0" encoding="UTF-8" ?> 
- <FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06">
<PageContent Source="/Documents/1/Pages/1.fpage" /> 
<PageContent Source="/Documents/1/Pages/2.fpage" /> 
<PageContent Source="/Documents/1/Pages/3.fpage" /> 
<PageContent Source="/Documents/1/Pages/4.fpage" /> 
</FixedDocument>


Як бачимо, тут шляхи до файлів сторінок документа.
Оформляємо це все в код 1С:

Процедура ОсновныеДействияФормыВСправочник(Кнопка) 
РежимДиалога = РежимДиалогаВыбораФайла.Відкриття;
ДиалогВыбора = Новий ДиалогВыбораФайла(РежимДиалога);
ДиалогВыбора.МножественныйВыбор = True;
ДиалогВыбора.Фільтр = "XPS |*.xps";
Якщо ДиалогВыбора.Вибрати() Тоді 
Кількість = ДиалогВыбора.ВыбранныеФайлы.Кількість();

Для С = 0 за Кількість - 1 Цикл 

ПолучитьДанныеХПС(ДиалогВыбора.ВыбранныеФайлы[Стр], ДиалогВыбора.Каталог);
ПерегнатьВСправочник();
КонецЦикла; 
КонецЕсли; 
КонецПроцедуры


Для початку разархивируем вміст файлу в тимчасову папку:

Процедура ПолучитьДанныеХПС (Файл, Каталог) 

КодМарки = СтрЗаменить(Файл, Каталог, "");
КодМарки = СтрЗаменить(КодМарки, ".xps", "");

СоздатьКаталог(Каталог + КодМарки);

ЗИПФайл = Новий ЧтениеZipФайла(Файл);
ЗИПФайл.ИзвлечьВсе(Каталог + КодМарки, РежимВосстановленияПутейФайловZIp.Відновлювати);
ЗИПФайл.Закрити();



Тепер в директорії файлу маємо всі можливості для роботи. Нас цікавить, як писалося вище, список файлів зі сторінками. Перевантажуємо список в таблицю. Працюємо з цим файлом як із звичайним XML:

ФайлХПС = Новий ЧтениеXML;
ФайлХПС.ОткрытьФайл(Каталог + КодМарки + "\Documents\1\FixedDocument.fdoc");
ПутьКФайлу.Очистити();
Нормочасы.Очистити();

Поки ФайлХПС.Прочитати() Цикл 
ФайлХПС.ПрочитатьАтрибут();
Якщо ПроверитьЗначение(ФайлХПС.Значення) Тоді 
ЭлементыФормы.ПутьКФайлу.ДобавитьСтроку(); 
ЭлементыФормы.ПутьКФайлу.ТекущаяСтрока.Шлях = ФайлХПС.Значення;
КонецЕсли;
КонецЦикла;
ФайлХПС.Закрити();


Все, маємо список файлів. Тепер приступаємо до самих файлів. Файл сторінки сам текстовий, але правила написання не XML. Блокова Структура. Блоками окремо пишеться текстова і графічна інформація. Всі блоки мають координати по осі Х і Y, для розташування на сторінці. Мене цікавлять тільки текстові блоки і їх координати, ну і їх інформація.

Блоки мають початок і кінець, зрозуміти де початок і кінець просто: < />
У кожному блоці перше слово — його ім'я. Текстові блоки мають ім'я: Glyphs

Ось приклад блоку:

<Glyphs Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/DD1ED91D-300C-4E84-BACC-6412D0EB3F5F.odttf" FontRenderingEmSize="13.2795" StyleSimulations="Ні" OriginX="971.84" OriginY="59.68" Indices="19,55;26;17;19;21,55;17;21;19;20,55;24" UnicodeString="07.02.2015" />


Мене цікавлять тут тільки параметри:

— OriginX, для визначення колонок.
— UnicodeString значення того, що міститься в рядку.

Читати доведеться як звичайний текстовий файл. Текстові блоки все пишуться одним рядком. В 1С можна прочитати рядок до символу перекладу коретки:

ФайлХПС = Новий ЧтениеТекста(Файл, КодировкаТекста.UTF8); 
Стр = ФайлХПС.ПрочитатьСтроку();
Поки Стор <> Визначено Цикл 
СтруктураПараметров = ПроверитьИмяПараметра©;
...

А отриманий рядок перевіряємо на параметр, якщо починається на Glyphs, то беремо на перевірку та аналіз, якщо немає — читаємо наступний.

Доведеться рядок аналізувати буквально і переписувати структуру.

Функція ВозвратитьРеквизитыПараметра(Рядок)
Змінн
ИмяПараметра, КоординатыПараметра; 
ИмяПараметра = "";
КоординатыПараметра = "";
Лапки = """";
СтруктураПараметров = Новий Структура;
Якщо Знайти(Рядок, "UnicodeString") > 0 Тоді 

Для Х = Знайти(Рядок, "UnicodeString") + 15 за СтрДлина(Рядок) Цикл 
Буква = Середовищ(Рядок, Х, 1);
Якщо Літера <> """" Тоді 
ИмяПараметра = ИмяПараметра + Буква;
Інакше 
СтруктураПараметров.Вставити("ИмяПараметра", ИмяПараметра);
КонецЕсли;
КонецЦикла; 

Для Х = Знайти(Рядок, "OriginX") + 9 по СтрДлина(Рядок) Цикл 
Буква = Середовищ(Рядок, Х, 1);
Якщо Літера <> Лапки Тоді 
КоординатыПараметра = КоординатыПараметра + Буква;
Інакше 
СтруктураПараметров.Вставити("КоординатыПараметра", Число(КоординатыПараметра));
Повернення СтруктураПараметров;
КонецЕсли;
КонецЦикла; 
КонецЕсли; 
Повернення СтруктураПараметров;
КонецФункции

Власне, за виконання функції, маємо все для аналізу. Ім'я параметра, його координати, значення параметра. Блоки виводять текст у XPS зверху вниз і зліва направо. По координатах Х можна визначити колонки, по назві параметра можемо проаналізувати яка інформація нам потрібна, а яка ні. Далі розписувати як воно все йшло в довідник 1С не буду — там і так все зрозуміло. Головне, я отримав відповідь як швидко отримати потрібну інформацію з «графічного файлу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.