Работа с файлом PDF из 1С

Программирование - Практика программирования

69
Чтение текста из PDF, разделение на страницы многостраничного файла PDF и выгрузка данных PDF файла.

Всем привет!!! Как-то мне поступило задание прикреплять PDF файлы к документам в 1С, при том что было много документов и один многостраничный PDF файл, который необходимо было разделять на странички и каждая страница соответствовала определенному документу. Естественно мне хотелось автоматизировать полностью весь процесс, чтобы 1с сама разделяла файл PDF на листы, прочитывала каждый лист и сопоставляла его с документом. Я нашла решение и прикрепляю программы, которые мне в этом помогли:)

Программа Pdftk server позволила мне узнать сколько страниц есть в файле PDF:

ИмяИсходногоФайла = _ВыборКаталога; //ПУТЬ К НАШЕМУ МНОГОСТРАНИЧНОМУ ФАЙЛУ PDF
Скрипт = Новый COMОбъект("WScript.Shell");
ИмяКаталогаУтилит = """C:\Program Files (x86)\PDFtk Server\bin\";
КаталогОбмена = "F:\Test\"; //ПУТЬ, ГДЕ СОХРАНИМ ФАЙЛ С ДАННЫМИ О PDF ФАЙЛЕ
		
ИмяФайлаРезультатаInfPDF = КаталогОбмена + "InfPDF.txt";
ТекстКомандыInfPDF = ИмяКаталогаУтилит + "pdftk.exe"" " + ИмяИсходногоФайла + " dump_data output " + """" + ИмяФайлаРезультатаInfPDF + """";
Скрипт.Run(ТекстКомандыInfPDF,0,1);
ФайлАнализа1 = Новый Файл(ИмяФайлаРезультатаInfPDF);
ФайлАнализа1.УстановитьВремяИзменения(ТекущаяДата());
ОбъектInfPDF = Новый ИзвлечениеТекста(ИмяФайлаРезультатаInfPDF);
ТекстInfPDF = ОбъектInfPDF.ПолучитьТекст();
		
Инд = 1;
стр = "";
КоличествоСтраниц = 0;
Пока стр <> "NumberOfPages: " Цикл
   НайтиСтроку = СтрПолучитьСтроку(ТекстInfPDF,Инд);
   Если Лев(НайтиСтроку,13) = "NumberOfPages" Тогда
      RegExp = Новый COMОбъект("VBScript.RegExp");
      RegExp.IgnoreCase = Истина; //Игнорировать регистр 
      RegExp.Global = Истина; //Поиск всех вхождений шаблона 
      RegExp.Pattern = "[^0-9]"; // отбор только чисел
      КоличествоСтраниц = Число(RegExp.Replace(НайтиСтроку, ""));
      Прервать;
   Иначе
      Инд = Инд + 1;
   КонецЕсли;
КонецЦикла;
//В ИТОГЕ МЫ НАШЛИ СТРОКУ ГДЕ ОБОЗНАЧЕНО КОЛИЧЕСТВО СТРАНИЦ, ТАКЖЕ МОЖНО ДОСТАТЬ ДРУГИЕ ДАННЫЕ

Далее программа Pdftk server при помощи команды "cat + "номер страницы"  + output" разбила мне файл PDF по страницам в цикле:

Страница = 1;
Пока Страница <= КоличествоСтраниц Цикл
	ИмяСводногоФайла = "page-" + (Формат(Страница, "ЧЦ=3; ЧВН=")) + ".pdf";        
	ИмяФайлаРезультата = КаталогОбмена + ИмяСводногоФайла;
	ТекстКоманды = ИмяКаталогаУтилит + "pdftk.exe"" " + ИмяИсходногоФайла + " cat " + Страница + " output " + """" + ИмяФайлаРезультата + """";
	Скрипт.Run(ТекстКоманды,0,1);
	ФайлАнализа = Новый Файл(ИмяФайлаРезультата);
	ФайлАнализа.УстановитьВремяИзменения(ТекущаяДата());
	Страница = Страница + 1;
КонецЦикла;

В итоге у меня в папке есть много файлов PDF по одной страничке, теперь мне необходимо прочитать каждый файл при помощи программы PDF2TXT:

Файлы = НайтиФайлы(КаталогОбмена,"*.pdf");
ПутьКPDF2TXT = "C:\Program Files (x86)\PDF2TXT"; 
Для каждого элемент из Файлы Цикл
	ПутьPDF = Элемент.ПолноеИмя;
	pdf = ПутьPDF;
	txt = СтрЗаменить(pdf,"pdf","txt");
	Команд = ПутьКPDF2TXT+"\pdf2txt.exe " + pdf + " " + txt; 
	ЗапуститьПриложение(Команд,,Истина);
	ОбъектТ = Новый ИзвлечениеТекста(txt);
	ТекстФ = ОбъектТ.ПолучитьТекст();
//////ДАЛЬШЕ МОЖЕТЕ ДЕЛАТЬ С ТЕКСТОМ ЧТО ХОТИТЕ, СРАВНИВАЙТЕ, ИЩИТЕ КАКУЮ-ТО ИНФОРМАЦИЮ//////

КонецЦикла;

 

Вот ссылки на программы: 

Pdftk Server

PDF2TXT (на 30 дней)

Решила дополнить статью, так как наша программа PDF2TXT бесплатна всего 30 дней, пришлось искать другой способ преобразования pdf в txt. Так вот, я нашла приложение pdftotext, вот как она работает в 1с:

НашФайл = ("F:\File.pdf");
ПутьКPDFtoTEXT = "F:\"; //например наш pdftotext лежит на диске F
pdf = НашФайл;
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDFtoTEXT +"pdftotext.exe " + "-enc UTF-8 " + pdf + " " + txt; 
ЗапуститьПриложение(Команд,,Истина);			

Мы создали текстовый файл в кодировке UTF-8, теперь его нужно прочитать:

ФайлЧтение  = Новый ЧтениеТекста(txt,КодировкаТекста.UTF8);    
ТекстФ = ФайлЧтение.Прочитать();
ФайлЧтение.Закрыть();

Вот где я скачала программу-помощницу:

Инструменты XPDF  (по ссылке скачать инструменты xpdf, в архиве найдете pdftotext,  остальные файлы не нужны)

Надеюсь, моя работа поможет многим!)

69

См. также

Комментарии
Сортировка: Древо
1. cool.vlad4 43 07.01.18 04:47 Сейчас в теме
делал свою компоненту Native на C++ пару лет назад, все никак руки доделать не дойдут ибо сейчас это не актуально, то что нашел, прикрепил. умеет сохранять страницы в текст(правда там поленился убрать вывод информации по шрифтам и прочему), в png, количество страница...но основная цель была сохранение в png
Прикрепленные файлы:
ЗаписатьPDFToPNG.epf
sharonovev; AllexSoft; kraynev-navi; DrAku1a; Margo462; +5 Ответить
2. cool.vlad4 43 07.01.18 04:49 Сейчас в теме
(1)
м и прочему), в png, количество страница...но осн
если найду, выложу еще компоненту делал, которая наоборот собирает из изображений pdf
DarkAn; kraynev-navi; +2 Ответить
16. kraynev-navi 372 09.01.18 15:19 Сейчас в теме
(2) Иногда вот так сталкиваешься, часами ищешь решение как ТС. Крутишь ghost, sumatra (https://www.sumatrapdfreader.org/docs/Command-line-arguments.html - кстати, бесплатная тулза), пробуешь на своих данных и мощностях и думаешь, блин, ну умел бы писать нативные компоненты, написал бы уже изящно и работало бы всегда.
Спасибо за труд! (утащил к себе в нору)
3. Margo462 144 07.01.18 15:33 Сейчас в теме
(1) обязательно пригодиться, спасибо)
25. A1ice1990 110 12.01.18 11:11 Сейчас в теме
(0) (1) Можно воспользоваться tesseract ocr (смотрите на github'е)
Там крайне много возможностей, в том числе можно получать не только сырой текст, но и положение онного на странице.

Ставиться не сложно, на лине так вообще одной строкой в терминале.
Под винду уже есть собраные версии.
28. cool.vlad4 43 12.01.18 14:20 Сейчас в теме
(25) ага, и качество распознавания ниже плинтуса, пробовал я его, тут речь идет об извлечении текста, который не нужно распознавать, он и так текст
41. sharonovev 18.06.18 10:52 Сейчас в теме
(1)Наше то,. что долго искал.

Есть вопрос - попробовал использовать закомментированный кусок кода:

ДвДанные = Конвертер.ПолучитьДанныеИзображения();

Платформа благополучно отъезжает.

На сохранении файла - работает корректно все.

Этот метод работает?

(1)
4. DarkAn 729 09.01.18 10:03 Сейчас в теме
Я в свое время тоже разбирался с разбиением ПДФов. Мне понравилась программа GostScript, в ней разбиение многостраничного файла делается одной командой: вот строка из bat-файла

call "C:\Program Files\gs\gs9.20\bin\gswin64.exe" -q -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r100 -sPAPERSIZE=a4 -sOutputFile="Z:\!\doc-%03d.png" "Z:\!\1234.pdf"

Здесь:
"Z:\!\1234.pdf" - путь к многостраничному фалу
-sOutputFile="Z:\!\doc-%03d.png" - параметр говорит о создании файлов по маске (1 страница - 1 файл): doc-001.png, doc-002.png, doc-003.png, ...

В свое время остановился, на попытке понять как обработать не 1, 2, 3 многостраничный файлов, а 100+ (так до конца и не разобрался с параметрами). Может время придет - вернусь к работе
5. DarkAn 729 09.01.18 10:06 Сейчас в теме
6. DrAku1a 1289 09.01.18 10:44 Сейчас в теме
Без компонент, на двоичных данных бы... За такое и 10 $m не жалко будет!
Где-то на ИС встречал в комментариях "Количество страниц в PDF-файле".
7. Margo462 144 09.01.18 11:28 Сейчас в теме
(6) интересно...хотелось бы, а то этот конвертер PDF2TXT на 30 дней, еще ключи искать, бесплатную прогу найти пока не смогла
27. A1ice1990 110 12.01.18 11:13 Сейчас в теме
(7) Можно воспользоваться tesseract ocr (смотрите на github'е)
Там крайне много возможностей, в том числе можно получать не только сырой текст, но и положение онного на странице.

Ставиться не сложно, на лине так вообще одной строкой в терминале.
Под винду уже есть собраные версии.

UPD:
Если вопрос стоит как "искать ключи", то очивидный FineReader очивиден, дальше торрентов искать не придеться ;-)

Также практически на 100% уверен, что у гугла есть подобный вебсервис, там вроде хотели денюжек, но крайне мало и возможно есть "триал".
29. Margo462 144 13.01.18 19:58 Сейчас в теме
(27) посмотрите я дополнила статью, нашла бесплатное приложение pdftotext, работает тоже из командной строки :)
32. A1ice1990 110 15.01.18 10:21 Сейчас в теме
(29) Это не спортивно :3
Я прохлопал ушами, что у вас изначально PDF содержащий сырой текст:
https://habrahabr.ru/post/69568/

Для ковыряния двоичных данных под окнами лучше использовать бесплатный HxD
9. DarkAn 729 09.01.18 14:18 Сейчас в теме
(6) (7) Из личного: для решения описанной задачи (0) мы сначала воспользовались программой ABBYY Scan Station (ABBYY - по запросу спокойно предоставляет 30-дневный ключ, спокойно предоставили продление еще на 1 месяц, для тестов), после чего мы сделали приобретение, т.к. софтина ОЧЕНЬ проста в настройке и хорошо выполняет обозначенную задачу (но без распознавания).

Единственный ее недостаток и весьма значительный - это не возможность ее запустить с командной строки - то есть нет запуска по расписанию.
Но из плюсов я бы назвал цену 2-3 года назад она составляла 24 000 руб. или 10 часов франча (на тот момент).

Так мы поигрались наверное с год, пока мне не надоело запускать каждый день данную сфотину и мы приобрели ее расширенную версию - ABBYY Recognation Server. В данной софтине настроек и возможностей поболее - работает на УРА уже 1,5 года. Есть еще распознавание и индексирование - последнее требует работу оператора (при приобретении удалось зачесть стоимость ранее приобретенной ABBYY Scan Station).

По ценам уже значительно дороже и цена зависит от количества распознанных страниц в месяц. На сегодня у нас 50к страниц и этого пока хватает (1 числа каждого месяца счетчик сбрасывается).
Цены опять же в открытых источниках не найти, но я их так же приведу для понимания: Сама программа + лицензия на 15к страниц - 215 000 руб, апгрейд с 15к до 50к страниц- 170к руб, апгрейд с 15к до 100к страниц - 247к руб (цены на июль 2016)

Стоимость разовая и в дальнейшем доплат не требует.

Это не реклама, просто показал, что решили использовать у нас в организации. Иногда может быть значительно эффективнее купить готовый продукт, чем писать свое с нуля. С нуля для разработчика хорошо - ты учишься работать с "новым", но работодатель не всегда может быть заинтересован оплачивать таким образом твое обучение, если стоит вопрос в сроках и качестве (ведь сколько еще времени уйдет на отладку "подводных камней").

P.S.
Кстати в 1С Документооборот используют так же сторонние библиотеки, тот же самый GostScript указанный в (4) для "распиливания" файлов, а для распознавания другую не помню как называется. От туда можно было бы глянуть как они это делают, но пока у меня нет на это времени да и описаный выше софт решает поставленную задачу.
10. Margo462 144 09.01.18 14:36 Сейчас в теме
(9) за 215 тр я сама буду эти файлы распознавать :-D слишком дорого))
11. DarkAn 729 09.01.18 14:45 Сейчас в теме
(10) ну я же в конце дал наводку, где посмотреть, как делают в 1С :)
12. Margo462 144 09.01.18 14:49 Сейчас в теме
13. DarkAn 729 09.01.18 14:53 Сейчас в теме
(10) Кроме того вопрос цены, это не вопрос разработчика - не его это зона ответственности. А финансового директора или Гл. буха. Придете к ним и спросите: поставленную задачу можно решить как минимум 2мя путями. Первый вот счет на 215к и запустим через 3-5 дней. Второй писать самим, но так как мы с этими библиотеками еще не работали (опыта нет) то для полной автоматизации может потребоваться гораздо больше времени и разработчик будет занят и еще по ходу дела ошибки будем отлаживать :) Вот они пусть и принимают решение о том дорого это или нет, но ни как не разработчик :)
14. Margo462 144 09.01.18 15:03 Сейчас в теме
(13) я думаю что даже если бы прога 1 тр стоила, то все равно пришлось бы искать бесплатный способ)
15. DarkAn 729 09.01.18 15:13 Сейчас в теме
(14) Еще раз повторюсь, стоимость это не вопрос разработчика.

(14)
я думаю
- это подтверждает. Решается приближенно достаточно просто. Возьмите свою часовую ставку помножте ее на предполагаемое время разработки и изучения, потом помножте еще раз на 2 и сравните со стоимость программы. Это приблизительно :)
klinval; pfilyk; +2 1 Ответить
17. Margo462 144 09.01.18 15:24 Сейчас в теме
(15) то, что мне нужно было готового такого нет, я скоро опубликую обработку где я это применила, по мне так проще программу PDF2TXT оплатить, там вроде 2 тр она стоит и обновления в течение года))
18. DarkAn 729 09.01.18 15:34 Сейчас в теме
(17)
что мне нужно было готового такого нет
Ну Вы же не описали, что Вам нужно. А то что описано, я привел альтернативы и их значительно больше и по разной цене. Все зависит от Вашей занятости :)

Но мы уже отходим от темы. Появится Ваша разработка посмотрим, насколько она "уникальна". Даже самому интересно, так как механизм прикрепления файлов к объектам базы 1С сам реализовывал. Но у Вас возможно другая разработка, но интересные идеи и направления можно найти.
21. Margo462 144 09.01.18 16:28 Сейчас в теме
(18) https://infostart.ru/public/724762/ вот, ну это я сама такое придумала как к выпискам pdf подцеплять, может у кого-то будут другие мысли как это осуществить))))
22. DarkAn 729 09.01.18 16:38 Сейчас в теме
(21)
думала как к выпискам pdf

Спасибо!
23. Margo462 144 09.01.18 17:05 Сейчас в теме
(22) убрала с публикации, как исправлю на временный каталог тогда опубликую)
30. Margo462 144 13.01.18 19:59 Сейчас в теме
(18) посмотрите я дополнила статью, нашла бесплатное приложение pdftotext, работает тоже из командной строки :)
26. A1ice1990 110 12.01.18 11:12 Сейчас в теме
(6) Предположу, что там использовался некий маркер в ДД PDF файла.
Если онный существует, то крайне просто нагуглить, а сделать еще проще.

UPD:
Попробуйте взять бесплатный HxD и поковырять различные PDF файлы, как с текстом, так состоящие из картинок.

UPD 2:
(0) Глянул сам, прям на вскидку как определить количество страниц:
Подключаете файл как поток двоичных данных на чтение, считаете количество повторений ("/Type/Page")
Попробуйте глянуть HxD ручками, все станет понятно.
Но вероятнее всего есть способ еще проще, в PDF файле может содержаться некий маркер который заранее "знает" количество страниц.
8. Dzenn 247 09.01.18 11:49 Сейчас в теме
Согласен, pdftk хорошая, годная компонента
19. borodatii 1 09.01.18 15:54 Сейчас в теме
А зачем сначала перегонять PDF в ДвоичныеДанные, а потом их сохранять как PDF? Я про первые 4 строки кода.
20. Margo462 144 09.01.18 16:22 Сейчас в теме
(19) да это наверное уже лишнее, раньше ошибка была, потом не убирала просто, щас уберу)
24. Lewkis 10.01.18 07:52 Сейчас в теме
Всем добрый день. Хочу тоже поделиться своими наработками в этой области. Делал для своих нужд скрипт на Python для извлечения текста из PDF.

Если интересно, вот ссылка https://github.com/yoyuyoppe/Converter-PDF.git.

Зависимости: должен стоять python 3.x и библиотека для разбора pdf (pip install pdfminer3k)

Приложил пример запуска скрипта из 1С.
Прикрепленные файлы:
kote; AllexSoft; sashocq; Dementor; DrAku1a; Snark13; DarkAn; Margo462; +8 Ответить
31. Margo462 144 13.01.18 19:59 Сейчас в теме
(24) посмотрите я дополнила статью, нашла бесплатное приложение pdftotext, работает тоже из командной строки :)
33. spezc 494 16.01.18 10:06 Сейчас в теме
Хорошая статья, держи звезду.
34. spezc 494 16.01.18 10:08 Сейчас в теме
По горячим следам задам вопрос, кто знает как из 1С вставить картинку в PDF? У меня есть скан документа в PDF, у меня есть *.png/*.gif с макетом печати. Мне нужно получить PDF, в котором будет этот шаблон печати будет добавлен на первую (на все) страницу оригинального PDF?
35. altu71 19.01.18 08:52 Сейчас в теме
Можно упростить процесс, если использовать iFilter для PDF, например отсюда ADOBE. Тогда текст можно получить сразу из PDF файла объектом "ИзвлечениеТекста"
36. Margo462 144 19.01.18 09:21 Сейчас в теме
(35) пробовала, не получается, у нас adobe reader ограниченная версия, может поэтому...
37. altu71 19.01.18 10:07 Сейчас в теме
Ссылка, которую я вставил, на бесплатный официальный установочный файл от adobe. Достаточно его одного, можно acrobat вообще не ставить
38. Margo462 144 19.01.18 10:56 Сейчас в теме
(37) спасибо, как нибудь попробую, может получится в этот раз
39. eugenevk 112 29.03.18 17:11 Сейчас в теме
Хорошо описан pdftk server. Правда не учтено, что программа совершенно не переваривает русские буквы в каталогах и именах файлов. Когда-то давно с этим сталкивался. Проверил, все по-прежнему. Не хотят зарубежные разработчики поддерживать utf(

Вынес в отдельную обработку обход проблемы с русскими буквами, а также встроил портированный exe, чтобы не устанавливать:
Прикрепленные файлы:
СборкаРазборкаPDF.epf
Margo462; +1 Ответить
40. plus_sign 3 10.06.18 11:18 Сейчас в теме
(39)Большое спасибо за способ обхода проблемы с русскими буквами. Пригодилось в работе.
Часть команд pdftk без проблем глотают русские буквы в любом количестве. А вот команды dump_data* и правда не воспринимают русские буквы в имени выходного файла.
Оставьте свое сообщение