src/PDF_Extractor | ||
PDF_Extractor.epf | ||
README.md |
PDFExtractor_1C
«Класс» - обёртка для упрощения использования возможностей Poppler из 1С. Позволяет просто извлекать информацию из PDF-файлов в виде изображений и текста.
Мой велосипед для извлечения информации из PDF.
Изначально было необходимо находить и сохранять содержание книги в виде картинки для сайта из PDF-файлов, предоставляемых издательством, но применений можно найти массу.
По сути представляет из себя обёртку для более удобного использования библиотеки Poppler, поэтому последний должен быть установлен на компьютере. Poppler можно прописать в PATH, либо указывать путь к библиотеке непосредственно в обработке.
Возможности
- Извлечение страниц файла в виде изображений (настраивается качество, номера страниц, цветность, форма)
- Извлечение страниц файла в виде текста
- Извлечение отдельных изображения, содержащихся в PDF-документе
- Разбиение (разделение) одного файла на несколько
- Объединение нескольких файлов в один
Примеры использования:
1. Сохраняем каждую страницу файла, как отдельное изображение
PDF_Extractor = Обработки.PDF_Extractor.Создать(); // Если встроили обработку в конфигурацию
PDF_Extractor.КаталогPoppler = ""; // Можно не указывать, если poppler прописан в PATH
Изображения = PDF_Extractor.ФайлВИзображения("D:\my_file.pdf");
Для Каждого Изображение ИЗ Изображения Цикл
Картинка = Новый Картинка(Изображение.ДвоичныеДанные);
// Дальнейшая работа с изображением
КонецЦикла;
2. Извлечение текста
PDF_Extractor = Обработки.PDF_Extractor.Создать();
Страницы = PDF_Extractor.ФайлВТекст("D:\my_file.pdf");
Для Каждого Страница ИЗ Страницы Цикл
Если 0 < Найти(Страница.Текст, "что-то") Тогда
// Обработка текста, поиск и т.п.
КонецЕсли;
КонецЦикла;
3. Извлечение встроенных картинок
PDF_Extractor = Обработки.PDF_Extractor.Создать();
Изображения = PDF_Extractor.ИзображенияИзФайла("D:\my_file.pdf");
Для Каждого Изображение ИЗ Изображения Цикл
НомерСтраницы = Изображение.НомерСтраницы; // Возможно, ищем картинку
НомерКартинки = Изображение.НомерИзображения; // на конкретной странице
Расширение = Изображение.Расширение;
Картинка = Новый Картинка(Изображение.ДвоичныеДанные);
// Дальнейшая работа с изображением
КонецЦикла;
4. Разбиваем один файл на несколько
PDF_Extractor = Обработки.PDF_Extractor.Создать();
Файлы = PDF_Extractor.РазбитьФайл("D:\my_file.pdf", "D:\Каталог"); // Каталог можно не указывать
Для Каждого Файл ИЗ Файлы Цикл
Сообщить("Создан файл: " + Файл.ПолноеИмя);
КонецЦикла;
5. Склеиваем несколько файлов в один
ФайлыДляОбъединения = Новый Массив();
ФайлыДляОбъединения.Добавить("D:\small_file_1.pdf");
ФайлыДляОбъединения.Добавить("D:\small_file_2.pdf");
ФайлыДляОбъединения.Добавить("D:\small_file_3.pdf");
PDF_Extractor = Обработки.PDF_Extractor.Создать();
Файл = PDF_Extractor.ОбъединитьНесколькоФайлов(ФайлыДляОбъединения, "D:\big_file.pdf");
ОтправитьФайл("mail@example.com", Файл); // Или любая другая обработка полученного файла
6. Получение служебной информации о файле
Сообщить(PDF_Extractor.СтрокаИнформацииОФайле("D:\my_file.pdf"));
// или так
Информация = PDF_Extractor.ИнформацияОФайле("D:\my_file.pdf"));
Для Каждого Поле ИЗ Информация Цикл
Сообщить(Поле.Ключ + " - " + Поле.Значение);
КонецЦикла;
Особенности
Так как это всё-таки обёртка над библиотекой, то есть некоторая неиформативность в сообщениях об ошибках. Наверно, можно сделать вывод ошибок более понятным, но я, если честно, не очень старался в этой части.
Все методы в случае ошибки возвращают Неопределено. Если это произошло, вызываем метод ПоследняяОшибка() и получаем примерно следующее:
Сообщить(ПоследняяОшибка());
// Не удалось сохранить страницу файла
// pdftoppm "D:\383251.pdf" -r 200 -f 12 -l 12 -jpeg > "C:\Windows\Temp\v8_2F17_be.jpeg"
Используя команду, на которой вывалилась ошибка можно определить, что пошло не так.
Тестировалось в следующих условиях:
- ОС Windows 10 x64, релизы платформы 8.2.19.116 и 8.3.16.1148
- ОС Ubuntu 18.04 x64, релиз платформы 8.3.15.1565