Как преобразовать PDF в JPG из 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе автоматизации документооборота в 1С часто возникает необходимость конвертации файлов из формата PDF в графический формат JPG. Это может потребоваться для создания превью-изображений документов, интеграции со сторонними веб-сервисами, отправки документов через мессенджеры или распознавания текста. К сожалению, встроенные механизмы платформы «1С:Предприятие» до сих пор не предоставляют прямой функции рендеринга PDF в растровые изображения без использования сторонних средств.

В данной статье мы подробно разберем наиболее надежные и популярные способы решения этой задачи, начиная от современных кроссплатформенных внешних компонент и заканчивая консольными утилитами и виртуальными принтерами. Мы проанализируем сильные и слабые стороны каждого метода, рассмотрим практические примеры кода и разберем нюансы, которые помогут вам избежать типичных ошибок.

Способ 1. Использование кроссплатформенной NativeAPI-компоненты на базе PDFium

На сегодняшний день использование внешних компонент, разработанных по технологии NativeAPI, является самым современным, надежным и быстрым решением. Такие компоненты обычно используют высокопроизводительную библиотеку PDFium (разработку компании Google, на которой построен рендеринг PDF в браузере Chrome).

Давайте рассмотрим преимущества данного подхода:

  1. Полная кроссплатформенность: компонента может выполняться как в Windows-окружении, так и на серверах под управлением Linux.
  2. Работа в памяти: файлы можно передавать и получать в виде двоичных данных (или в формате Base64) без промежуточного сохранения на жесткий диск.
  3. Отсутствие внешних окон: процесс конвертации происходит незаметно для пользователя, не вызывая консольных окон CMD или сторонних приложений.
  4. Простота развертывания: компонента не требует регистрации в реестре Windows (в отличие от COM-объектов) и легко упаковывается в макет конфигурации 1С.

Давайте разберем по шагам пример кода, который демонстрирует загрузку 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!";
КонецЕсли;

// Очищаем временные файлы
УдалитьФайлы(ИмяФайлаКомпоненты);

Этот способ идеально подходит для высоконагруженных серверных процессов, фоновых заданий и веб-клиентов, так как обеспечивает максимальную скорость работы и стабильность.

Способ 2. Использование легковесной консольной утилиты pdftoppm (пакет Poppler)

Если по каким-то причинам вы не можете использовать внешние компоненты, отличной альтернативой является вызов консольных утилит через командную строку системы. Вместо тяжелого и часто выдающего ошибки пакета 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С экранирование кавычек в строке выполняется путем их удвоения.

Способ 3. Решение проблемы «черного фона» и прозрачности в PDF

При использовании консольных конвертеров (включая 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""";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);

Способ 4. Использование виртуальных принтеров (PDFCreator / Bullzip)

Этот классический метод отлично подходит для рабочих станций под управлением Windows, где у пользователей уже настроена инфраструктура печати. Виртуальный принтер (например, PDFCreator или Bullzip PDF Printer) устанавливается в операционной системе как обычный принтер, но вместо вывода на физическую бумагу он перенаправляет поток печати в файл заданного формата (в нашем случае JPG) и сохраняет его в определенную папку.

Для реализации этого метода из 1С необходимо предварительно настроить профиль виртуального принтера на автоматическое сохранение файлов в целевую папку без вывода интерактивных диалоговых окон на экран пользователя. Сделать это можно либо через COM-объект принтера, либо через его конфигурационные файлы/реестр Windows.

Давайте разберем пример отправки документа на печать через виртуальный принтер из кода 1С:


// Создаем табличный документ, который нужно сохранить в JPG
ТабДок = Новый ТабличныйДокумент;
// ... тут заполняем табличный документ данными или загружаем существующий макет ...

// Задаем имя принтера
ТабДок.ИмяПринтера = "PDFCreator";

// Отправляем документ на печать. 
// Виртуальный принтер перехватит печать и сохранит файл в настроенную папку автоматического сохранения.
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Недостатки метода: Этот подход плохо применим на стороне сервера 1С, поскольку требует интерактивной сессии Windows, установленных драйверов печати и может работать нестабильно при одновременной печати нескольких документов в многопоточном режиме.

Способ 5. Использование интеграции с Python на сервере 1С

В современных ИТ-ландшафтах, когда сервера 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С:Предприятие. При выборе конкретной реализации рекомендуем придерживаться следующих правил:

← На главную