یکی از مهمترین قالبهای ایجاد خروجی، فایلهای PDF هستند. یکی از بهمترین ویژگی این فایلها (که در فرمتهای مشابه کمتر به چشم می خورد) این است که در تمام سیستم ها بدون توجه به نوع سیستم، سیستم عامل، فونتهای نصب شده و ... یکسان دیده میشوند و همچنین در اکثر سیستمها پشتبانی خوبی از آن شده است. با توجه به تنوع سیستمهای کاربران (مخصوصا در برنامه های تحت وب) این ویژگی بسیار بیشتر اهمیت خود را نشان می دهد. بنابراین چندان عجیب نیست که در حال حاضر یکی از محبوبترین فرمتهای ایجاد خروجی (مثلا در گزارشات) فرمت PDF محسوب میشود.
کتابخانه های مختلفی برای ایجاد فایلهای PDF وجود دارد. بهترین کتابخانه ای که من برای زبانهای NET. دیده ام، کتابخانه iTextSharp است. این کتابخانه از روی iText که یکی از معروفترین کتابخانه های ایجاد و مدیریت فایلهای PDF است، نوشته شده است. استفاده از این کتابخانه برای کار کردن با زبان فارسی به سادگی امکان پذیر است ولی نیاز به کمی دقت هنگام استفاده است. در اینجا میخواهم روش ساده استفاده از این کتابخانه برای ایجاد صفحات فارسی را توضیح دهم.
اولین کاری که در استفاده از این کتابخانه باید انجام دهید، اضافه کردن فایل itextsharp.dll به رفرنس های پروژه است. آخرین نسخه این کتابخانه در زمان نوشتن این متن نسخه 4.1.6.0 است که
از اینجا میتوانید آن را دریافت کنید. برای ایجاد فایل PDF از دو فضای نام زیر استفاده می شود:
using iTextSharp.text;
using iTextSharp.text.pdf;
ایجاد یک فایل PDf با استفاده از iTextSharp شامل
5 مرحله است.
- ایجاد یک شئ از کلاس Document
- ایجاد یک PdfWriter (که به شئ Document گوش میکند و خروجی را بر روی یک stream مینویسد)
- باز کردن شئ Document
- اضافه کردن محتوای فایل PDF
- بستن شئ Document
در ادامه به بررسی این مراحل می پردازیم.
1 ایجاد شئ Document
Document doc = new Document();
2 ایجاد PdfWriter
ورودی های تابع ایجاد کننده، یک شء از کلاس Document است (که در مرحله قبل ساخته شده است) و یک stream است که خروجی بر روی آن نوشته می شود.
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("sample.pdf", FileMode.Create));
3 باز کردن شئ Document
doc.Open();
4 اضافه کردن محتوای فایل PDF
برای اضافه کردن یک متن انگلیسی، به سادگی می توان از دستوری مانند دستور زیر استفاده کرد:
doc.Add(new Paragraph("Hello World"));
ولی برای استفاده از زبان فارسی، کار کمی بیشتر است و باید حتما جهت نوشته ها را به راست به چپ تبدیل کنیم و فونت مناسب انتخاب کنیم. برای تمرکز بیشتر در مراحل، این موارد را در ادامه (بعد از توضیح مراحل) آورده ام.
5 بستن Document
doc.Close();
کار با متون فارسی
همانطور که گفته شد، برای کار با متون فارسی، باید جهت نوشته ها به صورت راست به چپ شود و همچنین فونت مناسب انتخاب شود.
یکی از فونتهایی که برای زبان فارسی به خوبی کار میکند و در اکثر سیستمها موجود است، فونت Tahoma است. نکته قابل توجه اینکه این فونت تنها در کامپیوتری که فایل PDF را ایجاد میکند مورد نیاز است و به علت اینکه در فایل PDF گنجانده خواهد شد، در سایر کامپیوترهایی که فایل PDF را مشاده می کنند، نیازی به وجود این فونت نیست. برای استفاده از فونتها، ابتدا باید پوشه حاوی فونتها را به iTextSharp معرفی کنیم و سپس فونت مورد علاقه خود را توسط تابع FontFactory.GetFont انتخاب کنیم. تنها نکته مهم در اینجا استفاده از encoding مناسب است که برای زبان فارسی (یا به طور کلی یونیکد) از IDENTITY_H استفاده می شود. سایر پارامترهای ورودی این تابع مشخص است و نیازی به توضیح اضافی ندارد.
FontFactory.RegisterDirectories();
Font fTahoma = FontFactory.GetFont("Tahoma", BaseFont.IDENTITY_H, 12, Font.NORMAL, Color.BLACK);
برای تبدیل جهت نوشته ها، به طور مستقیم نمیتوانیم عمل کنیم و حتما باید نوشته ها را در یک عنصر دیگر که این قابلیت را داشته باشد قرار دهیم. در iTextSharp تنها دو عنصر هستند که این قابلیت را دارند. یکی ColumnText و دیگری PdfPTable است. در این دو عنصر میتوانیم با تنظیم RunDirection، جهت متون را راست به چپ کنیم و متون فارسی را به خوبی در آنها نمایش دهیم. PdfPTable، مشابه جداول در Html کار میکند و ColumnText هم برای ایجاد ستونهای حاوی متون (به صورت یک مستطیل در صفحه) استفاده می شود. در اینجا برای نمونه استفاده از ColumnText نشان داده می شود.
ابتدا یک شئ از کلاس ColumnText با استفاده از محتویات شئ PdfWriter ایجاد میکنیم و مقدار RunDirection آن را تنظیم میکنیم. سپس نوع ستون و ویژگیهای آن را تعیین میکنیم. در اینجا من از ستون ساده استفاده کرده ام که پارامترهای ورودی آن، مختصات گوشه های مستطیل است. بعد از آن، بجای اضافه کردن محتویات به طور مستقیم به Document، محتویات را به شئ ایجاد شده از ColumnText اضافه میکنیم (استفاده از فونت مناسب فراموش نشود). در انتها نیز، با استفاده از متد Go، محتویات ColumnText را در Document می نویسیم.
ColumnText ct = new ColumnText(writer.DirectContent);
ct.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
ct.SetSimpleColumn(20, 20, 555, 800);
ct.AddText(new Phrase(txt, fTahoma));
ct.Go();
دانلود کردن PDF ساخته شده در ASP.NET
در برنامه های تحت وب، بسیار رایج است که بخواهیم فایل ایجاد شده را در سرور، بر روی هارددیسک ننویسیم و آن را در حافظه ایجاد کرده و مستقیما برای دانلود به کلاینت ارسال کنیم. برای این کار می توانیم بجای stream ایجاد شده در مثال بالا، از MemoryStram استفاده کنیم.
MemoryStream stream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, stream);
سپس در پایان کار، برای دانلود PDF ایجاد شده در حافظه، ابتدا آن را به یک بافر منتقل میکنیم، و سپس با استفاده از شئ Response محتوای بافر را مستقیما به کلاینت میفرستیم. در صورتی که بخواهیم فایل حتما دانلود شود و در مرورگر کاربر باز نشود، می توانیم با استفاده از هدر content-disposition این موضوع را به مرورگر اطلاع دهیم. در این صورت حتی در صورت نصب بودن پلاگین مشاهده PDF بر روی مرورگر، بازهم صفحه دانلود فایل باز خواهد شد.
byte[] buffer = stream.GetBuffer();
stream.Close();
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
Response.ContentType = "application/pdf";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.End();
مثال
در پایان یک مثال از مطالب مطرح شده در این مقال ضمیمه شده است. در این ضمیمه، فایل itextsharp.dll نیز وجود دارد و برای اجرای مستقیم آن نیاز به ابزار خاص دیگری ندارد.
بروزرسانی
به خاطر درخواست دوستان، یک نمونه ساده از شیوه گرفتن خروجی PDF از GridView اضافه کردم. بزودی یک مثال کاملتر به همراه توضیح کد در یک پست جدید ارایه خواهم داد ولی تا موقعی که فرصت این کار را پیدا کنم، میتوانید از این مثال ساده که در این پست ضمیمه کردم استفاده کنید.
بروزرسانی 2
کتابخانه ای برای گرفتن خروجی PDF از GridView تهیه کرده ام که از اینجا میتوانید آن را مشاهده کنید.
نظرات
sKNljmQhVUp
comment1, viagra, 7812,
gXftKKChVgQ
purchase valium no prescription - order valium cheap
LXeQEdiJxC
order valium cheap - buy valium online cheap
ZXLRcuSbPoqsKCwti
comment6, viagra no prescription, wdaonj, cialis without prescription, 8OO, buy levitra, gbe, viagra overnight, iby, sildenafil citrate, 9749,
IDiUdqjCLzPyWxqZ
buy xanax cheap - generic xanax online
DwgJfEPhwQfOsohk
buy xanax no rx - xanax online
DtKDTTCFwSFPNuC
xanax to buy - buy xanax 2mg
DHDxwQkPQxxaTmzTB
comment5, buy viagra online, 68438, cialis uk, 54485,
HsfiEzNDQANb
comment6, viagra, 8P, buy cialis online, mnirc, levitra, ylkd,
qXnOdkHXAu
comment4, viagra, 9556,
gpluILmYjsRjoYNct
meridia cheap - purchase meridia no prescription
mQUnOgeeWJAvmXWKbH
xanax cheap - order xanax
tKZdVuAauBGXSyz
purchase ativan online - ativan buy online
JakylFyqxM
purchase online generic xanax - buy xanax
GtwdxEPFCijKm
valium buy online - valium order
bUGFSVBfNEjrnuIHa
order tramadol no prescription - cheap tramadol online
gwPDULHWVmhXlGNGzl
buy valtrex online no prescription - buy generic valtrex
wMnxVCeCdVo
buy ambien 10mg - ambien online order
YyGkjXLFzHWQNDg
buy generic cialis - buy cialis cheap
SEkWSCujNVdszMY
purchase valium cheap - valium cheap
tCHOMpJCgQl
phentermine order - buy phentermine online
yyxVEmvjeQWUrbybABw
order cheap valium - buy cheap valium online
CfrPjDTuFBA
ativan without prescription - ativan to buy
zHLQyGvicxUkDN
generic ambien online - buy generic ambien online
XwwxZkBgMDcmQR
buy klonopin online no prescription - online generic klonopin
fVLWeQvftJNucLQpZxc
xanax no prescriptions - xanax buy
heglXdiTaFb
buy cialis online - cialis to buy
KuasVHJhhzuFdu
soma buy - purchase soma
jZtxjbdfIOCWPYIzxq
order ativan no prescription - buy ativan online
cwBEoGZmjercfs
meridia no prescriptions - buy meridia online no rx
VQBzdINpBijsEtDVR
purchase xanax online no prescription - buy xanax cheap
ypdzBtjnOwRjPNMXy
buy valium generic online - buy valium online
tAkQUkKQaKUy
buy klonopin online - purchase klonopin overnight delivery
QFOghgRbPnU
buy ambien 10mg - buy ambien online
MohZIqdkaWxCpoW
comment5, cialis online, =-((,
rRTeQJbvKq
no prescription valtrex - no prescription valtrex
edvTNkptRfzkcVIWrJ
tramadol generic - tramadol generic
KBsRWHHfkCTe
buy valium no rx - order valium 10mg
iQZYVAJXKbJp
hrteYd gspvjzngqhiu, [url=http://jgviudydqbcj.com/]jgviudydqbcj[/url], [link=http://svqulcqryyiz.com/]svqulcqryyiz[/link], http://hezqaaxdyhjq.com/
EUdLnsTTBfa
buy generic valium - order valium online no prescription
MSEXyuYJZXURmSPjA
buy generic ambien - buy ambien cheap
xqJPfCQguJ
comment1, cialis, 8], levitra online, =-[[[,
KkfPFksabdpdPmgI
buy cialisccialis online - cialis generic
EUPvRDvuee
comment6, cheapest generic viagra, cwbs,
hzfdhuocwc
Nei2Cw mxrxfwpeojib, [url=http://uqbkyrlxjpnh.com/]uqbkyrlxjpnh[/url], [link=http://nqossuhylehe.com/]nqossuhylehe[/link], http://efpbtrmobqyw.com/
xZRElQDrLwqFgSXRz
online klonopin - klonopin order
VoEFSWsbjaMVLGLWL
xanax to buy - buy xanax online
yBhJRCduEn
order ambien 10mg - generic ambien online
WsYRuwlYNFfyEK
buy over the counter cheap valtrex - purchase valtrex uk
aIbLobwJIuBAtEdW
buy generic ambien - no prescription ambien