Как настроить размер и масштаб PDF-документа на форме в 1С?

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

При работе с управляемыми формами в 1С часто возникает задача отобразить пользователю содержимое PDF-файла. Стандартный элемент формы ДокументPDF кажется очевидным решением, однако на практике разработчики сталкиваются с серьезными трудностями: элемент плохо поддается настройке размеров, игнорирует свойства ширины и высоты, а управление масштабом отсутствует. Более того, на некоторых файлах он может вызывать аварийное завершение клиента. Чтобы обойти эти ограничения, часто применяется универсальный компонент для просмотра PDF на управляемых формах, который обеспечивает стабильную навигацию и управление масштабом.

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

Решение 1: Конвертация PDF в изображения с помощью внешних утилит

Первый подход заключается в том, чтобы отказаться от прямого отображения PDF и вместо этого преобразовать его страницы в графические файлы (например, PNG или JPG). Этот метод является наиболее стабильным и предсказуемым, хотя и имеет свои ограничения.

Принцип работы

Процесс выглядит следующим образом: с помощью внешней программы, вызываемой из кода 1С, мы конвертируем нужные страницы PDF в картинки. Затем эти картинки помещаются во временное хранилище и отображаются на форме в стандартном элементе Поле картинки. Подробно этот процесс описывает инструкция по конвертации PDF в изображения средствами ImageMagick для 1С, где используется связка из двух бесплатных утилит:

  1. Ghostscript — интерпретатор языков PostScript и PDF. Он является "движком", который непосредственно выполняет рендеринг PDF.
  2. ImageMagick — мощный набор инструментов для обработки изображений, который выступает в роли удобной "обертки" для вызова Ghostscript с нужными параметрами.

Эти утилиты необходимо предварительно установить на сервере или на клиентских машинах, в зависимости от того, где будет выполняться конвертация.

Посмотрим на пример

Вызов конвертации из 1С можно реализовать с помощью метода ЗапуститьПриложение(). Командная строка для ImageMagick может выглядеть так:


// Псевдокод, демонстрирующий принцип
&НаСервере
Функция ПолучитьКартинкуИзPDF(ПутьКФайлуPDF, НомерСтраницы)

    ИмяВходногоФайла = ПолучитьИмяВременногоФайла("pdf");
    ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("png");

    // Здесь должен быть код копирования исходного PDF во временный файл
    // КопироватьФайл(ПутьКФайлуPDF, ИмяВходногоФайла);

    // ImageMagick требует указывать номер страницы в квадратных скобках перед расширением
    ПутьСНомеромСтраницы = ИмяВходногоФайла + "[" + (НомерСтраницы - 1) + "]";

    // Формируем команду для запуска
    // -density 150 - устанавливает качество (DPI), 150-200 обычно достаточно
    Команда = "C:\ImageMagick\convert.exe -density 150 " + ПутьСНомеромСтраницы + " " + ИмяВыходногоФайла;
    
    // Запускаем приложение и ждем его завершения
    ЗапуститьПриложение(Команда, , Истина);

    // Читаем результат в двоичные данные и помещаем во временное хранилище
    ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ИмяВыходногоФайла);
    АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки);

    УдалитьФайлы(ИмяВходногоФайла, ИмяВыходногоФайла);

    Возврат АдресКартинки;

КонецФункции

Преимущества этого метода:

Недостатки:

Решение 2: Отображение PDF через Поле HTML документа и библиотеку PDF.js

Это более современный и функциональный способ, который позволяет встроить в форму 1С полноценный просмотрщик PDF на базе библиотеки PDF.js, сохраняя всю интерактивность документа. Он решает исходную проблему с масштабированием и предоставляет пользователю привычный интерфейс.

Принцип работы

Мы используем элемент формы Поле HTML документа. В это поле мы загружаем специально подготовленную HTML-страницу, которая подключает JavaScript-библиотеку PDF.js от Mozilla. Эта библиотека способна отображать (рендерить) PDF-документы прямо в браузере (или в движке WebKit, который использует Поле HTML документа).

Важный момент: чтобы получить максимальный эффект, нужно использовать не просто ядро библиотеки (pdf.js), а готовый компонент просмотра PDFViewer, который входит в ее дистрибутив. Он предоставляет готовую панель инструментов с кнопками масштабирования, навигацией по страницам, поиском, печатью и скачиванием.

Разберем по шагам реализацию:

  1. Подготовка библиотеки. Скачайте готовый ("prebuilt") дистрибутив PDF.js с официального сайта. Вам понадобится содержимое, включающее папку web с файлом viewer.html. Всю эту структуру необходимо добавить в конфигурацию 1С в виде общего макета.
  2. Передача PDF в просмотрщик. Файл viewer.html умеет принимать PDF-файл в качестве параметра. Чтобы избежать проблем с правами доступа, лучше всего использовать отображение PDF в 1С через Поле HTML документа и Base64, передавая содержимое файла напрямую в виде строки.
  3. Формирование HTML-кода в 1С. В коде 1С необходимо прочитать PDF-файл, преобразовать его в Base64 и сформировать HTML-код, который будет загружен в Поле HTML документа.

Посмотрим на пример кода:


&НаКлиенте
Процедура ПоказатьPDFВHTMLПоле(ПутьКФайлуPDF)

    // 1. Читаем двоичные данные файла
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлуPDF);

    // 2. Конвертируем в строку Base64
    СтрокаBase64 = Base64Строка(ДвоичныеДанные);

    // 3. Получаем путь к нашему макету с viewer.html
    // Предполагается, что вы реализовали функцию получения URL макета
    URLViewer = ПолучитьURLМакета("PDFViewer/web/viewer.html");
    
    // 4. Формируем URL для iframe. Передаем PDF как data URL.
    // encodeURIComponent важен для корректной передачи строки Base64
    ИсточникДанных = "data:application/pdf;base64," + СтрокаBase64;
    URLФайла = URLViewer + "?file=" + ПолучитьНавигационнуюСсылкуИнформационнойБазы(ИсточникДанных);

    // 5. Устанавливаем HTML-текст в поле на форме.
    // Используем iframe, чтобы изолировать viewer и управлять его размерами.
    HTMLТекст = "
    |
    |
    |  
    |    
    |    
    |  
    |  
    |    
    |  
    |
    |";

    Элементы.ПолеHTMLДокумента.УстановитьТекст(HTMLТекст);

КонецПроцедуры

В этом примере функция ПолучитьURLМакета должна вернуть путь к файлу viewer.html, который мы ранее поместили в макет. Использование ПолучитьНавигационнуюСсылкуИнформационнойБазы() помогает правильно сформировать URL для встроенного браузера 1С.

Преимущества этого метода:

Недостатки:

В итоге, проанализировав ситуацию, мы приходим к выводу, что для надежной работы с PDF в интерфейсе 1С стоит отказаться от стандартного элемента ДокументPDF в пользу более гибких и стабильных решений. Если вам нужно просто показать статичное изображение документа, подойдет конвертация в картинки. Если же требуется сохранить интерактивность и предоставить пользователю полноценные инструменты для работы с документом, метод с Полем HTML документа и PDF.js является наилучшим выбором.

← На главную