จัดการฟอนต์ธีมตามสคริปต์ใน JavaScript

ภาพรวม

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

FontScheme ของธีมประกอบด้วยคอลเลกชันฟอนต์หลัก (major) ที่มักใช้สำหรับหัวเรื่อง และคอลเลกชันฟอนต์รอง (minor) ที่มักใช้สำหรับข้อความหลัก นอกจากการตั้งค่าฟอนต์ละตินและฟอนต์เอเชียตะวันออก ทั้งสองคอลเลกชันยังเปิดเผยการแมปจากแท็กระบบการเขียนไปยังชื่อฟอนต์ตระกูลผ่านคลาส Fonts

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

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

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

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

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

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

ใช้เมธอด Presentation.getMasterTheme เพื่อเข้าถึงธีมระดับงานนำเสนอ เมธอด FontScheme.getMajor และ FontScheme.getMinor จะคืนคอลเลกชัน Fonts สองชุด

เรียกเมธอด Fonts.getScriptFontMap เพื่อดึงการแมปทั้งหมดจากคอลเลกชันหนึ่ง ๆ หากต้องการค้นหาระบบการเขียนหนึ่งระบบ ให้เรียก Fonts.getScriptFont พร้อมแท็กสคริปต์ของมัน getScriptFont จะคืนค่า null เมื่อคอลเลกชันนั้นไม่มีการแมปที่ร้องขอ

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

ใช้เมธอด Fonts.setScriptFont เพื่อสร้างการแมปหรือแทนที่ฟอนต์ตระกูลปัจจุบัน ใช้ Fonts.removeScriptFont เพื่อลบการแมป

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

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var presentation = new aspose.slides.Presentation();
try {
    var fontScheme = presentation.getMasterTheme().getFontScheme();
    var majorFonts = fontScheme.getMajor();
    var minorFonts = fontScheme.getMinor();

    console.log("Existing major mappings:");
    var majorMappings = majorFonts.getScriptFontMap().iterator();
    while (majorMappings.hasNext()) {
        var mapping = majorMappings.next();
        console.log("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    console.log("Existing minor mappings:");
    var minorMappings = minorFonts.getScriptFontMap().iterator();
    while (minorMappings.hasNext()) {
        var mapping = minorMappings.next();
        console.log("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    var japaneseFont = majorFonts.getScriptFont("Jpan");
    if (japaneseFont == null) {
        console.log("No major Japanese font is defined.");
    } else {
        console.log("Major Japanese font: " + japaneseFont);
    }

    majorFonts.setScriptFont("Cyrl", "Arial");

    if (minorFonts.getScriptFont("Thaa") == null) {
        minorFonts.setScriptFont("Thaa", "Arial");
    }

    minorFonts.removeScriptFont("Thaa");
    presentation.save("script-font-mappings.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

var savedPresentation = new aspose.slides.Presentation("script-font-mappings.pptx");
try {
    var savedMajorFonts = savedPresentation.getMasterTheme().getFontScheme().getMajor();
    var savedMinorFonts = savedPresentation.getMasterTheme().getFontScheme().getMinor();
    var savedCyrillicFont = savedMajorFonts.getScriptFont("Cyrl");
    var savedThaanaFont = savedMinorFonts.getScriptFont("Thaa");

    if (savedCyrillicFont === "Arial") {
        console.log("The Cyrillic mapping was preserved.");
    } else {
        console.log("The Cyrillic mapping was not preserved.");
    }

    if (savedThaanaFont == null) {
        console.log("The Thaana mapping removal was preserved.");
    } else {
        console.log("The Thaana mapping still exists.");
    }
} finally {
    savedPresentation.dispose();
}

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

แยกความแตกต่างระหว่างการแมปธีมกับการตั้งค่าอื่นของฟอนต์

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

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสองกลไกสุดท้าย ดูที่ การทดแทนฟอนต์ และ ฟอนต์สำรอง

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

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

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

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

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

getScriptFont คืนค่าอะไรเมื่อสคริปต์ไม่มีการแมป?
Fonts.getScriptFont คืนค่า null เมื่อการแมปสคริปต์ที่ร้องขอไม่ได้กำหนดในคอลเลกชันฟอนต์หลักหรือรองนั้น

setScriptFont เพิ่มการแมปที่สองเมื่อสคริปต์มีอยู่แล้วหรือไม่?
ไม่ใช่。Fonts.setScriptFont จะสร้างการแมปเมื่อไม่มีและจะแทนที่ฟอนต์ตระกูลที่แมปอยู่เมื่อแท็กสคริปต์นั้นมีอยู่แล้ว

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

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