В процессе автоматизации документооборота в 1С часто возникает необходимость конвертации файлов из формата PDF в графический формат JPG. Это может потребоваться для создания превью-изображений документов, интеграции со сторонними веб-сервисами, отправки документов через мессенджеры или распознавания текста. К сожалению, встроенные механизмы платформы «1С:Предприятие» до сих пор не предоставляют прямой функции рендеринга PDF в растровые изображения без использования сторонних средств.
В данной статье мы подробно разберем наиболее надежные и популярные способы решения этой задачи, начиная от современных кроссплатформенных внешних компонент и заканчивая консольными утилитами и виртуальными принтерами. Мы проанализируем сильные и слабые стороны каждого метода, рассмотрим практические примеры кода и разберем нюансы, которые помогут вам избежать типичных ошибок.
На сегодняшний день использование внешних компонент, разработанных по технологии NativeAPI, является самым современным, надежным и быстрым решением. Такие компоненты обычно используют высокопроизводительную библиотеку PDFium (разработку компании Google, на которой построен рендеринг PDF в браузере Chrome).
Давайте рассмотрим преимущества данного подхода:
Давайте разберем по шагам пример кода, который демонстрирует загрузку NativeAPI-компоненты из макета и конвертацию документа:
// 1. Подключаем внешнюю компоненту из общего макета
ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("dll");
МакетКомпоненты = ПолучитьОбщийМакет("КомпонентаРендерингаPDF");
МакетКомпоненты.Записать(ИмяФайлаКомпоненты);
Если ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "PDFRender", ТипВнешнейКомпоненты.Native) Тогда
Компонента = Новый("AddIn.PDFRender.Renderer");
// 2. Загружаем исходный PDF-файл в компоненту
ПутьКФайлуPDF = "C:\Temp\Document.pdf";
Компонента.ЗагрузитьДокумент(ПутьКФайлуPDF);
// 3. Получаем количество страниц в документе
КоличествоСтраниц = Компонента.КоличествоСтраниц;
// 4. Постранично конвертируем PDF в JPG с заданным разрешением (DPI)
Для НомерСтраницы = 1 По КоличествоСтраниц Цикл
ИмяВыходногоФайла = "C:\Temp\Page_" + Строка(НомерСтраницы) + ".jpg";
// Рендерим страницу. Параметры: НомерСтраницы, DPI (разрешение), Качество JPEG
Компонента.СохранитьСтраницуКакИзображение(НомерСтраницы, ИмяВыходногоФайла, 150, 90);
КонецЦикла;
Компонента = Неопределено;
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту рендеринга PDF!";
КонецЕсли;
// Очищаем временные файлы
УдалитьФайлы(ИмяФайлаКомпоненты);
Этот способ идеально подходит для высоконагруженных серверных процессов, фоновых заданий и веб-клиентов, так как обеспечивает максимальную скорость работы и стабильность.
Если по каким-то причинам вы не можете использовать внешние компоненты, отличной альтернативой является вызов консольных утилит через командную строку системы. Вместо тяжелого и часто выдающего ошибки пакета ImageMagick в связке с Ghostscript, мы рекомендуем использовать узкоспециализированную и быструю утилиту pdftoppm, которая входит в состав библиотеки Poppler.
Утилита pdftoppm полностью портативна, не требует установки в систему и может храниться прямо в макете конфигурации 1С (в виде двоичных данных) и извлекаться во временную папку по мере необходимости.
Рассмотрим подробнее процесс вызова этой утилиты из кода 1С:
// Пути к исполняемому файлу утилиты и обрабатываемым файлам
ПутьКPdftoppm = "C:\Poppler\bin\pdftoppm.exe";
ПутьКPDF = "C:\Docs\Contract.pdf";
ПапкаВыгрузки = "C:\Docs\Output\";
// Создаем каталог для выгрузки файлов, если он не существует
СоздатьКаталог(ПапкаВыгрузки);
// Формируем команду запуска
// Параметр -jpeg указывает формат вывода
// Параметр -r 150 задает разрешение в DPI
СтрокаЗапуска = """" + ПутьКPdftoppm + """ -jpeg -r 150 """ + ПутьКPDF + """ """ + ПапкаВыгрузки + "page""";
// Выполняем команду системы синхронно (третий параметр равен Истина)
// Это критически важно, чтобы 1С дождалась завершения работы утилиты перед дальнейшей обработкой
КодВозврата = Неопределено;
ЗапуститьПриложение(СтрокаЗапуска, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ЗаписьЖурналаРегистрации("Конвертация PDF", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выполнения pdftoppm. Код возврата: " + Строка(КодВозврата));
ВызватьИсключение "Не удалось конвертировать PDF файл.";
КонецЕсли;
Важное примечание по безопасности путей: Обратите внимание на использование двойных кавычек вокруг путей к файлам. Если путь к вашей временной папке или файлу содержит пробелы (например, C:\Program Files\...), операционная система не сможет корректно распознать аргументы команды без экранирования кавычками. В 1С экранирование кавычек в строке выполняется путем их удвоения.
При использовании консольных конвертеров (включая Ghostscript и ImageMagick) разработчики часто сталкиваются с неприятной проблемой: после конвертации некоторые страницы PDF-документа, либо отдельные их элементы (например, факсимильные печати, подписи, логотипы), заливаются сплошным черным цветом.
Давайте выясним причину этого поведения. Исходный файл PDF часто содержит элементы с прозрачным фоном (альфа-каналом). Поскольку формат JPEG в принципе не поддерживает прозрачность, при конвертации прозрачные области могут интерпретироваться рендерером как черные пиксели.
Если вы столкнулись с подобной проблемой при использовании утилиты ImageMagick (convert.exe), необходимо принудительно удалить альфа-канал и залить его белым цветом перед конвертацией в JPG. Проанализируем пример правильной команды запуска:
// Правильные параметры командной строки для ImageMagick для устранения черного фона:
// -background white: устанавливаем фоновый цвет
// -alpha remove: удаляем прозрачный альфа-канал, заменяя его фоном
// -alpha off: полностью отключаем альфа-канал для итогового JPG
СтрокаЗапуска = "convert -density 150 ""input.pdf"" -background white -alpha remove -alpha off ""output.jpg""";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
Этот классический метод отлично подходит для рабочих станций под управлением Windows, где у пользователей уже настроена инфраструктура печати. Виртуальный принтер (например, PDFCreator или Bullzip PDF Printer) устанавливается в операционной системе как обычный принтер, но вместо вывода на физическую бумагу он перенаправляет поток печати в файл заданного формата (в нашем случае JPG) и сохраняет его в определенную папку.
Для реализации этого метода из 1С необходимо предварительно настроить профиль виртуального принтера на автоматическое сохранение файлов в целевую папку без вывода интерактивных диалоговых окон на экран пользователя. Сделать это можно либо через COM-объект принтера, либо через его конфигурационные файлы/реестр Windows.
Давайте разберем пример отправки документа на печать через виртуальный принтер из кода 1С:
// Создаем табличный документ, который нужно сохранить в JPG
ТабДок = Новый ТабличныйДокумент;
// ... тут заполняем табличный документ данными или загружаем существующий макет ...
// Задаем имя принтера
ТабДок.ИмяПринтера = "PDFCreator";
// Отправляем документ на печать.
// Виртуальный принтер перехватит печать и сохранит файл в настроенную папку автоматического сохранения.
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Недостатки метода: Этот подход плохо применим на стороне сервера 1С, поскольку требует интерактивной сессии Windows, установленных драйверов печати и может работать нестабильно при одновременной печати нескольких документов в многопоточном режиме.
В современных ИТ-ландшафтах, когда сервера 1С работают под управлением ОС Linux, популярность приобретает интеграция 1С со сторонними скриптовыми языками, в частности с Python. Написание простого Python-скрипта позволяет быстро и качественно обрабатывать PDF-файлы любой сложности.
Для рендеринга PDF в Python чаще всего используется библиотека pdf2image (которая под капотом использует все тот же Poppler) или высокопроизводительная PyMuPDF.
Давайте посмотрим на пример скрипта Python (pdf_converter.py):
import fitz # PyMuPDF
import sys
def convert_pdf_to_jpg(pdf_path, output_folder):
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc.load_page(page_num)
pix = page.get_pixmap(dpi=150)
output_path = f"{output_folder}/page_{page_num + 1}.jpg"
pix.save(output_path)
if __name__ == "__main__":
if len(sys.argv) > 2:
convert_pdf_to_jpg(sys.argv[1], sys.argv[2])
Вызов этого скрипта из кода 1С выполняется стандартным образом:
ПутьКИнтерпретатору = "/usr/bin/python3"; // для Linux
ПутьКСкрипту = "/opt/1c/scripts/pdf_converter.py";
ФайлPDF = "/tmp/invoice.pdf";
ПапкаНазначения = "/tmp/images";
СтрокаЗапуска = ПутьКИнтерпретатору + " " + ПутьКСкрипту + " """ + ФайлPDF + """ """ + ПапкаНазначения + """";
КодВозврата = Неопределено;
ЗапуститьПриложение(СтрокаЗапуска, , Истина, КодВозврата);
Мы проанализировали основные сценарии конвертации PDF-документов в формат JPG из среды 1С:Предприятие. При выборе конкретной реализации рекомендуем придерживаться следующих правил: