Создание PDF-документов в кроссплатформенном приложении на FireMonkey
Мобильные приложения давно перестали быть просто средством общения или развлечения. Сегодня они активно используются в бизнесе, на производстве, в логистике и медицине, где часто возникает задача формирования печатных форм прямо на устройстве пользователя. Электронные документы нужны для отправки клиентам, архивирования, обмена с контролирующими органами и внутреннего документооборота.
PDF стал де-факто стандартом для обмена форматированными документами благодаря кроссплатформенности, неизменности внешнего вида и поддержке со стороны практически любых операционных систем. Именно поэтому генерация PDF-отчетов в приложении на FireMonkey является одной из наиболее востребованных функций при разработке кроссплатформенного ПО.
Delphi и фреймворк FireMonkey предлагают разработчику несколько путей решения. Можно воспользоваться встроенными инструментами, подключить специализированные компоненты сторонних производителей или разработать собственный модуль формирования документов. Каждый из вариантов имеет свои сильные и слабые стороны.
Выбор конкретного подхода зависит от множества факторов: требуемой функциональности, целевых платформ, ограничений по размеру приложения, бюджета проекта и квалификации команды. Прежде чем приступать к реализации, важно оценить все доступные инструменты и понять, какой из них лучше соответствует поставленным задачам.
Роль PDF в современных бизнес-приложениях
Формат PDF используется повсеместно — от небольших квитанций и накладных до многостраничных финансовых отчетов и технической документации. В мобильной среде этот формат особенно ценен, поскольку позволяет передавать документ с одного устройства на другое без потери структуры и оформления.
В приложениях для Android, iOS, Windows и macOS пользователи ожидают возможности получить готовый документ одним нажатием кнопки. Это касается сферы услуг, торговли, складского учета, выездного обслуживания. Заказчик хочет видеть акт выполненных работ, чек, договор или схему объекта прямо на экране своего смартфона или планшета.
При работе с FireMonkey важно помнить, что приложение должно одинаково корректно функционировать на всех поддерживаемых платформах. Это означает, что и механизм создания PDF должен быть единым, без необходимости писать отдельную реализацию под каждую операционную систему. Именно такая унификация делает задачу особенно интересной с архитектурной точки зрения.
Встроенные возможности платформы FireMonkey
Самым очевидным способом получить PDF из FireMonkey является использование системного сервиса печати. В модуле FMX.Printer реализован класс TPrinter, который позволяет формировать изображение через Canvas и отправлять его на физическое или виртуальное устройство вывода. Под капотом он взаимодействует с графическими подсистемами операционной системы.
Для отрисовки содержимого будущего документа разработчик может использовать TBitmap, TCanvas и стандартные графические примитивы FireMonkey. После того как изображение готово, его можно передать в подсистему печати, которая на iOS и Android задействует встроенные в платформу механизмы создания PDF-файлов. На настольных системах результат обычно направляется в системный диалог печати, из которого пользователь может выбрать виртуальный принтер PDF.
Достоинством такого подхода является полное отсутствие внешних зависимостей и минимальный размер исполняемого файла. Однако возможности форматирования ограничены тем, что разработчик рисует содержимое самостоятельно. Приходится вручную реализовывать разбиение на страницы, работу с таблицами, заголовками и подвалом, что в сложных проектах становится трудоемкой задачей.
Сторонние библиотеки и компоненты
Когда возможностей стандартных средств недостаточно, разработчики обращаются к специализированным библиотекам. Наиболее популярными решениями для Delphi и FireMonkey являются FastReport FMX, ReportBuilder и ряд более легких компонентов, ориентированных исключительно на генерацию PDF.
Эти библиотеки предоставляют визуальный дизайнер отчетов, возможность подключения источников данных, поддержку шрифтов, графики, таблиц и экспорта в несколько форматов. Они берут на себя всю рутинную работу по компоновке страниц, расчету размеров элементов и формированию корректного PDF-файла. Разработчику остается только описать шаблон и передать ему данные.
Из дополнительных преимуществ — наличие готовых шаблонов, поддержка выражений и скриптов, возможность встраивания шрифтов в документ для гарантии корректного отображения на любом устройстве. Минусами являются увеличение размера приложения, необходимость приобретения лицензии и в ряде случаев — ограниченная поддержка мобильных платформ в младших редакциях.
| Возможность | FMX.Printer | FastReport FMX | ReportBuilder | SynPDF |
|---|---|---|---|---|
| Кроссплатформенность | Полная | Полная | Ограниченная | Полная |
| Визуальный дизайнер | Нет | Да | Да | Нет |
| Источники данных | Вручную | Любые | Любые | Вручную |
| Встраивание шрифтов | Системные | Да | Да | Да |
| Лицензия | Бесплатно | Коммерческая | Коммерческая | Бесплатно |
| Размер добавки | Минимальный | Значительный | Значительный | Небольшой |
FastReport FMX как универсальное решение
FastReport FMX заслуженно считается одним из наиболее зрелых продуктов для формирования отчетов в FireMonkey. Он предлагает WYSIWYG-дизайнер, в котором шаблон создается так же, как в настольных системах, а затем используется на мобильных устройствах без изменений. Это особенно ценно при разработке приложений, которые должны выглядеть единообразно на разных платформах.
Библиотека поддерживает работу с базами данных через стандартные компоненты FireDAC и любые пользовательские источники. В шаблон можно включать текст, изображения, таблицы, диаграммы, штрих-коды и QR-коды. Предусмотрены механизмы динамического формирования содержимого, условного форматирования и работы с переменными.
Отдельного внимания заслуживает механизм экспорта. FastReport FMX позволяет не только сохранить готовый отчет в PDF, но и отправить его по электронной почте, передать в системные приложения через механизм Share Sheet или сохранить в облачное хранилище. Для мобильных платформ эта функциональность реализована через системные API, что обеспечивает соответствие гайдлайнам Apple и Google.
Особенности отображения документов на мобильных устройствах
При работе с мобильными платформами разработчик сталкивается с рядом специфических требований. Диагональ экрана смартфона существенно меньше, чем у монитора компьютера, поэтому шаблон отчета нужно проектировать с расчетом на последующий просмотр в альбомной ориентации или на планшете. Это снижает необходимость масштабирования и обеспечивает читаемость мелкого текста.
На iOS и Android действуют ограничения по работе с файловой системой. Приложение не может просто записать PDF в произвольную папку — необходимо использовать механизмы Storage Access Framework на Android или документы приложения в iCloud на iOS. FireMonkey абстрагирует эти различия, но при использовании сторонних библиотек важно учитывать их совместимость с этими механизмами.
Нельзя игнорировать вопрос пользовательского опыта. Долгое формирование документа на маломощном устройстве раздражает. Желательно отображать индикатор прогресса, позволять отменять операцию и сохранять готовый файл в легкодоступном для пользователя месте — например, в папке Загрузки или в облачном хранилище.
Оптимизация производительности при формировании документов
Производительность — один из ключевых факторов, особенно когда речь идет о больших отчетах. Отрисовка сотен или тысяч строк через Canvas FireMonkey может занимать заметное время. Чтобы ускорить процесс, применяют несколько приемов, проверенных на практике.
Первый — пакетная отрисовка. Все элементы отчета накапливаются в буфере, и лишь затем единым блоком отправляются на устройство вывода. Это сокращает количество обращений к графической подсистеме и снижает общую нагрузку на процессор. Второй прием — повторное использование уже отрисованных фрагментов. Если в отчете много однотипных строк, их изображения можно подготовить один раз и затем клонировать с минимальными затратами.
Также важно правильно выбирать разрешение итогового документа. Слишком высокое значение DPI увеличивает размер файла без видимого улучшения качества при печати на стандартных принтерах. Оптимальным считается диапазон 150–300 DPI в зависимости от характера содержимого. Для документов с преимущественно текстовым наполнением достаточно 150 DPI, тогда как для схем и чертежей лучше использовать 300 DPI и выше.
Отдельно стоит упомянуть фоновую генерацию. Если формирование отчета занимает несколько секунд, его лучше вынести в отдельный поток, чтобы интерфейс приложения оставался отзывчивым. В FireMonkey для этого предусмотрены компоненты TTask и TThread, которые позволяют запускать длительные операции асинхронно без блокировки основного потока пользовательского интерфейса.