مرور کلی

قالب‌های سند بسیاری به صورت جدی با قلم‌ها (فونت‌ها) وابسته هستند. به عنوان مثال، وقتی کاربر متنی را به سند DOCX اضافه می‌کند، این متن همیشه یک قلم تعریف‌شده دارد. برخی از قالب‌های سند معمولاً داده‌های قلم را به‌صورت توکار داخل فایل سند ذخیره می‌کنند، مانند PDF. اما سایرین، همانند قالب‌های خانواده Office، معمولاً به قلم‌های نصب شده در سیستم‌عامل وابسته‌اند.

قلم‌های متنوعی نیز وجود دارند. به عنوان مثال، اکثر قلم‌های نصب شده به صورت TTF (TrueType) و OTF (OpenType) عرضه می‌شوند. اسناد Office Open XML نیز با قالب EOT (Embedded OpenType) کار می‌کنند. در وب، however، WOFF و WOFF2 پرکاربردترین قالب‌ها هستند.

فهرست مطالب

دریافت تمام قلم‌های استفاده‌شده

کاربردی‌ترین ویژگی در زمینه قلم‌ها، فهرست‌بندی و بازگرداندن آن‌هاست. GroupDocs.Viewer متد ویژه‌ای به نام GetAllFonts() ارائه می‌دهد — هنگامی که سند به یک نمونه از کلاس Viewer بارگذاری شد، با فراخوانی این متد می‌توانید فهرست تمام قلم‌های استفاده‌شده در سند را دریافت کنید. در فهرست بازگردانده‌شده، هر قلم به‌عنوان یک شیء از نوعی که رابط IFontInfo را پیاده‌سازی می‌کند، ارائه می‌شود. این رابط ویژگی‌های مشترک برای هر قلم ممکن را شامل می‌شود: نام خانواده، سبک، قالب و محتوای باینری.

خانواده‌های خاصی از قالب‌ها، مانند WordProcessing، Spreadsheet، Presentation و PDF، پیاده‌سازی‌های تخصصی از IFontInfo دارند؛ این پیاده‌سازی‌ها داده‌های بیشتری که مختص به خانواده قالب خاص هستند فراهم می‌کنند. برای مثال، انواع WordProcessingFontInfo، PresentationFontInfo و PdfFontInfo دارای ویژگی بولی IsEmbedded هستند — پرچمی که نشان می‌دهد قلم در بدنه سند بارگذاری‌شده توکار است یا در سیستم‌عامل نصب شده. نوع SpreadsheetFontInfo شامل داده‌های ویژه‌ی قلم‌های صفحه‌گسترده می‌شود: رنگ، زیرخط‌دار بودن یا خط‌خورده بودن. WordProcessingFontInfo ممکن است نام خانواده‌ی جایگزین را نیز داشته باشد. و به همین ترتیب.

مثال کوتاه در ادامه آورده شده است:

using GroupDocs.Viewer;
// ...

const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;

using (Viewer viewer = new Viewer(inputPath))
{
    Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
    Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
    foreach (Fonts.IFontInfo font in allFonts)
    {
        Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
            font.FamilyName,
            font.Style,
            font.Content.Length,
            font.Format);
    }
}

لطفاً توجه داشته باشید که استخراج قلم فقط برای خانواده‌های قالب WordProcessing، Spreadsheet، Presentation و PDF پشتیبانی می‌شود؛ برای سایر قالب‌های سند، متد GetAllFonts() آرایه‌ی خالی برمی‌گرداند.

پردازش قلم‌های گمشده

وضعیتی که سندی روی کامپیوتر نویسنده ایجاد شده و از قلم «AAA» استفاده می‌کند، اما هنگام پردازش توسط GroupDocs.Viewer روی کامپیوتر مشتری قلم «AAA» نصب نشده باشد، رایج است. در چنین شرایطی GroupDocs.Viewer سعی می‌کند این قلم را جایگزین کند؛ این کار با استفاده از قوانین پیچیده‌ی جایگزینی قلم انجام می‌شود: متادیتای سند، نام‌های جایگزین قلم گمشده، تنظیمات سند، تنظیمات سیستم‌عامل، لیست تمام قلم‌های موجود در سیستم‌عامل و غیره بررسی می‌شوند. در نهایت، اگر به‌دلیل خاصی سیستم‌عامل «تمیز» باشد و هیچ قلمی نصب نشده باشد، GroupDocs.Viewer قلم گمشده را با قلمی که داخل اسمبلی (DLL) خود GroupDocs.Viewer توکار شده است، جایگزین می‌کند؛ این قلم به‌عنوان «آخرین راه‌حل» در صورت عدم دسترس بودن سایر قلم‌ها استفاده می‌شود. به عنوان مثال، برای خانواده قالب‌های WordProcessing، GroupDocs.Viewer قلم رایگان «Fanwood» را به‌صورت توکار ذخیره می‌کند.

در این لحظه، GroupDocs.Viewer عملیات جایگزینی قلم را به‌صورت «ساکت» در زمان رندر سند (زمانی که متد Viewer.View() فراخوانی می‌شود) انجام می‌دهد — هیچ پیغام یا رویدادی منتشر نمی‌شود که نشان دهد مکانیزم جایگزینی قلم فعال شده، کدام قلم گمشده بوده و با چه قلمی جایگزین شده و برای کدام سند دقیق. پیاده‌سازی چنین ویژگی‌ای دشوار است، زیرا اطلاع‌رسانی مناسب (قالب، زمان، محتوا) به وضوح تعریف نشده است.

با این‌حال، GroupDocs.Viewer دو راه‌حل برای حل این وضعیت برای کاربران فراهم می‌کند: به‌صورت دستی قلم گمشده را مشخص کنند و به‌صورت دستی قلم جایگزین کنند.

مشخص‌کردن قلم گمشده

اگر کاربر در ابتدا می‌داند که سندی از قلم «AAA» استفاده می‌کند، می‌داند که این قلم روی دستگاه هدف نصب نیست و محتوای باینری این قلم را در اختیار دارد، می‌تواند پیش از فراخوانی متد Viewer.View() آن را مشخص کند.

برای مشخص‌کردن یک یا چند قلم سفارشی که در سیستم‌عامل هدف نصب نیستند، کاربر باید منبع(های) قلم سفارشی اضافه کند. منبع قلم در واقع یک پوشه است که یک یا چند قلم در آن قرار دارد و توسط کلاس FolderFontSource نمایان می‌شود. کلاس FontSettings نیز متدی به نام SetFontSources() برای افزودن منابع قلم به GroupDocs.Viewer دارد.

کد زیر این روند را نشان می‌دهد. فرض کنید سند «sample.docx» از قلم نادر «AAA.ttf» استفاده می‌کند که در سیستم‌عامل هدف نصب نیست. کاربر فایل «AAA.ttf» را در پوشه‌ی "C:\custom_fonts" قرار می‌دهد و سپس یک نمونه از کلاس FolderFontSource که به این پوشه اشاره دارد، ایجاد می‌کند. این نمونه به کلاس استاتیک FontSettings پاس داده می‌شود و سپس فایل «sample.docx» به قالب HTML رندر می‌شود. در نتیجه، قلم «AAA» در سند خروجی HTML استفاده خواهد شد.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...

// مشخص‌کردن منبع قلم.
FolderFontSource fontSource = 
    new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);

using (Viewer viewer = new Viewer("sample.docx"))
{
    // ایجاد یک فایل HTML.
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
    viewer.View(viewOptions);
}

جایگزینی قلم گمشده

اگر کاربر می‌داند که سندی از قلم «AAA» استفاده می‌کند، می‌داند که این قلم روی دستگاه هدف نصب نیست، اما محتوای باینری این قلم را در اختیار ندارد، می‌تواند قلم دیگری به نام «BBB» را تعیین کند تا به‌جای قلم گمشده «AAA» استفاده شود. این گزینه باید از طریق تنظیمات نمای (view options) که سپس به متد Viewer.View() پاس داده می‌شود، مشخص شود.

این گزینه به نام DefaultFontName شناخته می‌شود؛ یک ویژگی از نوع رشته که در کلاس انتزاعی BaseViewOptions تعریف شده و برای تمام گزینه‌های رندر مشترک است: HtmlViewOptions، PdfViewOptions، PngViewOptions و JpgViewOptions.

زمانی که این گزینه مشخص شود، GroupDocs.Viewer در هنگام رندر از این قلم به‌جای هر قلم ناموجودی استفاده می‌کند. به عنوان مثال، اگر سند شامل قلم حاوی کاراکترهای غیرانگیلیسی باشد، نام قلم پیش‌فرض را تنظیم کنید تا مطمئن شوید GroupDocs.Viewer هر قلم گم‌شده‌ای را با قلمی که مجموعه کاراکترهای یکسانی دارد، جایگزین می‌کند. طبیعتاً، قلمی که نام آن در ویژگی DefaultFontName مشخص می‌شود، باید بر روی سیستم‌عاملی که GroupDocs.Viewer سند را رندر می‌کند، نصب شده باشد.

کد زیر نشان می‌دهد چگونه نام قلم پیش‌فرض را تنظیم کنید:

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.pptx"))
{
    // ایجاد گزینه‌های رندر سند HTML با منابع توکار
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
   
    // تعیین نام قلم پیش‌فرض در گزینه‌ها
    viewOptions.DefaultFontName = "Courier New";
    
    // رندر ورودی PPTX به خروجی HTML
    viewer.View(viewOptions);
}          

عدم گنجاندن قلم‌ها برای HTML

هنگام رندر اسناد به قالب HTML، GroupDocs.Viewer به‌طور پیش‌فرض تمام قلم‌های استفاده‌شده را به سند HTML صادر می‌کند. این کار نمایش صحیح را تضمین می‌کند، صرف‌نظر از این‌که قلم‌های مورد نیاز بر روی دستگاه نمایشگر موجود باشند یا نه. قلم‌ها می‌توانند به‌صورت منابع خارجی (با استفاده از HtmlViewOptions.ForExternalResources) یا به‌صورت توکار درون مارکاپ HTML با استفاده از data URI scheme و کدگذاری base64 (با HtmlViewOptions.ForEmbeddedResources) ذخیره شوند. صدور قلم به قالب HTML توسط تقریباً تمام قالب‌های سندی که خود از قلم پشتیبانی می‌کنند، پشتیبانی می‌شود: Microsoft Office (به‌جز Excel)، قالب‌های OpenDocument، ایمیل‌ها، PDF، eBooks و غیره.

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

برای رفع این نیاز، GroupDocs.Viewer امکان حذف قلم‌ها از سند HTML تولیدی را فراهم کرده است و این کار می‌تواند به دو شکل انجام شود: حذف همه قلم‌ها و حذف تنها قلم‌های مشخص.

هر دو گزینه به‌صورت ویژگی‌های متفاوت در کلاس HtmlViewOptions نمایان می‌شوند:

  • ExcludeFonts یک پرچم است که در صورت فعال (true) صادرات تمام قلم‌های استفاده‌شده به سند HTML تولیدی را غیر‌فعال می‌کند. به‌صورت پیش‌فرض این گزینه غیرفعال (false) است.
  • FontsToExclude یک لیست از رشته‌هاست که هر یک نمایانگر نام یک قلم است که باید از سند HTML حذف شود. به‌صورت پیش‌فرض این لیست خالی است — هیچ قلمی حذف نمی‌شود. لطفاً توجه داشته باشید که این گزینه تنها در صورت غیرفعال بودن ویژگی ExcludeFonts (false) مؤثر است.

دو قطعه کد زیر هر دو امکان را نشان می‌دهند: اولین مثال با استفاده از ExcludeFonts، مثال دوم با FontsToExclude.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.docx"))
{
    // ایجاد یک فایل HTML.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.ExcludeFonts = true;
    viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("presentation.pptx"))
{
    // ایجاد یک فایل HTML.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.FontsToExclude.Add("Times New Roman"); // حذف قلم Times New Roman
    viewOptions.FontsToExclude.Add("Arial");           // حذف قلم Arial
    viewer.View(viewOptions);
}

نتیجه‌گیری

GroupDocs.Viewer عمدتاً برای رندر اسناد با قالب‌های مختلف به قالب‌های «قابل‑مشاهده» گسترده‌ای مانند HTML، PDF، JPEG و PNG تمرکز دارد. اما در دوره‌ی اخیر چند ویژگی مفید در زمینه‌ی پردازش قلم‌ها اضافه شده است که امکان مرور و بررسی قلم‌های استفاده‌شده، تنظیم صادرات آن‌ها و تنظیم جایگزینی قلم‌ها را فراهم می‌کند.

همچنین ببینید

دریافت نسخه آزمایشی رایگان

شما می‌توانید نسخه‌ی آزمایشی رایگان GroupDocs.Viewer برای .NET را از releases.groupdocs.com دانلود کنید. همچنین می‌توانید از این‌جا یک لایسنس موقت دریافت کنید تا تمام ویژگی‌ها و عملکردها را بدون محدودیت امتحان کنید.