مدیریت قلم‌های قالب مخصوص اسکریپت در جاوا

نمای کلی

یک قالب ارائه می‌تواند خانواده‌های قلم متفاوتی را برای سیستم‌های نوشتاری مختلف انتخاب کند. این امکان را می‌دهد که متن چندزبانه که همچنان از قلم‌های قالب استفاده می‌کند، یک طرح قلم هماهنگ داشته باشد و همزمان برای سیریلیک، عربی، ژاپنی، گرجستانی، ثانا و سایر خط‌ها از قلم‌های مناسب استفاده شود.

قالب IFontScheme شامل یک مجموعه قلم اصلی (معمولاً برای عناوین) و یک مجموعه قلم فرعی (معمولاً برای متن اصلی) است. علاوه بر تنظیمات قلم‌های لاتین و آسیای شرقی، هر دو مجموعه با واسط IFonts نگاشت‌هایی از برچسب‌های سیستم نوشتاری به نام‌های خانواده قلم ارائه می‌دهند.

این مقاله نشان می‌دهد چگونه این نگاشت‌ها را در قالب اصلی ارائه بررسی و اصلاح کنیم و اطمینان حاصل کنیم که تغییرات پس از ذخیره‑سازی و بارگذاری مجدد حفظ می‌شوند.

درک برچسب‌های اسکریپت

روش‌های قلم اسکریپت از زیربرچسب‌های چهار حرفی BCP 47 برای شناسایی سیستم‌های نوشتاری استفاده می‌کنند. مقادیر رایج عبارتند از:

برچسب اسکریپت سیستم نوشتاری
Cyrl سیریلیک
Arab عربی
Hans چینی ساده
Jpan ژاپنی
Geor گرجستانی
Thaa ثانا

این نگاشت‌ها متعلق به طرح قلم قالب هستند، نه به بخش‌های متنی جداگانه. یک ارائه می‌تواند نگاشت‌های متفاوتی برای مجموعه‌های اصلی و فرعی داشته باشد و ممکن است برای برخی اسکریپت‌ها نگاتی نداشته باشد.

دسترسی و بررسی نگاشت‌های قلم اسکریپت

از Presentation.getMasterTheme برای دسترسی به قالب سطح ارائه استفاده کنید. متدهای IFontScheme.getMajor و IFontScheme.getMinor دو مجموعه IFonts را بازمی‌گردانند.

با فراخوانی IFonts.getScriptFontMap تمام نگاشت‌های یک مجموعه بازیابی می‌شوند. برای جستجوی یک سیستم نوشتاری خاص، IFonts.getScriptFont را با برچسب اسکریپت مربوطه صدا بزنید. getScriptFont زمانی که آن مجموعه نگاشت درخواست‌شده را تعریف نکرده باشد، null برمی‌گرداند.

تغییر نگاشت‌ها و تأیید پایداری

از IFonts.setScriptFont برای ایجاد یک نگاشت یا جایگزینی خانواده قلم فعلی استفاده کنید. برای حذف یک نگاشت، از IFonts.removeScriptFont بهره ببرید.

مثال کامل زیر تمام نگاشت‌های اصلی و فرعی موجود را می‌خواند، قلم اصلی ژاپنی را بررسی می‌کند، قلم اصلی سیریلیک را تغییر می‌دهد، نگاشت ثانا در مجموعه فرعی را حذف می‌کند، ارائه را ذخیره می‌نماید و سپس آن را باز می‌کند تا هر دو تغییر را تأیید کند. برای اینکه مرحله حذف مستقل از قالب اولیه باشد، مثال ابتدا تنها در صورت عدم وجود نگاشت ثانا، یک نگاشت جدید ایجاد می‌کند.

import com.aspose.slides.*;
import com.aspose.slides.Collections.Generic.Dictionary;
import com.aspose.slides.Collections.Generic.KeyValuePair;

Presentation presentation = new Presentation();
try {
    IFontScheme fontScheme = presentation.getMasterTheme().getFontScheme();
    IFonts majorFonts = fontScheme.getMajor();
    IFonts minorFonts = fontScheme.getMinor();

    System.out.println("Existing major mappings:");
    Dictionary.Enumerator<String, String> majorMappings = majorFonts.getScriptFontMap().iterator();
    while (majorMappings.hasNext()) {
        KeyValuePair<String, String> mapping = majorMappings.next();
        System.out.println("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    System.out.println("Existing minor mappings:");
    Dictionary.Enumerator<String, String> minorMappings = minorFonts.getScriptFontMap().iterator();
    while (minorMappings.hasNext()) {
        KeyValuePair<String, String> mapping = minorMappings.next();
        System.out.println("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    String japaneseFont = majorFonts.getScriptFont("Jpan");
    if (japaneseFont == null) {
        System.out.println("No major Japanese font is defined.");
    } else {
        System.out.println("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", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

    if ("Arial".equals(savedCyrillicFont)) {
        System.out.println("The Cyrillic mapping was preserved.");
    } else {
        System.out.println("The Cyrillic mapping was not preserved.");
    }

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

تأیید با همان رفتار null همانند یک جستجوی معمولی انجام می‌شود: پس از ذخیره‌سازی حذف، getScriptFont("Thaa") برای مجموعه فرعی null برمی‌گرداند.

تمایز نگاشت‌های قالب از سایر تنظیمات قلم

نگاشت‌های قالب مخصوص اسکریپت در انتخاب قلم مشارکت می‌کنند، اما مشکلی متفاوت نسبت به قالب‌بندی مستقیم متن، جایگزینی و fallback حل می‌کنند:

سازوکار هدف اثر تغییر یک نگاشت قالب
نگاشت قلم قالب مخصوص اسکریپت انتخاب یک قلم اصلی یا فرعی قالب برای یک سیستم نوشتاری متنی که همچنان از قلم قالب مربوطه استفاده می‌کند می‌تواند به خانواده قلم جدید مجاور شود
قلم اختصاصی به یک بخش متنی ثابت کردن خانواده قلم درخواست‌شده برای آن بخش به‌جای اتکا به قالب ممکن است بخش تغییری نکند چون قالب‌بندی مستقیم آن بر انتخاب قالب اولویت دارد
جایگزینی قلم جایگزینی قلم درخواست‌شده وقتی آن قلم موجود نیست یا قانون جایگزینی اعمال می‌شود پس از درخواست قلم اعمال می‌شود؛ نگاشت اسکریپت قالب را بازتعریف نمی‌کند
fallback قلم تامین گلیف‌هایی که قلم انتخاب‌شده شامل آن‌ها نیست، معمولاً برای بازه‌های خاص یونیکد پوشش گلیف‌های گمشده را فراهم می‌کند؛ نگاشت قالب ذخیره‌شده را تغییر نمی‌دهد

برای اطلاعات بیشتر درباره دو سازوکار آخر، به Font Substitution و Fallback Fonts مراجعه کنید.

تغییر یک نگاشت در Presentation.getMasterTheme فقط بر محتوایی که قالب مؤثر آن هنوز به آن قالب وابسته است اثر می‌گذارد. متن می‌تواند به جای آن، یک پوشش قالب از master، layout یا اسلاید دریافت کند یا قلم اختصاصی داشته باشد. هنگام مشاهده نتایج متفاوت، سطوح مختلف را بررسی کنید.

در دسترس قرار دادن قلم‌های نگاشت‌شده و اعتبارسنجی نتیجه

یک نگاشت اسکریپت فقط نام خانواده قلم را ذخیره می‌کند؛ قلم مربوطه را نصب یا بارگذاری نمی‌کند. برای رندر سازگار و خروجی، هر قلم نگاشت‌شده باید در محیط نصب شده باشد یا از طریق منبع سفارشی به Aspose.Slides ارائه شود، مانند FontsLoader.loadExternalFonts یا LoadOptions.getDocumentLevelFontSources. گزینه‌های بارگذاری موجود در Custom Fonts را ببینید.

تأیید نگاشت ذخیره‌شده تنها نشان می‌دهد که تعریف قالب حفظ شده است. این کار اثبات نمی‌کند که قلم در دسترس است، تمام گلیف‌های لازم را دارد یا چیدمان مورد انتظار را تولید می‌کند. برای هر سیستم نوشتاری مورد نیاز، متن نمایشی را به تصویر یا PDF رندر کنید و خروجی را بررسی کنید. این روش قلم‌های گمشده، پوشش ناقص گلیف، رفتار fallback و تغییرات چیدمان را پیش از توزیع ارائه کشف می‌کند. برای مثال‌های رندر و خروجی به Convert PowerPoint Presentations مراجعه کنید.

سوالات متداول

getScriptFont وقتی یک اسکریپت نگاشت نشده باشد، چه مقدار برمی‌گرداند؟

IFonts.getScriptFont وقتی نگاشت اسکریپت درخواست‌شده در مجموعه اصلی یا فرعی تعریف نشده باشد، null برمی‌گرداند.

آیا setScriptFont وقتی اسکریپت از قبل وجود داشته باشد، یک نگاشت دوم اضافه می‌کند؟

نه. IFonts.setScriptFont وقتی نگاشت موجود نیست، آن را ایجاد می‌کند و وقتی همان برچسب اسکریپت قبلاً وجود دارد، خانواده قلم نگاشت‌شده را جایگزین می‌نماید.

چرا تغییر یک نگاشت قالب برخی متن‌ها را تغییر نداد؟

ممکن است متن قلم اختصاصی داشته باشد، قالب متفاوتی از طریق یک override دریافت کند، یا در رندر تحت تأثیر جایگزینی یا fallback باشد. نگاشت اسکریپت در سطح ارائه فقط بر متنی که قالب مؤثر آن هنوز به مجموعه قلم قالب مراجعه می‌کند، تاثیر دارد.

آیا ذخیره و بازگشایی کافی است تا خروجی چندزبانه را اعتبارسنجی کنیم؟

نه. بازگشایی فقط پایداری داده‌های قالب را تأیید می‌کند. همچنین باید متن نمایشی هر سیستم نوشتاری مورد نیاز را رندر کنید تا مطمئن شوید قلم‌های نگاشت‌شده در دسترس هستند و گلیف‌های لازم را شامل می‌شوند.