Как исправить некорректное отображение шрифтов в формате PDF при использовании объекта ДокументPDF?

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

С выходом платформы 1С:Предприятие 8.3.24 разработчики получили долгожданный инструмент для прямой работы с PDF-файлами — объект ДокументPDF. Он позволяет программно читать, объединять и отображать документы без использования внешних библиотек. Однако на практике многие столкнулись с проблемой: при использовании метода Показать() вместо текста отображаются нечитаемые символы (что мешает печати пособий) или пустые блоки, хотя в Adobe Acrobat этот же файл выглядит идеально. Рассмотрим подробно, почему это происходит и как решить данную проблему.

Анализируем причину: почему 1С «ломает» шрифты?

Разберем ситуацию: когда мы открываем файл через специализированное ПО (например, Adobe Acrobat Reader), программа использует мощные внутренние алгоритмы рендеринга и огромную базу встроенных шрифтов. В случае отсутствия конкретного шрифта Acrobat умеет выполнять интеллектуальную подстановку (font substitution).

Встроенный просмотрщик 1С использует собственный движок. Основные причины проблем с визуализацией следующие:

  1. Отсутствие внедренных шрифтов: Если при создании PDF-файла (например, в AutoCAD или специфическом конструкторском ПО) шрифты не были внедрены в структуру документа (Embedding), 1С пытается найти их в операционной системе. Если их там нет, возникают «кракозябры».
  2. Особенности кодировок (CMap): Чертежи и схемы часто используют таблицы символов CMap и шрифты типа Type 1 или CID-шрифты. Ранние сборки платформы 8.3.24 (включая 8.3.24.1548) имели ограниченную поддержку таких таблиц для кириллицы.
  3. Среда исполнения: Несмотря на то, что метод Показать() вызывается на клиенте, процесс подготовки или формирования данных может происходить на сервере, где набор доступных шрифтов может отличаться.

Решение 1: Установка и регистрация системных шрифтов

Проанализируем первый и самый очевидный шаг. Если документ использует стандартные, но редкие шрифты (например, ГОСТовские шрифты для чертежей), их необходимо установить в операционную систему.

Важные нюансы установки:

Решение 2: Принудительное встраивание шрифтов (Font Embedding)

Если у нас есть возможность влиять на процесс генерации PDF-файла (например, файл создается сторонней системой по нашему заказу), необходимо настроить полное встраивание шрифтов (Full Embed). Рассмотрим разницу:

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

Решение 3: Использование альтернативного способа просмотра через Поле HTML

Если системные шрифты не помогают, а объект ДокументPDF продолжает отображать текст некорректно, воспользуемся проверенным обходным путем. Вместо метода Показать(), задействуем движок браузера, который обычно лучше справляется с рендерингом PDF.

Для этого создадим на форме Поле HTML документа и выведем файл следующим образом:


&// На Клиенте
Процедура ОтобразитьPDFВПолеHTML(ДанныеФайла)
    // Помещаем данные во временное хранилище, чтобы браузер мог их прочитать
    АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
    
    // Формируем простейший HTML-контейнер
    ТекстHTML = "<html>
    |<body style='margin:0;padding:0;overflow:hidden;'>
    |<embed src='" + АдресФайла + "' type='application/pdf' width='100%' height='100%' />
    |</body>
    |</html>";
    
    Элементы.ПолеHTMLПросмотра.УстановитьТекст(ТекстHTML);
КонецПроцедуры

Этот метод позволяет использовать системные компоненты (например, WebView2 в Windows), которые отображают PDF так же качественно, как современные браузеры.

Решение 4: Обновление платформы и проверка типа файла

Выясним, какую версию платформы мы используем. В версии 8.3.24.1548 функционал был достаточно сырым. В более поздних релизах (начиная с 8.3.24.2000 и в ветке 8.3.25) разработчики 1С внесли множество исправлений в механизмы работы с текстом в PDF. Если проблема сохраняется, обновление платформы — обязательный шаг.

Также не забудем проверить свойство ТипФайла объекта ДокументPDF. Иногда явное указание типа при чтении помогает платформе правильно интерпретировать поток данных:


ДокументPDF = Новый ДокументPDF;
// Можно попробовать явно указать тип, если читаем из потока
ДокументPDF.Прочитать(Поток); 
// Проверяем тип после чтения
Если ДокументPDF.ТипФайла = ТипФайлаДокументаPDF.PDF Тогда
    ДокументPDF.Показать("Просмотр документа");
КонецЕсли;

Миф о недоступности объекта на сервере

Проанализируем одно из заблуждений, встретившихся в обсуждении. Утверждение о том, что ДокументPDF недоступен на сервере — ошибочно. Согласно официальной документации, этот объект доступен в контексте Сервера, Толстого клиента и Внешнего соединения. Это позволяет нам выполнять «тяжелые» операции (например, склейку нескольких PDF-чертежей в один многостраничный файл) в фоновом задании на сервере, не блокируя работу пользователя.

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

← На главную