Переход на операционные системы семейства Linux и реализация стратегии импортозамещения ставят перед разработчиками 1С новые задачи. Одной из классических проблем является работа с PDF-файлами. В среде Windows многие привыкли использовать COM-объекты (например, Acrobat SDK или PDFCreator), однако в Linux этот механизм недоступен. В данной статье мы подробно разберем, как реализовать разделение многостраничного PDF-файла на отдельные страницы, используя современные возможности платформы 1С и эффективные консольные инструменты.
Начиная с версии 8.3.16, в платформе 1С появились штатные объекты для работы с PDF-документами. Это самый предпочтительный метод, так как он является кроссплатформенным и не требует установки дополнительного программного обеспечения в операционную систему. Рассмотрим, как программно извлечь страницы из документа.
Для решения задачи мы будем использовать объекты ЧтениеPDF и ЗаписьPDF. Проанализируем алгоритм: мы открываем исходный файл, узнаем общее количество страниц и в цикле сохраняем каждую страницу в новый файл.
Пример реализации на встроенном языке:
// Определим пути к файлам
ПутьКИсходномуФайлу = "/home/user/documents/report.pdf";
КаталогВыгрузки = "/home/user/documents/pages/";
// Создаем объект для чтения
ДокументЧтение = Новый ЧтениеPDF;
ДокументЧтение.Открыть(ПутьКИсходномуФайлу);
КоличествоСтраниц = ДокументЧтение.КоличествоСтраниц();
Для НомерСтраницы = 1 По КоличествоСтраниц Цикл
// Формируем имя нового файла для каждой страницы
ИмяФайлаСтраницы = КаталогВыгрузки + "page_" + Формат(НомерСтраницы, "ЧГ=0") + ".pdf";
// Создаем объект для записи конкретной страницы
ДокументЗапись = Новый ЗаписьPDF(ИмяФайлаСтраницы);
// Копируем страницу из источника в новый документ
// Параметры метода: ИндексСтраницыИсточника, НомерСтраницыВНовомДокументе
ДокументЗапись.ЗаписатьСтраницу(ДокументЧтение, НомерСтраницы);
// Завершаем запись файла
ДокументЗапись.Закрыть();
КонецЦикла;
ДокументЧтение.Закрыть();
Этот метод работает максимально стабильно. Мы рекомендуем использовать именно его, если версия вашей платформы позволяет это сделать. Основное преимущество — сохранение текстового слоя и векторных данных без потери качества.
Если по каким-то причинам встроенные средства 1С не подходят или требуется максимально высокая скорость обработки огромных файлов, проанализируем возможности системных утилит Linux. Одной из самых быстрых является pdfseparate, входящая в пакет poppler-utils.
В отличие от тяжеловесных графических библиотек, pdfseparate не выполняет растеризацию (отрисовку) страниц, а работает напрямую со структурой PDF-контейнера. Это позволяет разделять документы практически мгновенно.
Выясним, как вызвать эту утилиту из кода 1С:
Команда = "pdfseparate ""/tmp/source.pdf"" ""/tmp/result-%d.pdf""";
// %d — это шаблон, в который утилита подставит номер страницы
// Выполняем команду в ОС
ЗапуститьПриложение(Команда, , Истина);
Важный момент: убедитесь, что пакет poppler-utils установлен на сервере 1С (команда sudo apt-get install poppler-utils для Debian/Ubuntu). Этот способ идеально подходит для высоконагруженных систем.
Рассмотрим ситуацию, когда PDF-файл имеет сложную структуру, защищен паролем или требует оптимизации при разделении. В таких случаях на помощь приходит QPDF. Это консольная утилита для структурных преобразований PDF, которая корректно работает со спецификациями версий 1.7 и выше.
Проанализируем пример команды для разделения на страницы:
// --split-pages разделяет файл на отдельные страницы
Команда = "qpdf --split-pages input.pdf output-%d.pdf";
ЗапуститьПриложение(Команда, , Истина);
Преимущество QPDF заключается в том, что она может одновременно с разделением снимать ограничения на редактирование (если известен пароль) и проверять целостность файла.
Если вам требуется гарантированная совместимость и возможность дополнительной обработки (например, сжатия или конвертации в стандарт PDF/A), стоит посмотреть в сторону Ghostscript. Это своего рода «швейцарский нож» для работы с документами в Linux.
Разберем пример вызова Ghostscript для извлечения страниц:
// Параметры для извлечения каждой страницы в отдельный файл
Команда = "gs -sDEVICE=pdfwrite -dSAFER -o page_%03d.pdf input.pdf";
ЗапуститьПриложение(Команда, , Истина);
Хотя Ghostscript медленнее, чем pdfseparate, он позволяет тонко настраивать параметры выходных файлов, такие как разрешение изображений внутри PDF и внедрение шрифтов.
В контексте работы с PDF часто возникает вопрос получения этих самых файлов со сканера. Как было замечено в обсуждении, стандартные для Windows TWAIN и WIA в Linux отсутствуют. Вместо них используется стандарт SANE (Scanner Access Now Easy).
Чтобы автоматизировать процесс «сканирование — разделение — прикрепление в 1С:Документооборот», мы можем использовать консольную утилиту scanimage. Сценарий работы выглядит следующим образом:
scanimage через ЗапуститьПриложение для получения изображения.ImageMagick).Файлы или привязываем к документам.Пример вызова простого сканирования:
КомандаСканирования = "scanimage --format=tiff > /tmp/scan.tiff";
ЗапуститьПриложение(КомандаСканирования, , Истина);
Мы рассмотрели несколько эффективных способов разделения PDF-файлов без использования COM-объектов:
Выбор конкретного метода зависит от версии вашей платформы и требований к скорости обработки. Для большинства задач автоматизации в 1С достаточно штатных средств, что значительно упрощает поддержку системы в среде Linux.