จัดการแบบอักษรธีมที่เจาะจงสคริปต์ใน C++

ภาพรวม

ธีมการนำเสนอสามารถเลือกแบบอักษรที่ต่างกันสำหรับระบบการเขียนที่ต่างกันได้ สิ่งนี้ทำให้ข้อความหลายภาษา ซึ่งยังคงใช้แบบอักษรของธีม สามารถปฏิบัติตามโครงการแบบอักษรที่สอดคล้องเดียวกันในขณะที่ใช้แบบอักษรที่เหมาะสมสำหรับ Cyrillic, Arabic, Japanese, Georgian, Thaana และสคริปต์อื่น ๆ

ธีมของ IFontScheme มีคอลเลกชันแบบอักษรหลักซึ่งมักใช้สำหรับหัวเรื่อง และคอลเลกชันแบบอักษรรองซึ่งมักใช้สำหรับข้อความส่วนหลัก นอกจากคุณสมบัติแบบอักษรละตินและเอเชียตะวันออกแล้ว ทั้งสองคอลเลกชันยังเปิดเผยการแมปจากแท็กระบบการเขียนไปยังชื่อแบบอักษรผ่านส่วนติดต่อ IFonts

บทความนี้แสดงวิธีตรวจสอบและแก้ไขการแมปเหล่านั้นในธีมหลักของการนำเสนอและตรวจสอบว่าการเปลี่ยนแปลงยังคงอยู่หลังจากบันทึกและโหลดใหม่

ทำความเข้าใจแท็กสคริปต์

เมธอดแบบอักษรสคริปต์ใช้แท็กย่อยสคริปต์ BCP 47 ที่มีสี่ตัวอักษรเพื่อระบุตัวระบบการเขียน ค่าที่พบบ่อยได้แก่:

แท็กสคริปต์ ระบบการเขียน
Cyrl ซีริลลิก
Arab อารบิก
Hans จีนแบบประยุกต์
Jpan ญี่ปุ่น
Geor จอร์เจีย
Thaa ธานา

การแมปเหล่านี้เป็นของโครงการแบบอักษรธีม ไม่ใช่ของส่วนข้อความแยกต่างหาก การนำเสนออาจกำหนดการแมปที่แตกต่างกันสำหรับคอลเลกชันหลักและรอง และอาจละเว้นการแมปสำหรับสคริปต์บางอย่าง

เข้าถึงและตรวจสอบการแมปแบบอักษรสคริปต์

ใช้ Presentation::get_MasterTheme เพื่อเข้าถึงธีมระดับการนำเสนอ เมธอด FontScheme::get_Major และ FontScheme::get_Minor จะคืนคอลเลกชัน IFonts ทั้งสองชุด

เรียก Fonts::GetScriptFontMap เพื่อดึงการแมปทั้งหมดจากคอลเลกชันหนึ่ง เพื่อค้นหาระบบการเขียนหนึ่ง ให้เรียก Fonts::GetScriptFont พร้อมกับแท็กสคริปต์ของมัน GetScriptFont จะคืนสตริงว่าง (null) เมื่อคอลเลกชันนั้นไม่ได้กำหนดการแมปที่ร้องขอ

แก้ไขการแมปและตรวจสอบการคงอยู่

ใช้ Fonts::SetScriptFont เพื่อสร้างการแมปหรือแทนที่แบบอักษรที่ใช้อยู่ในปัจจุบัน ใช้ Fonts::RemoveScriptFont เพื่อลบการแมป

ตัวอย่างแบบครบวงจรต่อไปนี้อ่านการแมปหลักและรองที่มีอยู่ทั้งหมด ค้นหาแบบอักษรหลักของญี่ปุ่น เปลี่ยนแบบอักษรหลักของซีริลลิก ลบการแมปรองของธานา บันทึกการนำเสนอ แล้วเปิดใหม่เพื่อยืนยันการเปลี่ยนแปลงทั้งสองขั้นตอน เพื่อทำให้ขั้นตอนการลบเป็นอิสระจากธีมเริ่มต้น ตัวอย่างจะสร้างการแมปธานาเฉพาะเมื่อยังไม่มีการกำหนดไว้ก่อน

#include <DOM/IFonts.h>
#include <DOM/Presentation.h>
#include <DOM/Theme/IFontScheme.h>
#include <DOM/Theme/IMasterTheme.h>
#include <Export/SaveFormat.h>
#include <system/collections/idictionary.h>
#include <system/console.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto fontScheme = presentation->get_MasterTheme()->get_FontScheme();
auto majorFonts = fontScheme->get_Major();
auto minorFonts = fontScheme->get_Minor();

Console::WriteLine(u"Existing major mappings:");
for (auto&& mapping : majorFonts->GetScriptFontMap())
{
    Console::WriteLine(u"  {0}: {1}", mapping.get_Key(), mapping.get_Value());
}

Console::WriteLine(u"Existing minor mappings:");
for (auto&& mapping : minorFonts->GetScriptFontMap())
{
    Console::WriteLine(u"  {0}: {1}", mapping.get_Key(), mapping.get_Value());
}

auto japaneseFont = majorFonts->GetScriptFont(u"Jpan");
if (japaneseFont.IsNull())
{
    Console::WriteLine(u"No major Japanese font is defined.");
}
else
{
    Console::WriteLine(u"Major Japanese font: {0}", japaneseFont);
}

majorFonts->SetScriptFont(u"Cyrl", u"Arial");

if (minorFonts->GetScriptFont(u"Thaa").IsNull())
{
    minorFonts->SetScriptFont(u"Thaa", u"Arial");
}

minorFonts->RemoveScriptFont(u"Thaa");
presentation->Save(u"script-font-mappings.pptx", SaveFormat::Pptx);

auto savedPresentation = MakeObject<Presentation>(u"script-font-mappings.pptx");
auto savedFontScheme = savedPresentation->get_MasterTheme()->get_FontScheme();
auto savedMajorFonts = savedFontScheme->get_Major();
auto savedMinorFonts = savedFontScheme->get_Minor();
auto savedCyrillicFont = savedMajorFonts->GetScriptFont(u"Cyrl");
auto savedThaanaFont = savedMinorFonts->GetScriptFont(u"Thaa");

if (savedCyrillicFont == u"Arial")
{
    Console::WriteLine(u"The Cyrillic mapping was preserved.");
}
else
{
    Console::WriteLine(u"The Cyrillic mapping was not preserved.");
}

if (savedThaanaFont.IsNull())
{
    Console::WriteLine(u"The Thaana mapping removal was preserved.");
}
else
{
    Console::WriteLine(u"The Thaana mapping still exists.");
}

การตรวจสอบใช้พฤติกรรมสตริงว่าง (null-string) แบบเดียวกับการค้นหาทั่วไป: หลังจากการลบถูกบันทึก GetScriptFont(u"Thaa") จะคืนสตริงว่างสำหรับคอลเลกชันรอง

แยกแยะการแมปธีมจากการตั้งค่าแบบอักษรอื่น

การแมปธีมที่เจาะจงสคริปต์มีส่วนร่วมในกระบวนการเลือกแบบอักษร แต่พวกมันแก้ปัญหาแตกต่างจากการจัดรูปแบบข้อความโดยตรง การแทนที่แบบอักษร และการสำรองแบบอักษร:

กลไก จุดประสงค์ ผลของการเปลี่ยนการแมปธีม
การแมปแบบอักษรธีมที่เจาะจงสคริปต์ เลือกแบบอักษรธีมหลักหรือรองสำหรับระบบการเขียน ข้อความที่ยังคงใช้ธีมแบบอักษรที่สอดคล้องสามารถแก้ไขเป็นครอบครัวแบบอักษรที่แมปใหม่ได้
แบบอักษรที่กำหนดให้กับส่วนข้อความโดยตรง กำหนดครอบครัวแบบอักษรที่ร้องขอบนส่วนนั้นแทนการพึ่งพาธีม ส่วนนั้นอาจคงเดิมไม่ได้เปลี่ยนเพราะการจัดรูปแบบโดยตรงลบล้างการเลือกของธีม
การแทนที่แบบอักษร แทนที่แบบอักษรที่ร้องขอเมื่อแบบอักษรนั้นไม่มีหรือกฎการแทนที่ทำงาน มันทำงานหลังจากที่แบบอักษรถูกร้องขอ; ไม่ได้กำหนดการแมปสคริปต์ของธีมใหม่
การสำรองแบบอักษร จัดหา glyphs ที่แบบอักษรที่เลือกไม่มี โดยมักสำหรับช่วง Unicode เฉพาะ มันเติมส่วนที่ขาดของ glyph; ไม่ได้เปลี่ยนการแมปธีมที่เก็บไว้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสองกลไกสุดท้าย ดูที่ Font Substitution และ Fallback Fonts.

การเปลี่ยนการแมปใน Presentation::get_MasterTheme มีผลต่อเนื้อหาเท่านั้นที่การจัดรูปแบบที่มีผลยังขึ้นอยู่กับธีมนั้น ข้อความอาจสืบทอดการแทนที่ธีมจากมาสเตอร์, เลย์เอาต์, หรือสไลด์, หรือใช้แบบอักษรที่กำหนดโดยตรง ตรวจสอบระดับเหล่านั้นเมื่อผลลัพธ์ที่มองเห็นไม่สอดคล้องกับการแมประดับการนำเสนอ

ทำให้แบบอักษรที่แมปพร้อมใช้งานและตรวจสอบผลลัพธ์

การแมปสคริปต์เก็บชื่อแบบอักษร; มันไม่ได้ติดตั้งหรือโหลดไฟล์แบบอักษรที่สอดคล้องกัน เพื่อการเรนเดอร์และการส่งออกที่สอดคล้องทุกแบบอักษรที่แมปต้องถูกติดตั้งในสภาพแวดล้อมหรือจัดหามาให้ Aspose.Slides ผ่านแหล่งกำหนดเอง เช่น FontsLoader::LoadExternalFonts หรือ LoadOptions::set_DocumentLevelFontSources. ดูที่ Custom Fonts สำหรับตัวเลือกการโหลดที่มี

การยืนยันการแมปที่บันทึกไว้ยืนยันเพียงว่าการกำหนดธีมยังคงอยู่ ไม่ได้พิสูจน์ว่าแบบอักษรพร้อมใช้งาน, มี glyph ที่จำเป็นทั้งหมด, หรือสร้างการจัดวางตามที่ตั้งใจ ให้เรนเดอร์ข้อความตัวอย่างสำหรับทุกระบบการเขียนที่ต้องการเป็นภาพหรือ PDF แล้วตรวจสอบผลลัพธ์ สิ่งนี้ช่วยจับแบบอักษรที่หายไป, การครอบคลุม glyph ที่ไม่สมบูรณ์, พฤติกรรมการสำรอง, และการเปลี่ยนแปลงการจัดวางก่อนที่การนำเสนอจะถูกแจกจ่าย ดูที่ Convert PowerPoint Presentations สำหรับตัวอย่างการเรนเดอร์และส่งออก

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

GetScriptFont คืนค่าอะไรเมื่อสคริปต์ไม่ได้ถูกแมป?

Fonts::GetScriptFont คืนสตริงว่าง (null) เมื่อการแมปสคริปต์ที่ร้องขอไม่ได้กำหนดในคอลเลกชันแบบอักษรหลักหรือรองนั้น

SetScriptFont จะเพิ่มการแมปที่สองเมื่อสคริปต์มีอยู่แล้วหรือไม่?

ไม่. Fonts::SetScriptFont จะสร้างการแมปเมื่อไม่มีและแทนที่แบบอักษรที่แมปเมื่อแท็กสคริปต์เดียวกันมีอยู่แล้ว

ทำไมการเปลี่ยนการแมปธีมถึงไม่ทำให้ข้อความบางส่วนเปลี่ยนแปลง?

ข้อความอาจมีแบบอักษรที่กำหนดโดยตรง, สืบทอดธีมที่ต่างออกไปผ่านการแทนที่, หรือได้รับผลกระทบจากการแทนที่หรือการสำรองระหว่างการเรนเดอร์ การแมปสคริปต์ระดับการนำเสนอควบคุมเฉพาะข้อความที่การจัดรูปแบบที่มีผลยังอ้างอิงคอลเลกชันแบบอักษรของธีมนั้น

การบันทึกและเปิดใหม่เพียงพอที่จะตรวจสอบผลลัพธ์หลายภาษาไหม?

ไม่. การเปิดใหม่ตรวจสอบความคงอยู่ของข้อมูลธีม นอกจากนี้ให้เรนเดอร์ข้อความตัวอย่างจากแต่ละระบบการเขียนที่ต้องการเพื่อยืนยันว่าแบบอักษรที่แมปพร้อมใช้งานและมี glyph ที่จำเป็น