22 марта 2021

Использование TrueType шрифтов Microsoft в FastReport FMX под Linux

    Шрифты, устанавливаемые на компьютер вместе с продуктами Microsoft, плотно вошли в нашу жизнь. Их использование в документах – это давно уже не дань моде или привычке. Это требование, закрепленное в наших государственных стандартах. Например, шрифт Times New Roman упоминается в "инструкции по оформлению документов с использованием компьютерных технологий в органах государственного управления и иных государственных организациях". Дистрибутивы Linux не поставляется с проприетарными шрифтами Microsoft. Но, тогда как заставить исполняемую под Linux программу создавать в FastReport документы, соответствующие высоким государственным стандартам?
    Получить TrueType шрифты Microsoft на законных основаниях можно установив из официального репозитория Linux пакет msttcorefonts. Например, на Ubuntu для этого необходимо выполнить команду:
sudo apt-get install ttf-mscorefonts-installer
Главное в процессе установки согласиться с лицензионным соглашением (EULA) компании Microsoft. Если операционная система сразу не увидела установленные шрифты, то необходимо обновить кэш шрифтов:
sudo fc-cache -f -v
    Нужные шрифты мы установили. Теперь генерируем отчет в FastReport FMX и экспортируем его в документ формата PDF. Как это делать под Linux я писал ранее (воспользуемся той же самой тестовой программой). Сравним PDF файлы, созданные тестовой программой под Windows:
PDF файл созданный FastReport под Windows
и под Linux:
PDF файл созданный FastReport под Linux
Как видите, они очень похожи. Но 100 процентного совпадения нет. Почему?
    О причине несовпадения можно догадаться если заглянуть внутрь этих файлов. В файле созданном под Windows шрифты соответствуют шаблону FastReport, а в файле созданном под Linux нет:
Шрифт в шаблоне Шрифт в PDF под Windows Шрифт в PDF под Linux
Arial Arial Liberation Sans
Times New Roman Times New Roman Liberation Serif
Courier New Courier New Liberation Mono
Verdana Verdana DejaVu Sans
    Будет еще хуже, если при экспорте возникнет желание уменьшить размер PDF-файла за счет отключения встраивания шрифтов. Например, тестовый файл с первого рисунка cо встроенными шрифтами – 323 КБ, а без них – 13.4 КБ. Разница существенная. Это значит желание возникло. Отключаем:
frxPDFExport.EmbeddedFonts := False;
Отключаем и получаем новую проблему. Созданный под Linux PDF файл без встроенных шрифтов может не открыться под Windows, если не установлены дополнительные шрифты:
Не удается найти или создать шрифт Liberation Sans
    Итак, нужные шрифты в Linux у нас установлены, но FastReport FMX при создании документа их не использует. Очередной "Почему?". Ответ на него подскажет модуль FMX.frxLinuxFonts.pas:
unit FMX.frxLinuxFonts;
...
const DefFontsSubs: String =
      '<?xml version="1.1" encoding="utf-8"?>' +
      '<SUBFONTS Clear="True">' +
      '<FONT NAME="Arial" SUBNAME="Liberation Sans"/>' +
      '<FONT NAME="MS Sans Serif" SUBNAME="Liberation Sans"/>' +
      '<FONT NAME="Arimo" SUBNAME="Liberation Sans"/>' +
      '<FONT NAME="Times New Roman" SUBNAME="Liberation Serif"/>' +
      '<FONT NAME="Tinos" SUBNAME="Liberation Serif"/>' +
      '<FONT NAME="Courier New" SUBNAME="Liberation Mono"/>' +
      '<FONT NAME="Tahoma" SUBNAME="DejaVu Sans"/>' +
      '<FONT NAME="Verdana" SUBNAME="DejaVu Sans"/>' +
      '</SUBFONTS>';

      XMLConfName: String = 'SubFonts.xml';
...
constructor TfrxFontsList.Create;
...
begin
  ...
  fName := ExtractFilePath(ParamStr(0)) + XMLConfName;
  if FileExists(fName) then
    FontCollection.LoadSubstitutionConfig(fName);
  ...
Для обеспечения работоспособности программы разработчики FastReport реализовали механизм подмены шрифтов Windows на похожие шрифты Linux. Для особо придирчивых разработчиков и/или пользователей они предоставили возможность самим управлять подменой шрифтов через конфиг файл в формате XML. Думаю, что структура этого конфиг файла понятна. Скажу только, о теге "SUBFONTS". Если его атрибуту "Clear" присвоить значение "False" или не присвоить ничего, то при загрузке из файла существующие значения подмены не удаляются, а будут заменены или дополнены новыми.
    Создаем файл SubFonts.xml в папке программы под Linux:
<?xml version="1.1" encoding="utf-8"?>
<SUBFONTS>
  <FONT NAME="Arial" SUBNAME="Arial"/>
  <FONT NAME="Times New Roman" SUBNAME="Times New Roman"/>
  <FONT NAME="Courier New" SUBNAME="Courier New"/>
  <FONT NAME="Tahoma" SUBNAME="Tahoma"/>
  <FONT NAME="Verdana" SUBNAME="Verdana"/>
</SUBFONTS>
Запускам программу, открываем полученный PDF файл и наслаждаемся 100 процентным совпадением документов созданных под Windows и под Linux.

2 комментария:

  1. Не подскажите, работают ли в FastReport.FMX под Linux HTML теги в тексте? Ну типа <b> или <u>. А то в VCL разрабы отказались от реализации данного функционала под Linux :(

    ОтветитьУдалить