Закончилась эпоха WinForms, началась FastReport.Core.Skia

06.09.2022

Для создания качественных отчётов и корректного экспорта их в разные форматы (PDF, Word, Excel и т.д.) необходимо использование графического движка. Начиная с самых первых версий .NET Framework компания Microsoft использовала GDI+ и его обёртку, в составе библиотеки System.Drawing. FastReport .NET уже давно использует эту же библиотеку для создания красивых и функциональных отчётов. Команда Mono разработала свою реализацию GDI+ для Unix-систем: libgdiplus, которая используется в System.Drawing.Common. Однако, и этот метод работает не идеально.

Проблемы GDI+

К сожалению, в отличии от Windows, работа System.Drawing.Common на других платформах весьма специфична. К частым проблемам, которые мы получаем от наших пользователей, относятся: неправильный расчёт размеров отрисовываемого текста, отсутствие поддержки RTL-языков, неверный интервал между словами, ошибка переноса слов в предложении, отсутствие поддержки ARM-процессоров и общая нестабильность libgdiplus (ошибки вида “Out of memory”, проблемы при работе в многопоточной конфигурации).

Часть из этих проблем решается ручной пересборкой libgdiplus из репозитория Mono с поддержкой Pango/Cairo. В любом случае это неудобно, особенно если ваше приложение использует контейнеризацию. Оставшаяся часть проблем влияет на качество экспорта отчётов на всех операционных системах кроме Windows.

В итоге компания Microsoft официально отказалась от поддержки System.Drawing.Common на не-Windows платформах. Вот их публикация на эту тему: “Breaking change: System.Drawing.Common only supported on Windows - .NET | Microsoft Docs. После неё наши пользователи начали активно интересоваться, как они смогут использовать мощную функциональность FastReport на ОС Linux или macOS.

Решение

Мы разработали специальную версию FastReport.Core, которая использует в качестве графического движка Skia и его обертку для .NET - SkiaSharp, под названием - FastReport.Core.Skia. Пакеты FastReport.Core.Skia и FastReport.Web.Skia доступны на нашем приватном NuGet сервере.

В случае, если у вас наблюдались проблемы с отрисовкой текста под Linux с libgdiplus, настоятельно рекомендуем попробовать FastReport.Core.Skia. Для использования в вашем приложении достаточно сменить название пакета FastReport.Core -> FastReport.Core.Skia, а также добавить следующие пакеты для работы на Linux (на Windows и macOS необходимые пакеты добавляются автоматически):

- SkiaSharp.NativeAssets.Linux (NuGet).

- HarfBuzzSharp.NativeAssets.Linux (NuGet).

Давайте теперь попробуем сравнить FastReport.Core с libgdiplus и FastReport.Core.Skia на Linux/macOS.

Для начала рассмотрим некорректный расчет длины текста после экспорта в HTML формат на ОС Linux Ubuntu 20.04. На изображениях ниже можно заметить, как даже пересобранный из исходников libgdiplus с Pango неверно отображает конец 1-ой строки, теряя часть информации, Skia работает отлично.

Некорректный HTML экспорт на Linux, libgdiplus + Pango

Некорректный HTML экспорт на Linux, libgdiplus + Pango

 

Корректный HTML экспорт на Linux, SkiaSharp

Корректный HTML экспорт на Linux, SkiaSharp

Рассмотрим экспорт отчёта Unicode.frx из нашей демки с текстами на разных языках. К сожалению, даже после пересборки libgdiplus с Pango не работает c RtL-языками, такими как Hebrew, Arabic и другие. FastReport.Core.Skia умеет работать с такими языками.

Некорректный PDF экспорт RtL-текста на Linux, libgdiplus с Pango записал весь текст в 1 столбик на 8 страниц

Некорректный PDF экспорт RtL-текста на Linux, libgdiplus с Pango записал весь текст в 1 столбик на 8 страниц

Корректный PDF экспорт RtL-текста на Linux, SkiaSharp

Корректный PDF экспорт RtL-текста на Linux, SkiaSharp

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

Некорректный PDF экспорт текста на Linux, libgdiplus с Pango

Некорректный PDF экспорт текста на Linux, libgdiplus с Pango

Корректный PDF экспорт текста на Linux, Skia. Для каждого текста автоматически выбирается подходящий шрифт.

Корректный PDF экспорт текста на Linux, Skia. Для каждого текста автоматически выбирается подходящий шрифт.

Попробуем работу FastReport.Core.Skia в ранее неподдерживаемом сценарии: работу на устройствах с ARM-процессорами, таких как Apple M1. Создадим консольное приложение .NET 6 (т.к. только .NET 6 имеет нативную поддержку ARM архитектуры для macOS) и сделаем экспорт отчёта Simple List.frx из нашего демо.

PDF экспорт на macOS с Apple M1, SkiaSharp

И под конец напомним, что System.Drawing.Common начиная с версии 7.0 полностью перестанет поддерживать не-Windows системы, поэтому приведенные выше примеры работы libgdiplus скоро вовсе не будут работать.

System.Drawing.Common перестанет поддерживать не-Windows системы

Ограничения:

Эту версию FastReport.Core нельзя использовать, если применяется API System.Drawing: в некоторых .NET Framework проектах, NET Core 3.1/ NET 5+ WindowsForms проекты, а также в проектах с System.Drawing.Common из-за специфики данной модификации.

Попробуйте новую версию FastReport.Core с поддержкой SkiaSharp и оцените все её преимущества. При возникновении каких-либо вопросов - обращайтесь в нашу Поддержку.

28 октября 2024

Как настроить WSL 2 для работы с FastReport и FastCube

В этой статье попробуем вместе разобраться, как настроить WSL 2 для работы с компонентами FastReport и FastCube в Lazarus для Linux.
8 августа 2024

Как установить FastReport .NET и его компоненты в Windows

Пошаговая инструкция по онлайн и ручной установке через регистрационный код FastReport .NET и его компонентов в Windows.
26 июля 2024

Обновление HTMLObject в виде плагина для FastReport .NET

Подробная инструкция по использованию нового плагина HTMLObject, использующий разбиение DOM HTML на объекты отчета FastReport.