عنوان:

‫روش صحیح تعریف قلم در iTextSharp


نویسنده: وحید نصیری
تاریخ: ۱۳۹۰/۰۵/۳۱ ۱۱:۵۱:۰۰
آدرس: www.dntips.ir

روش متداول تعریف فونت در iTextSharp به صورت زیر است:

public static iTextSharp.text.Font Tahoma()

{
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf";
var baseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
return new Font(baseFont);
}

از آنجائیکه خصوصا برای متون فارسی نیاز است تا به ازای هر المان کوچکی این فونت تنظیم شود و‌ در غیر اینصورت متنی نمایش داده نخواهد شد، با سربار بالایی مواجه خواهیم شد. بنابراین به نظر می‌رسد که بهتر باشد این تولید اشیاء فونت را کش کنیم. خوشبختانه iTextSharp سیستم کش کردن تعریف قلم‌های متفاوت را هم به صورت توکار دارا است:

public static iTextSharp.text.Font GetTahoma()

{
var fontName = "Tahoma";
if (!FontFactory.IsRegistered(fontName))
{
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf";
FontFactory.Register(fontPath);
}
return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}

کلاس FontFactory کار ثبت و بازیابی قلم‌های متفاوت را به عهده دارد. تنها کافی است یکبار قلمی در آن ثبت شود (FontFactory.Register)، بار دیگر اطلاعات قلم به سادگی از کش FontFactory خوانده خواهد شد (FontFactory.GetFont).

نظرات

  • سید امید موسوی در ۱۳۹۹/۰۱/۲۶ ۱۵:۵۸
    با سلام
    برای یک سری از فونت‌ها برای مثال IRANSans بعد از Register کردن مقدار برگشتی null هست. در حالت  BaseFont . EMBEDDED و همچنین   BaseFont.NOT_EMBEDDED هم چک کردم. آیا به لایسنس فونت مربوط است ؟
       public iTextSharp.text.Font GetIRANSans()
            {
                var fontName = "IRANSans(FaNum)_Medium";
                if (!FontFactory.IsRegistered(fontName))
                {
                    var fontPath = Path.Combine(_hostingEnvironment.WebRootPath + @"\FontPdf\IRANSans(FaNum)_Medium.ttf");
                    FontFactory.Register(fontPath);
                }
                return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            }
      var baseFont = GetIRANSans().BaseFont; // null 

    • وحید نصیری در ۱۳۹۹/۰۱/۲۶ ۲۰:۲
      در این متد بجای fontName، فقط از fontPath استفاده کنید؛ کار می‌کند (آزمایش شد):

      • سید امید موسوی در ۱۳۹۹/۰۱/۲۷ ۹:۴
        سپاس از شما مشکل مقدار null برطرف میشه با این تغییر ، منتها فونت خاص ذکر شده Register نمیشه و از کش FontFactory بازیابی نمیشه.
           public iTextSharp.text.Font GetBNazanin()
                {
        
                    var fontName = "BNazanin";
                    var fontPath = Path.Combine(_hostingEnvironment.WebRootPath + @"\css\font\BNazanin\BNazanin.ttf");
        
                    if (!FontFactory.IsRegistered(fontName))// به درستی کار می‌کند و در صورت وجود از کش می‌خواند
                    {
                        FontFactory.Register(fontPath);
                    }
        
                    return FontFactory.GetFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                }

          public iTextSharp.text.Font GetIRANSans()
                {
                    var fontName = "IRANSansWeb(FaNum)_Medium";
                    var fontPath = Path.Combine(_hostingEnvironment.WebRootPath + @"\css\font\IRANSansWeb(FaNum)_Medium.ttf");
                  
                    if (!FontFactory.IsRegistered(fontName))// always false
                    {
                        FontFactory.Register(fontPath);
                    }
                    return FontFactory.GetFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                }

         
        • وحید نصیری در ۱۳۹۹/۰۱/۲۷ ۱۳:۲۲
          - اگر هدف استفاده از فونت هست که برآورده شده.
          - و ... بله. فونتش استاندارد نیست. این فونت را به همین روشی که گفتم باید استفاده کنید تا کار کند؛ فقط از مسیر فایل ttf دار بجای پارامترهای اصلی استفاده کنید و نه از نام آن. فونت استاندارد برای PDF چند سال قبل تولید شده؛ در اینجا.