Почему нестандартные шрифты заменяются на Arial при сохранении табличного документа 1С в PDF на сервере, и как это исправить?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← К списку

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

Причина проблемы кроется в особенностях работы платформы 1С с шрифтами при серверном формировании PDF. Справка 1С явно указывает: "При выводе в формат PDF шрифты, которые нельзя внедрять, а также шрифты, не являющиеся TrueType или OpenType, будут заменены на шрифт Arial. Если данный шрифт не обнаружен, то будет использован шрифт Helvetica". Это означает, что платформа имеет ограничения по встраиванию некоторых типов шрифтов в PDF-файл, особенно если они не соответствуют определенным стандартам или имеют лицензионные ограничения на внедрение.

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

Самое простое решение: используем стандартные шрифты

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

Почему это работает? Стандартные шрифты, такие как Arial, Times New Roman, Verdana и другие, являются TrueType или OpenType и не имеют ограничений на внедрение. Это гарантирует, что при сохранении в PDF они будут отображаться корректно, без искажений и "кракозябр".

Как это сделать?

  1. Откройте макеты табличных документов, в которых используются проблемные шрифты.
  2. Выделите области с текстом и измените шрифт на один из стандартных.
  3. Проверьте отображение документа в PDF после изменения.

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

Надежный обходной путь: сохранение PDF на стороне клиента

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

Давайте разберем этот процесс по шагам:

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

  2. Сохранение табличного документа во временные данные на сервере. Мы не можем напрямую передать объект ТабличныйДокумент на клиент для сохранения, но можем сохранить его в виде двоичных данных или во временный файл в формате .mxl. Передача объекта ТабличныйДокумент с сервера на клиент через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр или СериализаторXDTO может не дать желаемого результата, так как объект может потерять некоторые свойства при сериализации.

    
    // Пример сохранения ТабличногоДокумента в ДвоичныеДанные на сервере
    ТабДок = Новый ТабличныйДокумент;
    // ... заполнение ТабДок ...
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".mxl");
    ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.MXL);
    
    ДвоичныеДанныеТабДока = Новый ДвоичныеДанные(ИмяВременногоФайла);
    УдалитьФайлы(ИмяВременногоФайла); // Удаляем временный файл
    
  3. Передача двоичных данных на клиент. Полученные ДвоичныеДанные мы передаем на клиентскую сторону, используя вызов клиентской процедуры с параметром.

    
    // Пример вызова клиентской процедуры с сервера
    // ... на сервере ...
    ДвоичныеДанныеТабДока = ПолучитьДвоичныеДанныеТабличногоДокумента(); // Наша функция из шага 2
            
    ВызватьПроцедуруНаКлиенте(ДвоичныеДанныеТабДока);
    
  4. Восстановление и сохранение на клиенте. На клиенте мы считываем ДвоичныеДанные обратно в ТабличныйДокумент и используем метод Записать() для сохранения в PDF. В этом случае будут применены клиентские настройки шрифтов.

    
    // Пример клиентской процедуры
    Процедура ВызватьПроцедуруНаКлиенте(ДвоичныеДанныеТабДока) Экспорт
        // Сохраняем двоичные данные во временный файл на клиенте
        ИмяВременногоФайлаMXL = ПолучитьИмяВременногоФайла(".mxl");
        ДвоичныеДанныеТабДока.Записать(ИмяВременногоФайлаMXL);
    
        // Считываем его обратно в ТабличныйДокумент
        ТабДокНаКлиенте = Новый ТабличныйДокумент;
        ТабДокНаКлиенте.Прочитать(ИмяВременногоФайлаMXL);
    
        // Открываем диалог сохранения файла
        ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        ДиалогВыбораФайла.Заголовок = "Сохранить документ в PDF";
        ДиалогВыбораФайла.ПолноеИмяФайла = "Документ.pdf";
        ДиалогВыбораФайла.Фильтр = "PDF (*.pdf)|*.pdf";
    
        Если ДиалогВыбораФайла.Выбрать() Тогда
            ИмяФайлаPDF = ДиалогВыбораФайла.ПолноеИмяФайла;
            Попытка
                ТабДокНаКлиенте.Записать(ИмяФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
                Сообщить("Документ успешно сохранен в " + ИмяФайлаPDF);
            Исключение
                Сообщить("Ошибка при сохранении в PDF: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    
        УдалитьФайлы(ИмяВременногоФайлаMXL); // Удаляем временный файл
    КонецПроцедуры
    

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

Расширяем возможности: сторонние библиотеки и конвертеры

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

Рассмотрим несколько популярных вариантов:

  1. Quick PDF Library. Это мощная сторонняя библиотека, которая предоставляет обширный функционал для работы с PDF. Она позволяет добавлять текст, изображения, редактировать PDF-файлы и, что важно для нас, встраивать шрифты. Существует даже бесплатная урезанная версия Quick PDF Library Lite, которая может быть достаточна для базовых задач. Использование таких библиотек потребует регистрации и интеграции их в вашу систему 1С.

  2. Виртуальные PDF-принтеры. Установка виртуального PDF-принтера (например, BullZip PDF Printer, doPDF или аналогичного) на сервере может помочь в случаях, когда требуется корректное формирование PDF. Процесс сохранения в этом случае будет имитировать печать: вместо сохранения напрямую, мы будем "печатать" табличный документ на виртуальный принтер, который затем формирует PDF-файл. Виртуальные принтеры часто имеют свои механизмы обработки шрифтов, которые могут быть более гибкими, чем встроенные в 1С.

  3. Gotenberg.dev. Этот инструмент, который можно развернуть локально, предназначен для конвертации файлов офисных форматов и веб-страниц (через Chrome) в PDF. Если ваш табличный документ может быть представлен в одном из поддерживаемых форматов (например, HTML или DOCX), Gotenberg может стать мощным серверным решением для конвертации.

  4. ImageMagick. Хотя ImageMagick в основном используется для работы с изображениями, он может быть полезен для формирования визуализации PDF/A и файлов предпросмотра, особенно в связке с другими инструментами для комплексной обработки PDF.

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

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

Работа со шрифтами: встраивание и форматы

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

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

Типы шрифтов и их особенности:

Понимание этих нюансов поможет нам принимать обоснованные решения при выборе стратегии работы со шрифтами в 1С.

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

← К списку