Implementar fontes para Aspose.Slides no Linux e em Docker

Visão geral

Aspose.Slides desenha o texto com as fontes que estão disponíveis quando ele renderiza uma apresentação, por exemplo ao converter slides para PDF ou para imagens. Um desktop Windows geralmente tem as fontes que as apresentações utilizam. Servidores e contêineres Linux normalmente têm poucas fontes ou nenhuma, portanto o Aspose.Slides desenha o texto com uma fonte substituta. Uma substituta tem formas de letra e larguras diferentes, de modo que as linhas podem ser quebradas de forma distinta e o texto pode exceder sua forma, e caracteres que a substituta não possui não são desenhados corretamente. Se nenhuma fonte estiver instalada, a conversão é interrompida com erro.

Este artigo mostra como verificar quais fontes o Aspose.Slides substitui, como instalar fontes no Debian, Ubuntu e Alpine Linux, como adicionar seus próprios arquivos de fonte e como definir a fonte usada quando uma fonte está ausente. Os exemplos são executados em Docker nas imagens oficiais .NET, como em Execute Aspose.Slides para .NET em Docker. Os comandos de pacote são instruções Dockerfile; em um servidor Linux, execute os mesmos comandos como root.

Para a própria API de fontes, como incorporação de fontes em uma apresentação e regras de fallback e substituição, consulte Fontes do PowerPoint.

Verificar quais fontes são substituídas

O aplicativo de console a seguir relata as fontes que o Aspose.Slides substitui no ambiente atual. Crie uma pasta chamada FontCheck e adicione os arquivos abaixo a ela.

FontCheck.csproj referencia Aspose.Slides.NET6.CrossPlatform, o pacote para Debian e Ubuntu. Ele também copia os arquivos de uma pasta opcional fonts para a saída da aplicação; a seção Carregar fontes da pasta da aplicação a utiliza.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Aspose.Slides.NET6.CrossPlatform" Version="26.9.0" />
    <None Update="fonts/**" CopyToOutputDirectory="PreserveNewest" />
  </ItemGroup>

</Project>

Program.cs adiciona uma caixa de texto por nome de fonte a um slide e atribui a fonte através da propriedade LatinFont. Os nomes das fontes vêm da linha de comando; sem argumentos, a aplicação verifica Calibri, Arial e Times New Roman. Ela imprime as pastas nas quais o Aspose.Slides procura fontes (FontsLoader.GetFontFolders), renderiza o slide para output/fonts.pdf e exibe as substituições relatadas por IFontsManager.GetSubstitutions. As duas etapas opcionais no início, carregar uma pasta fonts e ler a variável DEFAULT_FONT, são explicadas mais adiante neste artigo.

using System;
using System.IO;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;

// As fontes a verificar: os argumentos de linha de comando ou três fontes comuns do Office.
var fontNames = args.Length > 0 ? args : new[] { "Calibri", "Arial", "Times New Roman" };

// Load the font files from the fonts folder next to the application, if there is one.
var appFontFolder = Path.Combine(AppContext.BaseDirectory, "fonts");
if (Directory.Exists(appFontFolder))
{
    FontsLoader.LoadExternalFonts(new[] { appFontFolder });
}

// Use the font named in the DEFAULT_FONT environment variable, if it is set, for text whose font is missing.
var loadOptions = new LoadOptions();
var defaultFont = Environment.GetEnvironmentVariable("DEFAULT_FONT");
if (!string.IsNullOrEmpty(defaultFont))
{
    loadOptions.DefaultRegularFont = defaultFont;
}

var fontFolders = FontsLoader.GetFontFolders().Distinct();
Console.WriteLine($"Font folders: {string.Join(", ", fontFolders)}");

using var presentation = new Presentation(loadOptions);
var slide = presentation.Slides[0];
for (var i = 0; i < fontNames.Length; i++)
{
    var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 50, 50 + i * 80, 600, 60);
    shape.TextFrame.Text = $"This text is set in {fontNames[i]}.";
    shape.TextFrame.Paragraphs[0].Portions[0].PortionFormat.LatinFont = new FontData(fontNames[i]);
}

Directory.CreateDirectory("output");
presentation.Save(Path.Combine("output", "fonts.pdf"), SaveFormat.Pdf);

var substitutions = presentation.FontsManager.GetSubstitutions().ToList();
if (substitutions.Count == 0)
{
    Console.WriteLine("No font substitutions.");
}
else
{
    Console.WriteLine("Font substitutions:");
    foreach (var substitution in substitutions)
    {
        Console.WriteLine($"  {substitution.OriginalFontName} -> {substitution.SubstitutedFontName}");
    }
}

.dockerignore mantém os resultados de build locais fora do contexto de build:

bin/
obj/
output/

Dockerfile compila a aplicação com a imagem SDK .NET e a executa na imagem runtime .NET. O estágio de runtime instala libfontconfig1, que o Aspose.Slides.NET6.CrossPlatform requer, e as fontes DejaVu. Execute Aspose.Slides para .NET em Docker explica cada instrução.

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY FontCheck.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish --no-restore -c Release -o /app

FROM mcr.microsoft.com/dotnet/runtime:10.0
RUN apt-get update \
    && apt-get install -y --no-install-recommends libfontconfig1 fonts-dejavu-core \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app .
RUN mkdir output && chown $APP_UID output
USER $APP_UID
ENTRYPOINT ["dotnet", "FontCheck.dll"]

Construa a imagem e execute a verificação:

docker build -t font-check .
docker run --rm font-check

A imagem contém apenas as fontes DejaVu, portanto as três fontes são substituídas por DejaVu Sans:

Font folders: /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
  Calibri -> DejaVu Sans
  Arial -> DejaVu Sans
  Times New Roman -> DejaVu Sans

Para verificar as fontes das suas próprias apresentações, passe seus nomes como argumentos, por exemplo docker run --rm font-check "Segoe UI" Consolas. Para copiar output/fonts.pdf fora do contêiner, use os comandos em Copie a saída para sua máquina.

Instalar fontes no Debian e Ubuntu

Microsoft Core Fonts

O pacote ttf-mscorefonts-installer baixa e instala as fontes principais da Microsoft para a web, entre elas Arial, Times New Roman, Courier New, Verdana, Georgia e Trebuchet MS. As fontes são licenciadas sob o contrato de licença de usuário final (EULA) da Microsoft, e o pacote as instala somente após a aceitação da EULA. Uma build Docker não pode responder ao prompt, então o instalador recusa a EULA e não instala fontes, embora apt-get install ainda indique sucesso. Aceite a EULA com debconf-set-selections antes de instalar o pacote.

No Dockerfile, substitua a instrução RUN que instala os pacotes no estágio de runtime por:

RUN echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections \
    && apt-get update \
    && apt-get install -y --no-install-recommends libfontconfig1 fonts-dejavu-core ttf-mscorefonts-installer \
    && rm -rf /var/lib/apt/lists/*

Construa a imagem e execute a verificação novamente com os mesmos dois comandos. Arial e Times New Roman agora estão instalados:

Font folders: /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
  Calibri -> Arial

Calibri, a fonte padrão de uma apresentação que o Aspose.Slides cria, não está entre as fontes principais, portanto ainda é substituída. Veja Definir uma fonte padrão para fontes ausentes.

No Debian, o pacote está no componente de repositório contrib, que as imagens Debian não habilitam; as imagens padrão .NET 8 e .NET 9 são baseadas no Debian 12. Habilite contrib na mesma instrução:

RUN sed -i 's/^Components: main$/Components: main contrib/' /etc/apt/sources.list.d/debian.sources \
    && echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections \
    && apt-get update \
    && apt-get install -y --no-install-recommends libfontconfig1 fonts-dejavu-core ttf-mscorefonts-installer \
    && rm -rf /var/lib/apt/lists/*

As imagens .NET 10 baseadas em Ubuntu já habilitam multiverse, o componente Ubuntu que contém o pacote.

Outros pacotes de fontes

Debian e Ubuntu também empacotam fontes com licenças livres, por exemplo:

Pacote Fontes
fonts-dejavu-core DejaVu Sans, DejaVu Serif, DejaVu Sans Mono
fonts-liberation Liberation Sans, Serif e Mono, com as mesmas métricas de Arial, Times New Roman e Courier New
fonts-crosextra-carlito Carlito, com as mesmas métricas de Calibri
fonts-crosextra-caladea Caladea, com as mesmas métricas de Cambria

Instale‑as com apt-get install na mesma instrução RUN. O Aspose.Slides.NET6.CrossPlatform não aplica os aliases de fontes da configuração de fontes Linux: com fonts-liberation instalado, o texto em Arial ainda é desenhado com a fonte substituta geral, não com Liberation Sans. Para usar uma fonte compatível em métricas no lugar de uma ausente, defina‑a como fonte padrão ou adicione uma regra de substituição de fontes.

Adicionar seus próprios arquivos de fonte

Fontes que as distribuições não empacotam, como as fontes da sua organização ou outras fontes licenciadas para uso no servidor, podem ser adicionadas como arquivos de fonte. Coloque os arquivos de fonte, por exemplo arquivos .ttf, em uma pasta chamada fonts dentro da pasta FontCheck. Os exemplos abaixo utilizam os arquivos de Carlito, uma fonte com as mesmas métricas de Calibri, que pode ser baixada em Google Fonts.

Instalar as fontes em uma pasta de fontes do sistema

O Aspose.Slides lê as fontes nas pastas impressas na linha Font folders. Para instalar suas fontes para todas as aplicações na imagem, copie‑as para /usr/local/share/fonts, a pasta de fontes instaladas localmente. Adicione esta instrução ao estágio de runtime do Dockerfile, após a instrução RUN que instala os pacotes:

COPY fonts/ /usr/local/share/fonts/

Carregar fontes da pasta da aplicação

Em vez de instalar as fontes na imagem, você pode distribuí‑las com a aplicação e carregá‑las com FontsLoader.LoadExternalFonts. As fontes ficam disponíveis apenas para o Aspose.Slides e são implantadas junto com a aplicação. FontCheck faz isso: FontCheck.csproj copia a pasta fonts para a saída da aplicação, e Program.cs passa essa pasta para LoadExternalFonts antes de criar a apresentação. Fonte personalizada descreve outras formas de fornecer fontes, como carregá‑las da memória.

Reconstrua a imagem e, em seguida, verifique Calibri e Carlito:

docker build -t font-check .
docker run --rm font-check Calibri Carlito

A pasta da aplicação agora aparece entre as pastas de fontes, e Carlito não é mais substituída:

Font folders: /app/fonts, /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
  Calibri -> Arial

Definir uma fonte padrão para fontes ausentes

Quando uma fonte está ausente, o Aspose.Slides usa uma substituta que ele escolhe automaticamente. Para escolher você mesmo, defina a propriedade DefaultRegularFont de LoadOptions e passe as opções ao construtor de Presentation. FontCheck lê o nome da fonte da variável de ambiente DEFAULT_FONT. Com Carlito carregada, use‑a para fontes ausentes:

docker run --rm -e DEFAULT_FONT=Carlito font-check

Calibri agora é desenhada com Carlito, cujos caracteres têm as mesmas larguras de Calibri, de modo que o texto mantém suas quebras de linha:

Font folders: /app/fonts, /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
  Calibri -> Carlito

A fonte padrão substitui toda fonte ausente. Para mapear fontes individuais, por exemplo Arial para Liberation Sans e Calibri para Carlito, use regras de substituição de fontes. As regras alteram a saída renderizada, mas GetSubstitutions não as reflete, portanto verifique as fontes no arquivo de saída. Para textos asiáticos, também defina DefaultAsianFont; veja Fonte padrão.

Instalar fontes no Alpine Linux

No Alpine Linux, use o pacote Aspose.Slides.NET; Execute no Alpine Linux lista as alterações necessárias no projeto. Faça as mesmas alterações em FontCheck: substitua a referência ao pacote, adicione a instrução SetSwitch ao Program.cs e use este estágio de runtime, que também instala as Microsoft Core Fonts:

FROM mcr.microsoft.com/dotnet/runtime:10.0-alpine
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
RUN apk add --no-cache icu-libs libgdiplus font-dejavu msttcorefonts-installer \
    && update-ms-fonts \
    && fc-cache -f
WORKDIR /app
COPY --from=build /app .
RUN mkdir output && chown $APP_UID output
USER $APP_UID
ENTRYPOINT ["dotnet", "FontCheck.dll"]

update-ms-fonts baixa e instala as mesmas Microsoft Core Fonts que o pacote Debian/Ubuntu, e sua EULA se aplica da mesma forma. fc-cache atualiza o cache de fontes.

Com Aspose.Slides.NET no Linux, a biblioteca de configuração de fontes (fontconfig) escolhe a substituta para uma fonte ausente, e GetSubstitutions não a relata, portanto FontCheck exibe No font substitutions. Para ver qual fonte é usada para um nome de fonte, consulte o fontconfig no contêiner:

docker run --rm --entrypoint fc-match font-check Arial

Com as Microsoft Core Fonts instaladas, Arial é usada para Arial:

Arial.ttf: "Arial" "Regular"

Sem elas, quando a instrução RUN instala apenas icu-libs libgdiplus font-dejavu, o mesmo comando exibe:

DejaVuSans.ttf: "DejaVu Sans" "Book"

FAQ

Por que uma apresentação aparece diferente quando é convertida em um servidor?

O servidor não possui as fontes usadas pela apresentação, de modo que o Aspose.Slides desenha o texto com uma fonte substituta cujas letras têm larguras diferentes. Execute FontCheck com os nomes de fonte da apresentação para ver quais fontes são substituídas, então instale essas fontes ou carregue‑as da pasta da aplicação.

A build instalou ttf‑mscorefonts‑installer, mas Arial ainda é substituída. Por quê?

A EULA não foi aceita antes da instalação do pacote, então o instalador pulou as fontes. Adicione o comando debconf-set-selections antes de apt-get install, conforme mostrado em Microsoft Core Fonts, e reconstrua a imagem.

O computador que abre o PDF precisa das fontes?

Não. Nestes exemplos, o PDF contém as fontes usadas para desenhar o texto, de modo que ele aparece igual em qualquer computador. As fontes são necessárias apenas onde o Aspose.Slides renderiza a apresentação.