Для создания качественных отчётов и корректного экспорта их в разные форматы (PDF, Word, Excel и т.д.) необходимо использование графического движка. Начиная с самых первых версий .NET Framework компания Microsoft использовала GDI+ и его обёртку, в составе библиотеки System.Drawing. FastReport .NET уже давно использует эту же библиотеку для создания красивых и функциональных отчётов. Команда Mono разработала свою реализацию GDI+ для Unix-систем: libgdiplus, которая используется в System.Drawing.Common. Однако, и этот метод работает не идеально.
К сожалению, в отличии от 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, SkiaSharp
Рассмотрим экспорт отчёта Unicode.frx из нашей демки с текстами на разных языках. К сожалению, даже после пересборки libgdiplus с Pango не работает c RtL-языками, такими как Hebrew, Arabic и другие. FastReport.Core.Skia умеет работать с такими языками.
Некорректный PDF экспорт RtL-текста на Linux, libgdiplus с Pango записал весь текст в 1 столбик на 8 страниц
Корректный PDF экспорт RtL-текста на Linux, SkiaSharp
Похожая ситуация наблюдается с некоторыми восточными языками, для корректного отображения которых нужен специальный шрифт:
Некорректный PDF экспорт текста на Linux, libgdiplus с Pango
Корректный PDF экспорт текста на Linux, Skia. Для каждого текста автоматически выбирается подходящий шрифт.
Попробуем работу FastReport.Core.Skia в ранее неподдерживаемом сценарии: работу на устройствах с ARM-процессорами, таких как Apple M1. Создадим консольное приложение .NET 6 (т.к. только .NET 6 имеет нативную поддержку ARM архитектуры для macOS) и сделаем экспорт отчёта Simple List.frx из нашего демо.
И под конец напомним, что System.Drawing.Common начиная с версии 7.0 полностью перестанет поддерживать не-Windows системы, поэтому приведенные выше примеры работы libgdiplus скоро вовсе не будут работать.
Эту версию FastReport.Core нельзя использовать, если применяется API System.Drawing: в некоторых .NET Framework проектах, NET Core 3.1/ NET 5+ WindowsForms проекты, а также в проектах с System.Drawing.Common из-за специфики данной модификации.
Попробуйте новую версию FastReport.Core с поддержкой SkiaSharp и оцените все её преимущества. При возникновении каких-либо вопросов - обращайтесь в нашу Поддержку.