ปรับใช้แบบอักษรสำหรับ Aspose.Slides บน Linux และใน Docker

ภาพรวม

Aspose.Slides วาดข้อความด้วยแบบอักษรที่มีให้เมื่อมันแสดงสไลด์, ตัวอย่างเช่นเมื่อแปลงสไลด์เป็น PDF หรือเป็นรูปภาพ. เครื่อง Windows ปกติจะมีแบบอักษรที่สไลด์ใช้. เซิร์ฟเวอร์และคอนเทนเนอร์ Linux มักมีแบบอักษรน้อยหรือไม่มี, ดังนั้น Aspose.Slides จะวาดข้อความด้วยแบบอักษรทดแทน. แบบอักษรทดแทนมีรูปแบบอักษรและความกว้างที่ต่างกัน, ทำให้บรรทัดอาจหักบรรทัดต่างกันและข้อความอาจล้นรูปทรง, และอักขระที่แบบอักษรทดแทนไม่มีจะไม่ถูกวาดอย่างถูกต้อง. หากไม่มีแบบอักษรติดตั้งเลย, การแปลงจะหยุดด้วยข้อผิดพลาด.

บทความนี้แสดงวิธีตรวจสอบว่า Aspose.Slides แทนที่แบบอักษรใด, วิธีติดตั้งแบบอักษรบน Debian, Ubuntu, และ Alpine Linux, วิธีเพิ่มไฟล์แบบอักษรของคุณเอง, และวิธีกำหนดแบบอักษรที่ใช้เมื่อไม่มีแบบอักษร. ตัวอย่างทำงานใน Docker บนภาพ .NET อย่างเป็นทางการ, เช่นใน Run Aspose.Slides for .NET in Docker. คำสั่งแพ็กเกจเป็นคำสั่งของ Dockerfile; บนเซิร์ฟเวอร์ Linux ให้เรียกใช้คำสั่งเดียวกันด้วยสิทธิ root.

สำหรับ API ของแบบอักษรเอง, เช่นการฝังแบบอักษรในงานนำเสนอและกฎการสำรองและการแทนที่, ดูที่ PowerPoint Fonts.

ตรวจสอบว่าแบบอักษรใดถูกแทนที่

แอปพลิเคชันคอนโซลต่อไปนี้รายงานแบบอักษรที่ Aspose.Slides แทนที่ในสภาพแวดล้อมปัจจุบัน. สร้างโฟลเดอร์ชื่อ FontCheck และเพิ่มไฟล์ด้านล่างลงไปในโฟลเดอร์นั้น.

FontCheck.csproj อ้างอิง Aspose.Slides.NET6.CrossPlatform, แพ็กเกจสำหรับ Debian และ Ubuntu. มันยังคัดลอกไฟล์ของโฟลเดอร์ fonts ตัวเลือกไปยังเอาต์พุตของแอปพลิเคชัน; ส่วน Load Fonts from the Application Folder ใช้งานมัน.

<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 เพิ่มกล่องข้อความหนึ่งกล่องต่อชื่อแบบอักษรลงในสไลด์และกำหนดแบบอักษรผ่านคุณสมบัติ LatinFont. ชื่อแบบอักษรมาจากบรรทัดคำสั่ง; หากไม่มีอาร์กิวเมนต์, แอปพลิเคชันจะตรวจสอบ Calibri, Arial, และ Times New Roman. มันพิมพ์โฟลเดอร์ที่ Aspose.Slides มองหาแบบอักษร (FontsLoader.GetFontFolders), แสดงสไลด์เป็น output/fonts.pdf, และพิมพ์การแทนที่ที่รายงานโดย IFontsManager.GetSubstitutions. ขั้นตอนสองขั้นตอนที่เป็นตัวเลือกในตอนต้น, การโหลดโฟลเดอร์ fonts และการอ่านตัวแปร DEFAULT_FONT, จะอธิบายต่อในบทความนี้.

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

// แบบอักษรที่จะตรวจสอบ: อาร์กูเมนต์จากบรรทัดคำสั่ง หรือแบบอักษร Office ที่พบบ่อยสามแบบ.
var fontNames = args.Length > 0 ? args : new[] { "Calibri", "Arial", "Times New Roman" };

// โหลดไฟล์แบบอักษรจากโฟลเดอร์ fonts ที่อยู่ใกล้แอปพลิเคชัน หากมี.
var appFontFolder = Path.Combine(AppContext.BaseDirectory, "fonts");
if (Directory.Exists(appFontFolder))
{
    FontsLoader.LoadExternalFonts(new[] { appFontFolder });
}

// ใช้แบบอักษรที่ระบุในตัวแปรสภาพแวดล้อม DEFAULT_FONT หากตั้งค่าไว้ สำหรับข้อความที่ขาดแบบอักษร.
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 เก็บผลการสร้างในเครื่องออกจากบริบทการสร้าง:

bin/
obj/
output/

Dockerfile สร้างแอปพลิเคชันด้วยภาพ .NET SDK และรันบนภาพ .NET runtime. ขั้นตอน runtime ติดตั้ง libfontconfig1 ซึ่ง Aspose.Slides.NET6.CrossPlatform ต้องการ, และแบบอักษร DejaVu. Run Aspose.Slides for .NET in Docker อธิบายแต่ละคำสั่ง.

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"]

สร้างภาพและรันการตรวจสอบ:

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

ภาพมีแบบอักษร DejaVu เท่านั้น, ดังนั้นแบบอักษรทั้งสามจะแทนที่ด้วย 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

เพื่อตรวจสอบแบบอักษรของงานนำเสนอของคุณเอง, ให้ส่งชื่อของมันเป็นอาร์กิวเมนต์, ตัวอย่างเช่น docker run --rm font-check "Segoe UI" Consolas. เพื่อคัดลอก output/fonts.pdf ออกจากคอนเทนเนอร์, ใช้คำสั่งใน Copy the Output to Your Machine.

ติดตั้งแบบอักษรบน Debian และ Ubuntu

แบบอักษรหลักของ Microsoft

แพ็กเกจ ttf-mscorefonts-installer ดาวน์โหลดและติดตั้งแบบอักษรหลักของ Microsoft สำหรับเว็บ, ซึ่งรวมถึง Arial, Times New Roman, Courier New, Verdana, Georgia, และ Trebuchet MS. แบบอักษรเหล่านี้มีลิขสิทธิ์ภายใต้ข้อตกลงผู้ใช้สิ้นสุด (EULA) ของ Microsoft, และแพ็กเกจจะติดตั้งหลังจากยอมรับ EULA เท่านั้น. การสร้าง Docker ไม่สามารถตอบคำถามได้, ดังนั้นตัวติดตั้งจะปฏิเสธ EULA และไม่ได้ติดตั้งแบบอักษรใด ๆ, แม้ว่า apt-get install จะรายงานว่าประสบความสำเร็จ. ยอมรับ EULA ด้วย debconf-set-selections ก่อน ที่แพ็กเกจจะถูกติดตั้ง.

ใน Dockerfile, แทนที่คำสั่ง RUN ที่ติดตั้งแพ็กเกจในขั้นตอน runtime ด้วย:

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/*

สร้างภาพและรันการตรวจสอบอีกครั้งด้วยสองคำสั่งเดียวกัน. ตอนนี้ Arial และ Times New Roman ถูกติดตั้งแล้ว:

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

Calibri, แบบอักษรเริ่มต้นของงานนำเสนอที่ Aspose.Slides สร้าง, ไม่ได้เป็นหนึ่งในแบบอักษรหลัก, ดังนั้นยังคงถูกแทนที่. ดูที่ Set a Default Font for Missing Fonts.

บน Debian, แพ็กเกจอยู่ในส่วน contrib ของรีโพซิทอรี, ซึ่งภาพ Debian ไม่ได้เปิดใช้; ภาพ .NET 8 และ .NET 9 เริ่มต้นอิงตาม Debian 12. เปิดใช้งาน contrib ในคำสั่งเดียวกัน:

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/*

ภาพ .NET 10 ที่อิง Ubuntu มีการเปิดใช้งาน multiverse อยู่แล้ว, ซึ่งเป็นส่วนของ Ubuntu ที่มีแพ็กเกจนี้.

แพ็กเกจแบบอักษรอื่น ๆ

Debian และ Ubuntu ยังจัดแพ็กเกจแบบอักษรที่มีลิขสิทธิ์เสรี, ตัวอย่างเช่น:

แพ็กเกจ แบบอักษร
fonts-dejavu-core DejaVu Sans, DejaVu Serif, DejaVu Sans Mono
fonts-liberation Liberation Sans, Serif, and Mono, with the same metrics as Arial, Times New Roman, and Courier New
fonts-crosextra-carlito Carlito, with the same metrics as Calibri
fonts-crosextra-caladea Caladea, with the same metrics as Cambria

ติดตั้งพวกมันด้วย apt-get install ในคำสั่ง RUN เดียวกัน. Aspose.Slides.NET6.CrossPlatform จะไม่ใช้นามแฝงแบบอักษรของการกำหนดค่าฟอนต์ Linux: แม้จะติดตั้ง fonts-liberation แล้ว, ข้อความใน Arial ยังถูกวาดด้วยแบบอักษรทดแทนทั่วไป, ไม่ได้ใช้ Liberation Sans. เพื่อใช้แบบอักษรที่มีเมตริกเข้ากับแบบอักษรที่ขาด, ตั้งเป็น default font หรือเพิ่ม font substitution rule.

เพิ่มไฟล์แบบอักษรของคุณเอง

แบบอักษรที่การแจกจ่ายไม่ได้จัดแพ็กเกจ, เช่นแบบอักษรขององค์กรของคุณหรือแบบอักษรอื่นที่คุณมีสิทธิ์ใช้บนเซิร์ฟเวอร์, สามารถเพิ่มเป็นไฟล์แบบอักษรได้. วางไฟล์แบบอักษร, ตัวอย่างเช่นไฟล์ .ttf, ใส่ในโฟลเดอร์ชื่อ fonts ภายในโฟลเดอร์ FontCheck. ตัวอย่างด้านล่างใช้ไฟล์ของ Carlito, แบบอักษรที่มีเมตริกเดียวกับ Calibri, ซึ่งคุณสามารถดาวน์โหลดจาก Google Fonts.

ติดตั้งแบบอักษรในโฟลเดอร์แบบอักษรของระบบ

Aspose.Slides อ่านแบบอักษรจากโฟลเดอร์ที่พิมพ์บนบรรทัด Font folders. เพื่อทำการติดตั้งแบบอักษรของคุณสำหรับทุกแอปพลิเคชันในภาพ, คัดลอกพวกมันไปที่ /usr/local/share/fonts, โฟลเดอร์สำหรับแบบอักษรที่ติดตั้งในเครื่อง. เพิ่มคำสั่งนี้ในขั้นตอน runtime ของ Dockerfile, หลังจากคำสั่ง RUN ที่ติดตั้งแพ็กเกจ:

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

โหลดแบบอักษรจากโฟลเดอร์แอปพลิเคชัน

แทนที่จะติดตั้งแบบอักษรในภาพ, คุณสามารถจัดส่งพวกมันพร้อมกับแอปพลิเคชันและโหลดด้วย FontsLoader.LoadExternalFonts. แบบอักษรจะมีให้กับ Aspose.Slides เท่านั้น, และจะถูกปรับใช้พร้อมกับแอปพลิเคชัน. FontCheck ทำเช่นนี้: FontCheck.csproj คัดลอกโฟลเดอร์ fonts ไปยังเอาต์พุตของแอปพลิเคชัน, และ Program.cs ส่งโฟลเดอร์นั้นไปยัง LoadExternalFonts ก่อนสร้างงานนำเสนอ. Custom Font อธิบายวิธีอื่น ๆ ในการจัดหาแบบอักษร, เช่นการโหลดจากหน่วยความจำ.

สร้างภาพใหม่, จากนั้นตรวจสอบ Calibri และ Carlito:

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

โฟลเดอร์แอปพลิเคชันตอนนี้ปรากฏในรายการโฟลเดอร์แบบอักษร, และ Carlito จะไม่ถูกแทนที่อีกต่อไป:

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

ตั้งค่าแบบอักษรเริ่มต้นสำหรับแบบอักษรที่หายไป

เมื่อไม่มีแบบอักษร, Aspose.Slides จะใช้แบบอักษรทดแทนที่มันเลือกเอง. เพื่อเลือกเอง, ตั้งค่าคุณสมบัติ DefaultRegularFont ของ LoadOptions และส่งตัวเลือกเหล่านั้นไปยังคอนสตรัคเตอร์ของ Presentation. FontCheck อ่านชื่อแบบอักษรจากตัวแปรสภาพแวดล้อม DEFAULT_FONT. เมื่อโหลด Carlito, ใช้มันสำหรับแบบอักษรที่หายไป:

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

ตอนนี้ Calibri จะถูกวาดด้วย Carlito, ซึ่งอักขระมีความกว้างเท่ากับของ Calibri, ทำให้ข้อความยังคงรักษาการตัดบรรทัดไว้:

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

แบบอักษรเริ่มต้นจะแทนที่ทุกแบบอักษรที่หายไป. เพื่อแมปแบบอักษรแต่ละตัว, ตัวอย่างเช่น Arial ไปที่ Liberation Sans และ Calibri ไปที่ Carlito, ใช้ font substitution rules. กฎจะเปลี่ยนผลลัพธ์ที่แสดง, แต่ GetSubstitutions จะไม่สะท้อนพวกมัน, ดังนั้นให้ตรวจสอบแบบอักษรในไฟล์เอาต์พุตแทน. สำหรับข้อความภาษาเอเชีย, ควรตั้งค่า DefaultAsianFont; ดูที่ Default Font.

ติดตั้งแบบอักษรบน Alpine Linux

บน Alpine Linux, ใช้แพ็กเกจ Aspose.Slides.NET; Run on Alpine Linux ระบุการเปลี่ยนแปลงในโปรเจกต์. ทำการเปลี่ยนแปลงเดียวกันกับ FontCheck: แทนที่การอ้างอิงแพ็กเกจ, เพิ่มคำสั่ง SetSwitch ไปยัง Program.cs, และใช้ขั้นตอน runtime นี้, ซึ่งยังติดตั้งแบบอักษรหลักของ Microsoft:

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 ดาวน์โหลดและติดตั้งแบบอักษรหลักของ Microsoft เหมือนแพ็กเกจ Debian และ Ubuntu, และ EULA ของมันจะใช้งานในลักษณะเดียวกัน. fc-cache อัปเดตแคชแบบอักษร.

เมื่อใช้ Aspose.Slides.NET บน Linux, ไลบรารีการกำหนดค่าแบบอักษร (fontconfig) จะเลือกแบบอักษรทดแทนสำหรับแบบอักษรที่หายไป, และ GetSubstitutions จะไม่รายงาน, ดังนั้น FontCheck พิมพ์ No font substitutions. เพื่อดูว่าแบบอักษรใดถูกใช้กับชื่อแบบอักษร, ให้สอบถาม fontconfig ในคอนเทนเนอร์:

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

เมื่อมีการติดตั้งแบบอักษรหลักของ Microsoft, Arial จะถูกใช้สำหรับ Arial:

Arial.ttf: "Arial" "Regular"

หากไม่มี, เมื่อคำสั่ง RUN ติดตั้งเฉพาะ icu-libs libgdiplus font-dejavu, คำสั่งเดียวกันจะพิมพ์:

DejaVuSans.ttf: "DejaVu Sans" "Book"

คำถามที่พบบ่อย

ทำไมงานนำเสนอถึงดูแตกต่างเมื่อแปลงบนเซิร์ฟเวอร์?

เซิร์ฟเวอร์ไม่มีแบบอักษรที่งานนำใช้, ดังนั้น Aspose.Slides จะวาดข้อความด้วยแบบอักษรทดแทนที่อักษรมีความกว้างต่างกัน. ให้รัน FontCheck พร้อมชื่อแบบอักษรของงานนำเสนอเพื่อดูว่าแบบอักษรใดถูกแทนที่, จากนั้นติดตั้งแบบอักษรเหล่านั้นหรือโหลดจากโฟลเดอร์แอปพลิเคชัน.

การสร้างได้ติดตั้ง ttf-mscorefonts-installer แล้ว, แต่ Arial ยังคงถูกแทนที่. ทำไม?

EULA ไม่ได้ถูกยอมรับก่อนที่แพ็กเกจจะถูกติดตั้ง, ทำให้ตัวติดตั้งข้ามแบบอักษร. ให้เพิ่มคำสั่ง debconf-set-selections ก่อน apt-get install, ตามที่แสดงใน Microsoft Core Fonts, และสร้างภาพใหม่.

คอมพิวเตอร์ที่เปิด PDF ต้องการแบบอักษรหรือไม่?

ไม่. ในตัวอย่างเหล่านี้, PDF จะบรรจุแบบอักษรที่ใช้ในการวาดข้อความ, ดังนั้นจะแสดงผลเดียวกันบนคอมพิวเตอร์ใดก็ได้. แบบอักษรจำเป็นต้องมีเฉพาะที่ที่ Aspose.Slides ทำการเรนเดอร์งานนำเสนอ.