تهیه خروجی PDF از GridView

تصویر مهدی

مقدمه:

استفاده از گریدویو (GridView) برای تهیه گزارشات ساده کاری است که در بین برنامه نویسان ASP.NET بسیار متداول است. برای تهیه خروجی از گریدویو به Excel و Word مقالات زیادی نوشته شده است که با یک جستجوی ساده نمونه های زیادی خواهید دید. یکی از فرمتهای متداولی که برنامه نویسان برای تهیه گزارش از آن استفاده می کنند، فرمت PDF است و طبیعتا برای تهیه خروجی به PDF نیز روشهای مختلفی ارایه شده که متاسفانه هیچ یک از آنها (تا جایی که من تست کرده ام) برای متون فارسی قابل استفاده نیست.
برای حل این مساله من با استفاده از iTextSharp یک کتابخانه برای تبدیل گریدویو به PDF (برای متون فارسی) تهیه کرده ام که در اینجا ارایه خواهم داد. این کتابخانه توانایی تبدیل گریدویو به PDF با حفظ استایل های داده شده به گریدویو را دارد.

از آنجایی که روش کلی استفاده از iTextSharp به همراه متون فارسی و همچنین یک مثال ساده تهیه خروجی از گریدویو را قبلا بیان کرده ام، در اینجا فقط نحوه استفاده از این کتابخانه را توضیح میدهم و از توضیح بیشتر درباره iTextSharp خودداری میکنم.

روش استفاده:

برای استفاده از این کتابخانه، ابتدا یک ارجاع به کتابخانه (iTextSharp (itextsharp.dll و همچنین کتابخانه ارایه شده در اینجا (GridToPdf.dll) به پروژه خود اضافه کنید و فضای نام Hasheminezhad را به کد خود اضافه کنید.

	using Hasheminezhad;

سپس با استفاده از کلاس GridToPdf میتوانید عملیات تبدیل گریدویو به PDF را انجام دهید. در این کلاس دو متد به نامهای Convert و Download وجود دارند.
با استفاده از متد Download میتوانید مستقیما خروجی GridView را برای کاربر ارسال کنید. تنها پارامتر ورودی الزامی این تابع، نام گریدویو است.

	GridToPdf.Download(GridView1);

پس از اجرای این دستور، در صورتی که پلاگینهای نمایش PDF در مرورگر کاربر نصب شده باشد، فایل PDF را در مرورگر خود مشاهده خواهد کرد و در غیر اینصورت، فایل PDF برای دانلود ارسال خواهد شد.
در صورت تمایل میتوانید نام مورد نظر برای ذخیره فایل را به عنوان پارامتر دوم به این تابع ارسال کنید. در این حالت حتی در صورتی که مرورگر امکان نمایش فایل PDF را نیز داشته باشد، آن را در مرورگر باز نکرده و با نام ذکر شده برای دانلود ارسال خواهد کرد.

	GridToPdf.Download(GridView1, "Report.pdf");

دقت کنید که برای اجرای صحیح متد Download، باید حتما صفحه PostBack کامل شده باشد. بنابراین اگر دانلود کردن PDF قرار است از طریق دکمه ای در داخل UpdatePanel انجام پذیرد، حتما این دکمه را به PostBackTrigger های UpdatePanel اضافه کنید.

متد دیگر موجود در این کلاس، متد Convert است که در ساده ترین حالت خود بجز نام گریدویو، نام فایل مورد نظر را دریافت کرده و محتوای فایل PDF را در سرور (و در آدرس ذکر شده) ذخیره خواهد کرد.

	GridToPdf.Convert(GridView1, Server.MapPath("Report.pdf"));

همچنین در صورت لزوم میتوانید هر Stream دیگر که مورد نیاز بود را به این تابع ارسال کنید.

استفاده از GridView صفحه بندی شده
در صورتی که گریدویو دارای صفحه بندی باشد و همچنین DataBind شدن گریدویو را از طریق کدنویسی انجام داده شده باشد (و نه از طریق کنترلهایی مانند ObjectDataSource)، لازم است که حتما قبل از فراخوانی متدهای تبدیل به PDF، ویژگی DataSource مربوط به گریدویو مقدار داشته باشد. در غیر اینصورت، تنها امکان ارسال اطلاعات صفحه جاری به فایل PDF وجود خواهد داشت.

	GridView1.DataSource = getDataSource();
	GridToPdf.Download(GridView1);

ضمیمه

به همراه این مقاله سه فایل ضمیمه شده است. فایل اول، کتابخانه تبدیل گریدویو به PDF است. فایل دوم حاوی یک پروژه نمونه است که برای دیدن نمونه اجرای برنامه میتوانید از آن استفاده کنید. در این پروژه، فایل itextsharp.dll نیز وجود دارد و برای اجرا آن نیاز به فایل اضافی نخواهید داشت. در نهایت فایل سوم، سورس کتابخانه ارایه شده در اینجا است که استفاده از آن با رعایت قوانین مجوز CPL آزاد است.

ضمیمهاندازه
کتابخانه تبدیل GridView به PDF6.09 کیلو بایت
پروژه نمونه به همراه کلیه فایلهای مورد نیاز برای اجرا1.15 مگابایت
سورس کتابخانه (بدون فایل itextsharp.dll)10.26 کیلو بایت

نظرات

تشکر و در خواست

من از این همه لطف شما که این کد رو نوشتی تشکر می کنم
من یه پروژه دارم که صفحه وب که گرید ویو توشه دائم ذخیره میشه و الان با کد فارسی شما درست کار می کنه فقط همون مشکلی که یکی از دوستان اشاره کردن فونت ها بزرگ هستند ستون ها بهم میریزن و من متنم چپ به راست هستش اگه ممکنه همین کدو به صورت ساده بدون اینکه فونتش عوض بشه و تغییرات دیگه داشته باشه تا ستون های ما هم بهم نریزه را برای دانلود بزارید
بعد چه جوری میشه فایل شما رو دست کاری کرد که این کار ها رو نکنه یه روز تموم تو اینترنت گشتم ولی کد شما حرف نداره و فقط مشکل بزرگ شدن زیاده برای من و چپ به راست بودنش من ستون هام زیادن
اگه ممکنه روش تغییر دادنش رو بگید یا کد اصلاح شدش و بزار برای دانلود همه با تشکر

drupal jquery

با عرض سلام و خسته نباشید
مشکل این هست که بین دو تا از css های که add میکنم بین اونها چند تا فایل css jquery همین جوری اضافه می شوند
مثلا بین این دو تا فایل چند تا فایل دیگه css یی دیگه اضافه می شن
jqgrid/themes/redmond/jquery-ui-1.8.2.custom.css
jqgrid/themes/ui.jqgrid.css
اینها همونی هستند که همین جوری اضافه می شند
sites/all/libraries/jquery.ui/themes/base/ui.core.css
sites/all/libraries/jquery.ui/themes/base/ui.core.css
/JQUERY_UI_PATH/themes/base/ui.core.css
چجوری میشه جلوی اینها رو گرفت تا لود نشن

گریدویو در داخل ددیتالیست

سلام.با تشکر از زحمات گرانقدر شما دوست عزیز.اجرتون با خدا.
این کتابخانه برام خیلی جالب بود.اما اگر امکان پذیره ممکنه راهنمایی بفرمایین اگر من بخوام یه DataList رو که در داخل اون Gridview دارم و گریدویو هم در زمان اجرا و در رویداد ItemDataBound بایند میشه چطور میتونم به صورت PDF در بیاورم. این مسئله برام خیلی مهم و حیاتی هست.دوست گرامی اگر امکان دارد پاسخ رو به میل بنده ارسال فرمایید.
باتشکر از زحمات شما.
Hamidnch2007@Gmail.Com

اضافه نمودن شماره صفحه

با تشکر فراوان از کتابخانه کاربردی و جالب شما
این کتابخانه بسیار کاربردی و موثر است اگر امکان دارد شماره صفحه را نیز به Footer آن اضافه کنید. با تشکر

چیدمان دلخواه گزارشها

جزئیات اینکه چه فیلد هایی درهر گزارش درج شودو محل قرارگیری هر کدام در 1 جدول که مربوط به چیدمان گزارشهاست در دیتابیس ذخیره شده است
چطور میتوانیم امکان درج هدر و فوتر را داشته باشیم تا نام گزارش، تاریخ، لوگو شوکت،... را در pdf با چیدمانی که تنظیم میکنیم چاپ کنیم؟
آیا میتوان از HTMLWorker استفاده کرد؟

تصویر مهدی

چیدمان دلخواه گزارشها

در مورد زبان فارسی، من نتونستم از HTMLWorker استفاده کنم. البته با انجام تغییرات زیادی در خود کتابخانه موفق شدم کارهای مختصری بکنم ولی اصلا نتیجه رضایت بخش نبود برای همین هم ادامه ندادم.
اما شما میتونید با خوندن کد، به روش مشابه فیلدهای خودتون رو درج کنید. مثلا خط 95 در سورس رو اگر ببینید، یک Header اضافه میشه (از روی مقدار Caption مربوط به GridView)

سلام کتابخانه تهیه شده بسیار

سلام
کتابخانه تهیه شده بسیار عالی و کاربردی است
یک سوال داشتم من برای دادن Style به GridView از Css استفاده می کنم ولی در Pdf هیچ کدام از style اعمال نشده ،
Data داخل GridView نمایش داده می شوند ولی هیچ Style ندارند.
برای حل این مشکل چه راه حلی پیشنهاد می کنید ؟

تصویر مهدی

استفاده از CSS

سلام،
پیاده سازی این حالت یکمی فرق داره! اول اینکه باید فایل css پیدا بشه. بعد فایل parse بشه و استایلهای مرتبط مشخص بشه. بعد استایل ها تفسیر بشن و روی GridView اعمال بشن. به طور خلاصه اینکه این کار زحمتش بیشتر بود و در نتیجه پیاده سازی نشده! اگر نیاز داشتید، بگید تا بیشتر راهنمایی کنم تا بتونید خودتون پیاده سازی کنید.

تشکر

از لطف شما که بسیار ممنونم.

هدر گزارش

سلام
خسته نباشید
با این dll کار منو خیلی راحت کردید واقعا ممنون.خسته نباشید.مشکل من اینجاست که میخوام PDF تولیدی هدر داشته باشه.مثلا نام گزارش تاریخ و...
چطور میتونم این امکان رو داشته باشم؟

هدر گزارش

سلام
با خسته نباشید و تشکر فراوان، این سوال من هم هست. چطور میتوانیم امکان درج هدر و فوتر را داشته باشیم تا نام گزارش، تاریخ، لوگو شوکت،... را در pdf با چیدمانی که تنظیم میکنیم چاپ کنیم؟

تصویر مهدی

هدر گزارش

سلام،
این امکان پیشبینی شده و با تعیین caption برای GridView میتونید Header گزارش رو ببینید.

سلام

باتشكر از زحمات شما من از كتابخانه شما استفاده كردم ولي يك ايرادي كه داره اينه كه اگر داخل يك cell عبارت بزرگي مثل آدرس وجود داشته باشد كلمات آن شكسته مي شود بطوري كه مثلا بروزرسانـ در بالا و ـي در پايين مي افتدكه مطمئنا شما خودتان تست كرديد آيا راه حلي دارد؟؟

تصویر مهدی

عرض ستون و کلمات بزرگ

سلام، ممنون از نظرتون،
طبق اونچه که من تست کردم، تا جایی که امکانش باشه وسط کلمه شکسته نمیشه و تنها حالتی که من دیدم که وسط کلمه شکسته میشد، وقتی بود که عرض ستون اونقدر کم بود که اصلا کلمه توش جا نمیشد، یعنی حالتی کل کلمه در یک خط هم جا نمیشه. در این حالت باید عرض ستون رو بیشتر کنید و راهی که مثلا بخواد طبق محتویات، خودش براتون عرض رو زیاد کنه وجود نداره.
بازهم اگر فکر میکنید من منظورتون رو درست متوجه نشدم، بیشتر توضیح بدین.

دستمريزاد مهدي جان

از اينكه وقت گرانقدرتان را در اختيار مي گذاريد متشكريم و اميدواريم همواره پيروز و موفق باشي.