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

روش متداول تعریف فونت در 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 چند سال قبل تولید شده؛ در اینجا.