۱۳۹۰/۰۶/۲۲

iTextSharp و استفاده از قلم‌هاي محدود فارسي


عموما قلم‌هاي فارسي، خصوصا مواردي كه با B شروع مي‌شوند مانند B Zar و امثال آن، فاقد تعاريف حروف مرتبط با glyphs الفباي انگليسي است. نتيجه اين خواهد شد كه اگر متن شما مخلوطي از كلمات و حروف فارسي و انگليسي باشد، فقط قسمت فارسي نمايش داده مي‌شود و از قسمت انگليسي صرفنظر خواهد شد. مرورگرها در اين حالت هوشمندانه عمل مي‌كنند و به يك قلم پيش فرض مانند Times و همانند آن جهت نمايش اينگونه متون مراجعه خواهند كرد؛ اما اينجا چنين اتفاقي نخواهد افتاد.
براي حل اين مشكل، كلاسي به نام FontSelector در كتابخانه‌ي iTextSharp وجود دارد. مثالي در اين رابطه:

using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace HeadersAndFooters
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var pdfDoc = new Document(PageSize.A4))
            {
                PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
                pdfDoc.Open();

                FontFactory.Register("c:\\windows\\fonts\\bzar.ttf");
                Font bZar = FontFactory.GetFont("b zar", BaseFont.IDENTITY_H);

                FontFactory.Register("c:\\windows\\fonts\\tahoma.ttf");
                Font tahoma = FontFactory.GetFont("tahoma", BaseFont.IDENTITY_H);

                FontSelector fontSelector = new FontSelector();

                //قلم اصلي
                if (bZar.Familyname != "unknown")
                {
                    fontSelector.AddFont(bZar);
                }

                //قلم پيش فرض در صورت نبود تعاريف مناسب در قلم اصلي
                if (tahoma.Familyname != "unknown")
                {
                    fontSelector.AddFont(tahoma);
                }

                var table1 = new PdfPTable(1);
                table1.WidthPercentage = 100;
                table1.RunDirection = PdfWriter.RUN_DIRECTION_RTL;

                var pdfCell = new PdfPCell { RunDirection = PdfWriter.RUN_DIRECTION_RTL, Border = 0 };
                pdfCell.Phrase = fontSelector.Process("نمايش مخلوطي از متن فارسي و English با هم توسط قلمي كه كاراكترهاي انگليسي را پشتيباني نمي‌كند");

                table1.AddCell(pdfCell);
                pdfDoc.Add(table1);

            }

            //open the final file with adobe reader for instance.
            Process.Start("Test.pdf");
        }
    }
}

در اين مثال از قلم B Zar استفاده شده است. اولين قلمي كه به يك FontSelector اضافه مي‌شود، قلم اصلي خواهد بود. قلم‌ بعدي اضافه شده، قلم پيش فرض نام خواهد گرفت؛ به اين معنا كه در مثال فوق اگر قلم B Zar توانايي نمايش حرف جاري را داشت كه خيلي هم خوب، در غيراينصورت به قلم بعدي مراجعه خواهد كرد و همينطور الي آخر. بنابراين اين ترتيب اضافه كردن قلم‌ها به FontSelector مهم است. نحوه استفاده نهايي از FontSelector تعريف شده هم در قسمت pdfCell.Phrase = fontSelector.Process مشخص است.