Всем привет!!! Как-то мне поступило задание прикреплять 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);
ТекстФ = ОбъектТ.ПолучитьТекст();
//////ДАЛЬШЕ МОЖЕТЕ ДЕЛАТЬ С ТЕКСТОМ ЧТО ХОТИТЕ, СРАВНИВАЙТЕ, ИЩИТЕ КАКУЮ-ТО ИНФОРМАЦИЮ//////
КонецЦикла;
Вот ссылки на программы:
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, остальные файлы не нужны)
Надеюсь, моя работа поможет многим!)