Linux, macOS и Docker | Aspose.TeX для .NET
Выбор пакета
Aspose.TeX для .NET публикуется в виде двух пакетов NuGet с одинаковым API и одинаковым номером версии:
| Пакет | Графическая подсистема | Windows | Linux, macOS | Целевые платформы |
|---|---|---|---|---|
Aspose.TeX | System.Drawing.Common (GDI+) | Да | Нет | .NET Framework 4.0, .NET Standard 2.0, .NET 6.0, .NET 7.0 |
Aspose.TeX.Drawing | Aspose.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.Drawing1Install-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 |
|---|---|---|
Color | MathRendererOptions.TextColor, FigureRendererOptions.BackgroundColor | Неявное преобразование в System.Drawing.Color и обратно |
SizeF | Возвращаемое значение MathRenderer.Render и FigureRenderer.Render; Size в MathRendererPluginResult и FigureRendererPluginResult | Неявное преобразование в System.Drawing.SizeF и обратно |
SmoothingMode | ImageSaveOptions.SmoothingMode | Те же члены и значения, что у System.Drawing.Drawing2D.SmoothingMode |
InterpolationMode | ImageSaveOptions.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 и контейнерах
- Подключите
Aspose.TeX.DrawingвместоAspose.TeX, и только один из двух пакетов. - Если код импортирует и
System.Drawing, иAspose.TeX.Drawing, импортируйте типыAspose.TeX.Drawingс псевдонимами. - Если нужен вывод в XPS или SVG, убедитесь, что ICU доступна, а инвариантный режим отключён: установите
icu-libsв Alpine, используйте вариант-chiseled-extrachiseled-образов и не задавайтеInvariantGlobalizationв проекте. - Записывайте выходные файлы в доступное для записи место, особенно в chiseled-образах, которые запускают приложение без прав root.
- Применяйте лицензию один раз при запуске приложения, до первого преобразования.
- Если нужны все страницы в формате TIFF, установите
TiffSaveOptions.Multipageвfalseили используйте вывод в PDF или XPS.