Triển khai phông chữ cho Aspose.Slides trên Linux và trong Docker
Tổng quan
Aspose.Slides vẽ văn bản bằng các phông chữ có sẵn khi nó render bản thuyết trình, ví dụ khi chuyển đổi các trang slide sang PDF hoặc hình ảnh. Máy tính để bàn Windows thường có các phông chữ mà bản thuyết trình sử dụng. Các máy chủ và container Linux thường có ít phông chữ hoặc không có, vì vậy Aspose.Slides vẽ văn bản bằng một phông thay thế. Phông thay thế có hình dạng và độ rộng ký tự khác nhau, do đó các dòng có thể được ngắt khác nhau và văn bản có thể tràn ra khỏi hình dạng, và những ký tự mà phông thay thế thiếu sẽ không được vẽ đúng. Nếu không có phông nào được cài đặt, quá trình chuyển đổi sẽ dừng lại với lỗi.
Bài viết này chỉ ra cách kiểm tra các phông chữ mà Aspose.Slides thay thế, cách cài đặt phông chữ trên Debian, Ubuntu và Alpine Linux, cách thêm các tệp phông chữ của riêng bạn, và cách đặt phông chữ sẽ được sử dụng khi thiếu phông. Các ví dụ chạy trong Docker trên các hình ảnh .NET chính thức, giống như trong Run Aspose.Slides for .NET in Docker. Các lệnh gói là các chỉ thị Dockerfile; trên máy chủ Linux, chạy các lệnh tương tự với quyền root.
Đối với API phông chữ, chẳng hạn như nhúng phông chữ vào bản thuyết trình và các quy tắc dự phòng và thay thế, xem PowerPoint Fonts.
Kiểm tra các phông chữ bị thay thế
Ứng dụng console dưới đây báo cáo các phông chữ mà Aspose.Slides thay thế trong môi trường hiện tại. Tạo một thư mục có tên FontCheck và thêm các tệp dưới đây vào đó.
FontCheck.csproj tham chiếu tới Aspose.Slides.NET6.CrossPlatform, gói cho Debian và Ubuntu. Nó cũng sao chép các tệp của thư mục fonts tùy chọn vào đầu ra của ứng dụng; phần Load Fonts from the Application Folder sử dụng nó.
<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 thêm một hộp văn bản cho mỗi tên phông vào một slide và gán phông qua thuộc tính LatinFont. Các tên phông lấy từ dòng lệnh; nếu không có đối số, ứng dụng sẽ kiểm tra Calibri, Arial và Times New Roman. Nó in ra các thư mục mà Aspose.Slides tìm kiếm phông (FontsLoader.GetFontFolders), render slide thành output/fonts.pdf, và in ra các thay thế được báo cáo bởi IFontsManager.GetSubstitutions. Hai bước tùy chọn ở đầu, tải thư mục fonts và đọc biến môi trường DEFAULT_FONT, được giải thích ở phần sau của bài viết.
using System;
using System.IO;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;
// Các phông chữ cần kiểm tra: các đối số dòng lệnh, hoặc ba phông chữ Office phổ biến.
var fontNames = args.Length > 0 ? args : new[] { "Calibri", "Arial", "Times New Roman" };
// Tải các tệp phông chữ từ thư mục fonts bên cạnh ứng dụng, nếu có.
var appFontFolder = Path.Combine(AppContext.BaseDirectory, "fonts");
if (Directory.Exists(appFontFolder))
{
FontsLoader.LoadExternalFonts(new[] { appFontFolder });
}
// Sử dụng phông chữ được đặt trong biến môi trường DEFAULT_FONT, nếu được thiết lập, cho văn bản thiếu phông chữ.
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 giữ các kết quả build cục bộ ra ngoài ngữ cảnh build:
bin/
obj/
output/
Dockerfile xây dựng ứng dụng bằng hình ảnh .NET SDK và chạy nó trên hình ảnh .NET runtime. Giai đoạn runtime cài đặt libfontconfig1, mà Aspose.Slides.NET6.CrossPlatform yêu cầu, và các phông DejaVu. Run Aspose.Slides for .NET in Docker giải thích từng chỉ thị.
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"]
Xây dựng hình ảnh và chạy kiểm tra:
docker build -t font-check .
docker run --rm font-check
Hình ảnh chỉ có các phông DejaVu, vì vậy cả ba phông đều được thay thế bằng 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
Để kiểm tra các phông của bản thuyết trình riêng của bạn, truyền tên phông chúng làm đối số, ví dụ docker run --rm font-check "Segoe UI" Consolas. Để sao chép output/fonts.pdf ra khỏi container, sử dụng các lệnh trong Copy the Output to Your Machine.
Cài đặt phông chữ trên Debian và Ubuntu
Microsoft Core Fonts
Gói ttf-mscorefonts-installer tải xuống và cài đặt các phông chữ lõi của Microsoft cho web, bao gồm Arial, Times New Roman, Courier New, Verdana, Georgia và Trebuchet MS. Các phông chữ này được cấp phép theo thỏa thuận giấy phép người dùng cuối (EULA) của Microsoft, và gói chỉ cài đặt chúng sau khi EULA được chấp nhận. Một bản build Docker không thể trả lời lời nhắc, vì vậy trình cài đặt sẽ từ chối EULA và không cài đặt phông, trong khi apt-get install vẫn báo thành công. Chấp nhận EULA bằng debconf-set-selections trước khi gói được cài đặt.
Trong Dockerfile, thay thế chỉ thị RUN cài các gói trong giai đoạn runtime bằng:
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/*
Xây dựng lại hình ảnh và chạy lại kiểm tra với cùng hai lệnh. Arial và Times New Roman bây giờ đã được cài đặt:
Font folders: /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
Calibri -> Arial
Calibri, phông mặc định của một bản thuyết trình mà Aspose.Slides tạo, không phải là một trong các phông lõi, vì vậy nó vẫn bị thay thế. Xem Set a Default Font for Missing Fonts.
Trên Debian, gói nằm trong thành phần kho contrib, mà các hình ảnh Debian không bật; các hình ảnh .NET 8 và .NET 9 mặc định dựa trên Debian 12. Bật contrib trong cùng một chỉ thị:
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/*
Các hình ảnh .NET 10 dựa trên Ubuntu đã bật multiverse, thành phần Ubuntu chứa gói này.
Các gói phông chữ khác
Debian và Ubuntu cũng đóng gói các phông chữ có giấy phép tự do, ví dụ:
| Gói | Phông chữ |
|---|---|
fonts-dejavu-core |
DejaVu Sans, DejaVu Serif, DejaVu Sans Mono |
fonts-liberation |
Liberation Sans, Serif và Mono, với các chỉ số giống Arial, Times New Roman và Courier New |
fonts-crosextra-carlito |
Carlito, với các chỉ số giống Calibri |
fonts-crosextra-caladea |
Caladea, với các chỉ số giống Cambria |
Cài đặt chúng bằng apt-get install trong cùng một chỉ thị RUN. Aspose.Slides.NET6.CrossPlatform không áp dụng các bí danh phông của cấu hình phông Linux: khi fonts-liberation được cài, văn bản trong Arial vẫn được vẽ bằng phông thay thế chung, không phải Liberation Sans. Để sử dụng một phông tương thích chỉ số thay cho phông thiếu, đặt nó làm phông mặc định hoặc thêm một quy tắc thay thế phông.
Thêm các tệp phông chữ của riêng bạn
Các phông chữ mà các bản phân phối không đóng gói, chẳng hạn như phông của tổ chức bạn hoặc các phông khác mà bạn có giấy phép sử dụng trên máy chủ, có thể được thêm dưới dạng tệp phông. Đặt các tệp phông, ví dụ các tệp .ttf, trong một thư mục có tên fonts bên trong thư mục FontCheck. Các ví dụ dưới đây sử dụng các tệp của Carlito, một phông có cùng chỉ số với Calibri, bạn có thể tải xuống từ Google Fonts.
Cài đặt phông vào thư mục phông hệ thống
Aspose.Slides đọc các phông trong các thư mục được in trên dòng Font folders. Để cài phông của bạn cho mọi ứng dụng trong hình ảnh, sao chép chúng vào /usr/local/share/fonts, thư mục cho các phông được cài đặt cục bộ. Thêm chỉ thị này vào giai đoạn runtime của Dockerfile, sau chỉ thị RUN cài các gói:
COPY fonts/ /usr/local/share/fonts/
Tải phông từ thư mục ứng dụng
Thay vì cài phông trong hình ảnh, bạn có thể đóng gói chúng cùng với ứng dụng và tải chúng bằng FontsLoader.LoadExternalFonts. Khi đó các phông chỉ có sẵn cho Aspose.Slides và được triển khai cùng với ứng dụng. FontCheck làm như vậy: FontCheck.csproj sao chép thư mục fonts vào đầu ra của ứng dụng, và Program.cs truyền thư mục đó cho LoadExternalFonts trước khi tạo bản thuyết trình. Custom Font mô tả các cách khác để cung cấp phông, chẳng hạn như tải chúng từ bộ nhớ.
Xây dựng lại hình ảnh, sau đó kiểm tra Calibri và Carlito:
docker build -t font-check .
docker run --rm font-check Calibri Carlito
Thư mục ứng dụng bây giờ xuất hiện trong các thư mục phông, và Carlito không còn bị thay thế nữa:
Font folders: /app/fonts, /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
Calibri -> Arial
Đặt phông mặc định cho các phông chữ thiếu
Khi một phông chữ thiếu, Aspose.Slides sẽ sử dụng một phông thay thế do nó tự chọn. Để tự chọn, đặt thuộc tính DefaultRegularFont của LoadOptions và truyền các tùy chọn này vào hàm khởi tạo Presentation. FontCheck đọc tên phông từ biến môi trường DEFAULT_FONT. Với Carlito đã được tải, sử dụng nó cho các phông thiếu:
docker run --rm -e DEFAULT_FONT=Carlito font-check
Calibri giờ được vẽ bằng Carlito, các ký tự của nó có cùng độ rộng như Calibri, vì vậy văn bản giữ nguyên các ngắt dòng:
Font folders: /app/fonts, /usr/share/fonts, /usr/local/share/fonts, .local/share/fonts, /app/.fonts
Font substitutions:
Calibri -> Carlito
Phông mặc định thay thế mọi phông thiếu. Để ánh xạ các phông riêng lẻ, chẳng hạn Arial sang Liberation Sans và Calibri sang Carlito, sử dụng quy tắc thay thế phông. Các quy tắc thay đổi đầu ra được render, nhưng GetSubstitutions không phản ánh chúng, vì vậy hãy kiểm tra các phông trong tệp đầu ra thay vì. Đối với văn bản Châu Á, cũng đặt DefaultAsianFont; xem Default Font.
Cài đặt phông trên Alpine Linux
Trên Alpine Linux, sử dụng gói Aspose.Slides.NET; Run on Alpine Linux liệt kê các thay đổi cho dự án. Thực hiện các thay đổi tương tự cho FontCheck: thay thế tham chiếu gói, thêm câu lệnh SetSwitch vào Program.cs, và sử dụng giai đoạn runtime này, cũng cài đặt các phông Microsoft core:
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 tải xuống và cài đặt các phông Microsoft core giống như gói Debian và Ubuntu, và EULA của chúng áp dụng theo cùng cách. fc-cache cập nhật bộ nhớ cache phông.
Với Aspose.Slides.NET trên Linux, thư viện cấu hình phông (fontconfig) chọn phông thay thế cho phông thiếu, và GetSubstitutions không báo cáo nó, vì vậy FontCheck in ra No font substitutions. Để biết phông nào được dùng cho một tên phông, hỏi fontconfig trong container:
docker run --rm --entrypoint fc-match font-check Arial
Với các phông Microsoft core đã được cài, Arial được dùng cho Arial:
Arial.ttf: "Arial" "Regular"
Nếu không có chúng, khi chỉ thị RUN chỉ cài icu-libs libgdiplus font-dejavu, cùng một lệnh sẽ in:
DejaVuSans.ttf: "DejaVu Sans" "Book"
Câu hỏi thường gặp
Tại sao bản thuyết trình trông khác khi được chuyển đổi trên máy chủ?
Máy chủ không có các phông chữ mà bản thuyết trình sử dụng, vì vậy Aspose.Slides vẽ văn bản bằng một phông thay thế có độ rộng ký tự khác. Chạy FontCheck với các tên phông của bản thuyết trình để xem phông nào bị thay thế, sau đó cài đặt các phông đó hoặc tải chúng từ thư mục ứng dụng.
Bản build đã cài đặt ttf-mscorefonts-installer, nhưng Arial vẫn bị thay thế. Tại sao?
EULA chưa được chấp nhận trước khi gói được cài, vì vậy trình cài bỏ qua các phông. Thêm lệnh debconf-set-selections trước apt-get install, như shown trong Microsoft Core Fonts, và xây dựng lại hình ảnh.
Máy tính mở PDF có cần các phông chữ không?
Không. Trong các ví dụ này, PDF chứa các phông đã được dùng để vẽ văn bản, vì vậy nó trông giống nhau trên bất kỳ máy tính nào. Các phông chỉ cần có ở nơi Aspose.Slides render bản thuyết trình.