22 февраля 2021

Создание PDF файла в Linux без графической оболочки используя FastReport FMX

    В комментариях к статье "Создание PDF файла в Windows и Linux" читатели рассказали о использовании для создания документов в формате PDF генератора отчетов FastReport. У меня уже был подобный опыт, и я даже писал об этом 10 лет тому назад. Сейчас я не стал приводить пример с FastReport, так как моя статья была написана еще до выхода FastReport FMX версии 2.8, в которой была добавлена поддержка FmxLinux. Сегодня я сделал несколько первых экспериментов с FastReport FMX под Ubuntu Desktop 20.04. Он действительно работает под Linux! Запускать мой тест экспорта в PDF я решил, как и в прошлой статье, не под Ubuntu Desktop, а под Ubuntu Server.
    Беглый взгляд на исходный текст модуля FMX.frxExportPDF позволяет сделать вывод, что класс TfrxPDFExport рассчитан на экспорт наследников класса TfrxView. Класс TfrxView является базовым для объектов, которые можно разместить на странице шаблона FastReport. Это значит, что использовать TfrxPDFExport отдельно от генератора отчетов не получится.
    Сделаем тестовый шаблон для FastReport (для этого я воспользовался демо-программой из инсталлятора FastReport).
FastReport FMX on Ubuntu Desktop
И напишем небольшую программу, которая загрузит тестовый шаблон, сгенерирует отчет и экспортирует его в файл формата PDF.
program frPdf;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  FMX.frxClass, FMX.frxExportPDF;

procedure Test;
var
  frxReport: TfrxReport;
  frxPDFExport: TfrxPDFExport;
begin
  frxReport := TfrxReport.Create(nil);
  try
    frxReport.ShowProgress := False;
    if frxReport.LoadFromFile('test.fr3') and frxReport.PrepareReport then
      begin
        frxPDFExport := TfrxPDFExport.Create(nil);
        try
          frxPDFExport.ShowDialog := False;
          frxPDFExport.ShowProgress := False;
          frxPDFExport.EmbeddedFonts := True;
          frxPDFExport.FileName := 'test.pdf';
          frxReport.Export(frxPDFExport);
        finally
          frxPDFExport.Free;
        end;
      end;
  finally
    frxReport.Free
  end;
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  try
    test
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Проверяем ее работоспособность под Windows. Затем компилируем версию под Linux, запускаем на Ubuntu Server и получаем ошибку:
GTK 3 is required to be installed
Не работает. Но зато мы узнали, что FastReport под Linux для графического интерфейса пользователя использует GTK 3. Устанавливаем GTK 3:
sudo apt-get install libgtk-3-dev
Запускаем программу и получаем еще больше ошибок:
Unable to init X Window server
Теперь FastReport хочет Window. Точнее X Window. Воспользуемся Xvfb (X virtual framebuffer). Xvfb – это виртуальный X11-сервер, который реализует поддержку протокола X Window и выполняет все графические операции в памяти без вывода на экран. С точки зрения GUI-клиента он ничем не отличается от обычного X11-сервера. Устанавливаем Xvfb:
sudo apt-get install xvfb
Запускаем программу с использованием Xvfb-сервера
xvfb-run ./frPdf
и получаем PDF-файл
PDF файл созданный в FastReport под Linux
    Для меня вывод очевиден. Если поставленная задача позволяет представить необходимый документ в виде шаблона, то вместо специальной библиотеки для создания документов в формате PDF, удобнее использовать генератор отчетов FastReport. Тем более, что теперь он кроссплатформенный и поддерживает Windows, Linux и MacOS.

1 комментарий:

  1. Для полной кроссплатформенности у FastReport не хватает Android и iOS :-)

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