۱۳۹۰/۰۶/۰۲

تعريف رنگ در iTextSharp


در كتابخانه‌ي iTextSharp به جهت سازگاري با كتابخانه‌ي اصلي، رنگ‌ها را بر اساس كلاسي به نام BaseColor تعريف كرده‌اند؛ كه اي‌كاش به جاي اين‌كار، همه را با كلاس Color فضاي نام استاندارد System.Drawing جايگزين مي‌كردند. همين مشكل با فونت هم هست. يك كلاس فونت در فضاي نام iTextSharp.text وجود دارد به علاوه كلاس فونت تعريف شده در فضاي نام استاندارد System.Drawing دات نت؛ كه خيلي سريع مي‌تواند به خطاي كامپايل زير ختم شود:

'Font' is an ambiguous reference between 'iTextSharp.text.Font' and 'System.Drawing.Font'	

و در نهايت مجبور خواهيم شد كه به صورت صريح علام كنيم، iTextSharp.text.Font منظور ما است و نه آن يكي.
در كل اگر با كلاس Color فضاي نام استاندارد System.Drawing بيشتر راحت هستيد به صورت زير هم مي‌توان رنگ‌هاي متداول را مورد استفاده قرار داد:

تعريف رنگ‌ها بر اساس نام آن‌ها:

var color = new BaseColor(Color.LightGray);

تعريف رنگ‌ها بر اساس مقادير Hex متداول در المان‌هاي HTML :

var color = new BaseColor(ColorTranslator.FromHtml("#1C5E55"));

اين نكته‌اي است كه شايد خيلي‌ها از وجود آن بي‌اطلاع باشند. به صورت پيش فرض در كلاس استاندارد ColorTranslator، امكان دريافت رنگ‌هاي بكاررفته در المان‌هاي HTML به كمك متد ColorTranslator.FromHtml مهيا است.
البته اگر زماني خواستيد خودتان اين متد را پياده سازي كنيد، نكته‌ي آن به صورت زير است:

string htmlColor = "#1C5E55";
int x = Convert.ToInt32(htmlColor.Replace("#", "0x"), 16);
byte red   = (byte)((x & 0xff0000) >> 16);
byte green = (byte)((x & 0xff00) >> 8);
byte blue  = (byte)(x & 0xff);

سپس كلاس‌هاي Color و همچنين BaseColor امكان پذيرش اين اجزاي حاصل را دارند (به كمك متد Color.FromRgb و يا سازنده‌ي BaseColor).
علت ذكر ColorTranslator.FromHtml به اين بر مي‌گردد كه تركيبات رنگ جالبي را مي‌توان از جداول HTML ايي موجود در سايت‌هاي مختلف ايده گرفت و يا حتي از قالب‌هاي پيش فرض GridView در ASP.NET مثلا.


اكنون براي ساخت جدولي مانند شكل فوق، به ازاي هر سلولي كه مشاهده مي‌كنيد بايد يكبار BorderColor و BackgroundColor تنظيم شوند. رنگ متن هم از رنگ فونت دريافت مي‌شود:

var pdfCell = new PdfPCell(new Phrase(Text, Font))
            {
                RunDirection = ...,
                BorderColor = ...,
                BackgroundColor = ...
            };