Linux, macOS и Docker | Aspose.TeX для .NET

Выбор пакета

Aspose.TeX для .NET публикуется в виде двух пакетов NuGet с одинаковым API и одинаковым номером версии:

ПакетГрафическая подсистемаWindowsLinux, macOSЦелевые платформы
Aspose.TeXSystem.Drawing.Common (GDI+)ДаНет.NET Framework 4.0, .NET Standard 2.0, .NET 6.0, .NET 7.0
Aspose.TeX.DrawingAspose.Drawing (управляемая, встроена в пакет)ДаДа.NET Standard 2.0, .NET 7.0

Начиная с .NET 6, Microsoft поддерживает System.Drawing.Common только в Windows. Если приложение использует пакет Aspose.TeX в Linux или macOS, оно падает при первой же попытке что-либо отрисовать:

1System.PlatformNotSupportedException: System.Drawing.Common is not supported on this platform.

Используйте Aspose.TeX.Drawing, если приложение работает в Linux, macOS, Docker-контейнерах или в другой среде, отличной от Windows. Пакет работает и в Windows, поэтому, если вы собираете одно приложение для нескольких платформ, его можно использовать везде.

Aspose.TeX.Drawing не зависит от System.Drawing.Common и libgdiplus. Графическая подсистема Aspose.Drawing встроена в Aspose.TeX.dll, поэтому пакет добавляет в приложение одну сборку. Сборка для .NET 7.0 используется в .NET 7, 8, 9, 10 и более поздних версиях; сборка для .NET Standard 2.0 — в .NET Framework 4.7.2 и более поздних версиях.

Установка пакета

Выполните одну из следующих команд в папке проекта:

1dotnet add package Aspose.TeX.Drawing
1Install-Package Aspose.TeX.Drawing

Другие способы подключения пакета описаны на странице Установка.

Подключайте только один из двух пакетов. Если проект ссылается и на Aspose.TeX, и на Aspose.TeX.Drawing, он собирается без предупреждений, но в выходную папку копируется только одна Aspose.TeX.dll, и приложение падает во время выполнения, например с ошибкой TypeLoadException: Could not load type 'Aspose.TeX.Drawing.SizeF' from assembly 'Aspose.TeX'. При переходе на Aspose.TeX.Drawing сначала удалите пакет Aspose.TeX:

1dotnet remove package Aspose.TeX
2dotnet add package Aspose.TeX.Drawing

Переход с Aspose.TeX на Aspose.TeX.Drawing

Пространства имён, классы и члены в обоих пакетах одинаковы, поэтому после замены пакета большая часть кода не требует изменений.

Цвета и размеры

Параметры и результаты отрисовки используют цвета и размеры, например MathRendererOptions.TextColor, FigureRendererOptions.BackgroundColor и возвращаемое значение MathRenderer.Render. В Aspose.TeX.Drawing эти члены имеют типы Aspose.TeX.Drawing.Color и Aspose.TeX.Drawing.SizeF. Оба типа неявно преобразуются в System.Drawing.Color и System.Drawing.SizeF и обратно. Это стандартные типы .NET, доступные на любой платформе без System.Drawing.Common, поэтому такой код компилируется и работает с любым из пакетов:

 1using System.Drawing;
 2using System.IO;
 3using Aspose.TeX.Features;
 4
 5PngMathRendererOptions options = new PngMathRendererOptions
 6{
 7    Resolution = 150,
 8    TextColor = Color.Black,
 9    BackgroundColor = Color.White
10};
11
12using (Stream stream = File.Create("formula.png"))
13{
14    SizeF size = new PngMathRenderer().Render(@"$$E = mc^2$$", stream, options);
15}

Режимы сглаживания и интерполяции

Единственное изменение касается свойств SmoothingMode и InterpolationMode параметров сохранения изображений (PngSaveOptions, JpegSaveOptions, BmpSaveOptions, TiffSaveOptions). В пакете Aspose.TeX они используют перечисления из пространства имён System.Drawing.Drawing2D, которое относится к System.Drawing.Common (компилятор помечает их как доступные только в Windows предупреждением CA1416). В Aspose.TeX.Drawing они используют перечисления Aspose.TeX.Drawing.SmoothingMode и Aspose.TeX.Drawing.InterpolationMode с теми же членами. Замените директиву using, остальной код оставьте без изменений.

С Aspose.TeX:

1using System.Drawing.Drawing2D;
2using Aspose.TeX.Presentation.Image;
3
4PngSaveOptions saveOptions = new PngSaveOptions
5{
6    Resolution = 300,
7    SmoothingMode = SmoothingMode.AntiAlias,
8    InterpolationMode = InterpolationMode.HighQualityBicubic
9};

С Aspose.TeX.Drawing:

 1using Aspose.TeX.Presentation.Image;
 2using SmoothingMode = Aspose.TeX.Drawing.SmoothingMode;
 3using InterpolationMode = Aspose.TeX.Drawing.InterpolationMode;
 4
 5PngSaveOptions saveOptions = new PngSaveOptions
 6{
 7    Resolution = 300,
 8    SmoothingMode = SmoothingMode.AntiAlias,
 9    InterpolationMode = InterpolationMode.HighQualityBicubic
10};

Импортируйте эти два типа с псевдонимами, как показано выше, а не директивой using Aspose.TeX.Drawing;. Пространство имён Aspose.TeX.Drawing содержит также Color и SizeF, поэтому его импорт вместе с System.Drawing приводит к ошибке компиляции CS0104: 'Color' is an ambiguous reference.

Типы пространства имён Aspose.TeX.Drawing

Пространство имён Aspose.TeX.Drawing есть только в пакете Aspose.TeX.Drawing:

ТипГде используетсяСовместимость с System.Drawing
ColorMathRendererOptions.TextColor, FigureRendererOptions.BackgroundColorНеявное преобразование в System.Drawing.Color и обратно
SizeFВозвращаемое значение MathRenderer.Render и FigureRenderer.Render; Size в MathRendererPluginResult и FigureRendererPluginResultНеявное преобразование в System.Drawing.SizeF и обратно
SmoothingModeImageSaveOptions.SmoothingModeТе же члены и значения, что у System.Drawing.Drawing2D.SmoothingMode
InterpolationModeImageSaveOptions.InterpolationModeТе же члены и значения, что у System.Drawing.Drawing2D.InterpolationMode

Запуск в Docker

Aspose.TeX набирает документы собственными встроенными шрифтами TeX, а Aspose.TeX.Drawing содержит свою графическую подсистему. Контейнеру не нужны libgdiplus, fontconfig и установленные шрифты. Значение имеет только ICU — эта библиотека нужна для вывода в XPS и SVG (см. Инвариантный режим глобализации).

Официальные образы .NET на основе Debian и Ubuntu работают без дополнительной настройки:

1FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
2WORKDIR /src
3COPY . .
4RUN dotnet publish -c Release -o /app
5
6FROM mcr.microsoft.com/dotnet/runtime:8.0
7WORKDIR /app
8COPY --from=build /app .
9ENTRYPOINT ["dotnet", "MyApp.dll"]

Замените MyApp.dll именем своего приложения. Для приложений ASP.NET Core используйте mcr.microsoft.com/dotnet/aspnet вместо mcr.microsoft.com/dotnet/runtime; правила те же.

В таблице указано, что нужно для каждого вида образа:

Базовый образДополнительная настройка
runtime:8.0, aspnet:8.0 (Debian)Не нужна
runtime:8.0-noble, aspnet:8.0-noble (Ubuntu)Не нужна
runtime:8.0-alpine, aspnet:8.0-alpineУстановить ICU и отключить инвариантный режим (см. ниже)
runtime:8.0-noble-chiseled, aspnet:8.0-noble-chiseledИспользовать вариант -noble-chiseled-extra, в котором есть ICU
runtime:8.0-noble-chiseled-extra, aspnet:8.0-noble-chiseled-extraНе нужна

То же относится к образам .NET 9 и .NET 10. Поддерживаются образы linux/amd64 и linux/arm64.

Alpine

Образы Alpine запускают .NET в инвариантном режиме глобализации и не содержат ICU. Установите пакет icu-libs и отключите инвариантный режим:

 1FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 2WORKDIR /src
 3COPY . .
 4RUN dotnet publish -c Release -o /app
 5
 6FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine
 7RUN apk add --no-cache icu-libs
 8ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
 9WORKDIR /app
10COPY --from=build /app .
11ENTRYPOINT ["dotnet", "MyApp.dll"]

Chiseled-образы (distroless)

В chiseled-образах нет оболочки и менеджера пакетов, поэтому установить в них ICU нельзя. Используйте вариант -chiseled-extra, в котором ICU уже есть:

1FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
2WORKDIR /src
3COPY . .
4RUN dotnet publish -c Release -o /app
5
6FROM mcr.microsoft.com/dotnet/runtime:8.0-noble-chiseled-extra
7WORKDIR /app
8COPY --from=build /app .
9ENTRYPOINT ["dotnet", "MyApp.dll"]

Chiseled-образы запускают приложение от имени пользователя без прав root. Записывайте выходные файлы в доступное для записи место, например в подключённый том или /tmp, а не в папку приложения.

Инвариантный режим глобализации

Для вывода в XPS и SVG нужна ICU. Если .NET работает в инвариантном режиме глобализации, преобразование в XPS или SVG завершается исключением, например:

1System.Globalization.CultureNotFoundException: Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
2en-US is an invalid culture identifier.

Инвариантный режим включён по умолчанию в образах Alpine и chiseled, а также включается свойством проекта <InvariantGlobalization>true</InvariantGlobalization>. Вывод в PDF, PNG, JPEG, BMP и TIFF в инвариантном режиме работает. Если нужен вывод в XPS или SVG, установите ICU, как показано в разделе Запуск в Docker, и не включайте инвариантный режим в проекте.

Лицензирование

Aspose.TeX.Drawing использует ту же лицензию, что и Aspose.TeX, и применяется она так же (см. Лицензирование). Лицензия распространяется и на встроенную графическую подсистему Aspose.Drawing; отдельная лицензия Aspose.Drawing не нужна.

В ознакомительном режиме растровый вывод (PNG, JPEG, BMP, TIFF) пакета Aspose.TeX.Drawing содержит два водяных знака: водяной знак ознакомительной версии Aspose.TeX и водяной знак «Evaluation only Aspose.Drawing». Оба исчезают после применения лицензии Aspose.TeX.

Известные ограничения

Aspose.TeX.Drawing пока не умеет сохранять многостраничные файлы TIFF. Если установить TiffSaveOptions.Multipage в true, итоговый файл TIFF будет содержать только первую страницу документа, а исключение не возникнет. Чтобы получить все страницы, установите Multipage в false — тогда каждая страница сохранится в отдельное изображение TIFF — или преобразуйте документ в PDF или XPS.

Устранение неполадок

ОшибкаПричинаРешение
PlatformNotSupportedException: System.Drawing.Common is not supported on this platform.Приложение использует пакет Aspose.TeX в Linux или macOS.Используйте пакет Aspose.TeX.Drawing.
TypeLoadException: Could not load type 'Aspose.TeX.Drawing.…' from assembly 'Aspose.TeX'Проект ссылается и на Aspose.TeX, и на Aspose.TeX.Drawing.Удалите пакет Aspose.TeX.
CultureNotFoundException: … en-US is an invalid culture identifier. при сохранении в XPS или SVG.NET работает в инвариантном режиме глобализации.Установите ICU и отключите инвариантный режим, см. Инвариантный режим глобализации.
error CS0104: 'Color' is an ambiguous reference between 'System.Drawing.Color' and 'Aspose.TeX.Drawing.Color'Код импортирует и System.Drawing, и Aspose.TeX.Drawing.Импортируйте типы Aspose.TeX.Drawing с псевдонимами, см. Режимы сглаживания и интерполяции.
Многостраничный файл TIFF содержит только одну страницу.Известное ограничение Aspose.TeX.Drawing.См. Известные ограничения.

Контрольный список для развёртывания в Linux и контейнерах