При работе с управляемыми формами в 1С часто возникает задача отобразить пользователю содержимое PDF-файла. Стандартный элемент формы ДокументPDF кажется очевидным решением, однако на практике разработчики сталкиваются с серьезными трудностями: элемент плохо поддается настройке размеров, игнорирует свойства ширины и высоты, а управление масштабом отсутствует. Более того, на некоторых файлах он может вызывать аварийное завершение клиента. Чтобы обойти эти ограничения, часто применяется универсальный компонент для просмотра PDF на управляемых формах, который обеспечивает стабильную навигацию и управление масштабом.
В этой статье мы проанализируем ситуацию и разберем два надежных альтернативных способа для отображения PDF-документов на формах, которые решают проблему масштабирования и обеспечивают стабильную работу.
Первый подход заключается в том, чтобы отказаться от прямого отображения PDF и вместо этого преобразовать его страницы в графические файлы (например, PNG или JPG). Этот метод является наиболее стабильным и предсказуемым, хотя и имеет свои ограничения.
Принцип работы
Процесс выглядит следующим образом: с помощью внешней программы, вызываемой из кода 1С, мы конвертируем нужные страницы PDF в картинки. Затем эти картинки помещаются во временное хранилище и отображаются на форме в стандартном элементе Поле картинки. Подробно этот процесс описывает инструкция по конвертации PDF в изображения средствами ImageMagick для 1С, где используется связка из двух бесплатных утилит:
Эти утилиты необходимо предварительно установить на сервере или на клиентских машинах, в зависимости от того, где будет выполняться конвертация.
Посмотрим на пример
Вызов конвертации из 1С можно реализовать с помощью метода ЗапуститьПриложение(). Командная строка для ImageMagick может выглядеть так:
// Псевдокод, демонстрирующий принцип
&НаСервере
Функция ПолучитьКартинкуИзPDF(ПутьКФайлуPDF, НомерСтраницы)
ИмяВходногоФайла = ПолучитьИмяВременногоФайла("pdf");
ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("png");
// Здесь должен быть код копирования исходного PDF во временный файл
// КопироватьФайл(ПутьКФайлуPDF, ИмяВходногоФайла);
// ImageMagick требует указывать номер страницы в квадратных скобках перед расширением
ПутьСНомеромСтраницы = ИмяВходногоФайла + "[" + (НомерСтраницы - 1) + "]";
// Формируем команду для запуска
// -density 150 - устанавливает качество (DPI), 150-200 обычно достаточно
Команда = "C:\ImageMagick\convert.exe -density 150 " + ПутьСНомеромСтраницы + " " + ИмяВыходногоФайла;
// Запускаем приложение и ждем его завершения
ЗапуститьПриложение(Команда, , Истина);
// Читаем результат в двоичные данные и помещаем во временное хранилище
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ИмяВыходногоФайла);
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки);
УдалитьФайлы(ИмяВходногоФайла, ИмяВыходногоФайла);
Возврат АдресКартинки;
КонецФункции
Преимущества этого метода:
Поле картинки тривиальна.Недостатки:
Это более современный и функциональный способ, который позволяет встроить в форму 1С полноценный просмотрщик PDF на базе библиотеки PDF.js, сохраняя всю интерактивность документа. Он решает исходную проблему с масштабированием и предоставляет пользователю привычный интерфейс.
Принцип работы
Мы используем элемент формы Поле HTML документа. В это поле мы загружаем специально подготовленную HTML-страницу, которая подключает JavaScript-библиотеку PDF.js от Mozilla. Эта библиотека способна отображать (рендерить) PDF-документы прямо в браузере (или в движке WebKit, который использует Поле HTML документа).
Важный момент: чтобы получить максимальный эффект, нужно использовать не просто ядро библиотеки (pdf.js), а готовый компонент просмотра PDFViewer, который входит в ее дистрибутив. Он предоставляет готовую панель инструментов с кнопками масштабирования, навигацией по страницам, поиском, печатью и скачиванием.
Разберем по шагам реализацию:
web с файлом viewer.html. Всю эту структуру необходимо добавить в конфигурацию 1С в виде общего макета.
viewer.html умеет принимать PDF-файл в качестве параметра. Чтобы избежать проблем с правами доступа, лучше всего использовать отображение PDF в 1С через Поле HTML документа и Base64, передавая содержимое файла напрямую в виде строки.
Поле 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 является наилучшим выбором.