معرفی کتابخانه PdfReport
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یازده دقیقه

مدتی هست که در حال تهیه کتابخانه‌ی گزارش سازی مبتنی بر iTextSharp هستم و عمده‌ی استفاده از آن برای من تاکنون، تهیه گزارشات باکیفیت PDF فارسی تحت وب بوده؛ هر چند این کتابخانه وابستگی خاصی به فناوری مورد استفاده ندارد و با WinForms، WPF، مشتقات ASP.NET ، سرویس‌های WCF و کلا هرجایی که دات نت فریم ورک کامل در دسترس باشد، قابل استفاده است. همچنین به منبع داده خاصی گره نخورده است و حتی می‌توانید از یک anonymously typed list عدم متصل به بانک اطلاعاتی خاصی نیز به عنوان منبع داده آن استفاده کنید.
کتابخانه PdfReport به عمد جهت دات نت 3.5 تهیه شده است تا بازه وسیعی از سیستم عامل‌ها را پوشش دهد.
این کتابخانه علاوه بر تبدیل اطلاعات شما به گزارشات مبتنی بر PDF، امکان تهیه خروجی خودکار اکسل (2007 به بعد) را نیز دارد. فایل خروجی آن، به صورت پیوست درون فایل PDF تهیه شده قرار می‌گیرد و جزئی از آن می‌شود.
بدیهی است اینبار با کتابخانه گزارش سازی روبرو هستید که با راست به چپ مشکلی ندارد!
کتابخانه PdfReport بر پایه کتابخانه‌های معروف سورس باز iTextSharp و EPPlus تهیه شده است. حداقل مزیت استفاده از آن، صرفه جویی در وقت شما جهت آموختن ریزه کاری‌های مرتبط با هر کدام از کتابخانه‌های یاده شده است. برای نمونه جهت فراگیری کار با iTextSharp نیاز است یک کتاب 600 صفحه‌ای به نام iText in action را مطالعه و تمرین کنید. این مورد منهای مسایل و نکات متعدد مرتبط با زبان فارسی است که در این کتاب به آن‌ها اشاره‌ای نشده است.
برای تهیه آن، مشکلات متداولی که کاربران مدام در انجمن‌های برنامه نویسی مطرح می‌کنند و ابزارهای موجود عاجز از ارائه راه حلی ساده برای حل آن‌ها هستند، مد نظر بوده و امید است نگارش یک این کتابخانه بتواند بسیاری از این دردها را کاهش دهد.
کار با این کتابخانه صرفا با کدنویسی میسر است (code first) و همین مساله انعطاف پذیری قابل توجهی را ایجاد کرده که در طی روزهای آینده با جزئیات بیشتر آن آشنا خواهید شد.


اما چرا PDF؟

استفاده از قالب PDF برای تهیه گزارشات، این مزایا را به همراه دارد:
- دقیقا همان چیزی که مشاهده می‌شود، در هر مکانی قابل چاپ است. با همان کیفیت، همان اندازه صفحه، همان فونت و غیره. به این ترتیب به صفحه بندی بسیار مناسب و بهینه‌ای می‌توان رسید و مشکلات گزارشات HTML ایی وب را ندارد.
- امکان استفاد از فونت‌های شکیل‌تر در آن بدون مشکل و بدون نیاز به نصب بر روی کامپیوتری میسر است؛ چون فونت را می‌توان در فایل PDF نیز قرار داد.
- این فایل در تمام سیستم عامل‌ها پشتیبانی می‌شود. خصوصا اینکه فایل نهایی در تمام کامپیوترها و در انواع و اقسام سیستم عامل‌ها به یک شکل و اندازه نمایش داده خواهد شد. برای مثال اینطور نیست که در ویندوز XP ،‌اعداد آن فارسی نمایش داده شوند و در ویندوز 7 با تنظیمات محلی خاصی، دیگر اینطور نباشد. حتی تحت لینوکس هم اعداد آن فارسی نمایش داده خواهد شد چون فونت مخصوص بکار رفته، در خود فایل PDF قابل قرار دادن است.
- برنامه معروف و رایگان Adobe reader برای خواندن و مشاهده آن کفایت می‌کند و البته کلاینت یکبار باید این برنامه را نصب کند. همچنین از این نوع برنامه‌های رایگان برای مشاهده فایل‌های PDF زیاد است.
- تمام صفحات گزارش را در یک فایل می‌توان داشت و به یکباره تمام آن نیز به سادگی قابل چاپ است. این مشکلی است که با گزارشات تحت وب وجود دارد که نمی‌شود مثلا یک گزارش 100 صفحه‌ای را به یکباره به چاپگر ارسال کرد. به همین جهت عموما کاربران درخواست می‌دهند تا کل گزارش را در یک صفحه HTML نمایش دهید تا ما راحت آن‌را چاپ کنیم یا راحت از آن خروجی بگیریم. اما زمانیکه فایل PDF تهیه می‌شود این مشکلات وجود نخواهد داشت و جهت Print بسیار بهینه سازی شده است. تا حدی که الان فرمت برگزیده تهیه کتاب‌های الکترونیکی نیز PDF است. مثلا سایت معروف آمازون امکان فروش نسخه PDF کتاب‌ها را هم پیش بینی کرده است.
-امکان صفحه بندی دقیق به همراه مشخص سازی landscape یا portrait بودن صفحه نهایی میسر است. چیزی که در گزارشات صفحات وب آنچنان معنایی ندارد.
- امکان رمزنگاری اطلاعات در آن پیش بینی شده است. همچنین می‌توان به فایل‌های PDF امضای دیجیتال نیز اضافه کرد. به این ترتیب هرگونه تغییری در محتوای فایل توسط برنامه‌های PDF خوان معتبر گزارش داده شده و می‌توان از صحت اطلاعات ارائه شده توسط آن اطمینان حاصل کرد.
- از فشرده سازی مطالب، فایل‌ها و تصاویر قرار داده شده در آن پشتیبانی می‌کند.
- از گرافیک برداری پشتیبانی می‌کند.


مجوز استفاده از این کتابخانه:
کار من مبتنی بر LGPL است. به این معنا که به صورت باینری (فایل dll) در هر نوع پروژه‌ای قابل استفاده است.
اما ... PdfReport از دو کتابخانه دیگر نیز استفاده می‌کند:
- کتابخانه iTextSharp که دارای مجوز AGPL است. این مجوز رایگان نیست.
- کتابخانه EPPlus برای تولید فایل‌های اکسل با کیفیت. مجوز استفاده از این کتابخانه LGPL است و تا زمانیکه به صورت باینری از آن استفاده می‌کنید، محدودیتی را برای شما ایجاد نخواهد کرد.


کتابخانه PdfReport به صورت سورس باز در CodePlex قرار گرفته ؛ اما جهت پرسیدن سؤالات، پیشنهادات، ارائه بهبود و غیره می‌توانید (و بهتر است) از قسمت مدیریت پروژه مرتبط در سایت جاری نیز استفاده کنید.


نحوه تهیه اولین گزارش، با کتابخانه PdfReport

الف) یک پروژه Class library جدید را شروع کنید. از این جهت که گزارشات PdfReport در انواع و اقسام پروژه‌های VS.NET قابل استفاده است، می‌توان از این پروژه Class library به عنوان کلاس‌های پایه قابل استفاده در انواع و اقسام پروژه‌های مختلف، بدون نیاز به تغییری در کدهای آن استفاده کرد.

ب) آخرین نگارش فایل‌های مرتبط با PdfReport را از اینجا دریافت کنید و سپس ارجاعاتی را به اسمبلی‌های موجود در بسته آن به پروژه خود اضافه نمائید (ارجاعاتی به PdfReport، iTextSharp و EPPlus). فایل XML راهنمای کتابخانه نیز به همراه بسته آن می‌باشد که در حین استفاده از متدها و خواص PdfReport کمک بزرگی خواهد بود.

ج) کلاس‌های زیر را به آن اضافه کنید:
using System.Web;
using System.Windows.Forms;

namespace PdfReportSamples
{
    public static class AppPath
    {
        public static string ApplicationPath
        {
            get
            {
                if (isInWeb)
                    return HttpRuntime.AppDomainAppPath;

                return Application.StartupPath;
            }
        }

        private static bool isInWeb
        {
            get
            {
                return HttpContext.Current != null;
            }
        }
    }
}
از این کلاس برای مشخص سازی محل ذخیره سازی فایل‌های نهایی PDF تولیدی استفاده خواهیم کرد.
همانطور که مشاهده می‌کنید ارجاعاتی را به System.Windows.Forms.dll و System.Web.dll نیاز دارد.

در ادامه کلاس User را جهت ساخت یک منبع داده درون حافظه‌ای تعریف خواهیم کرد:
using System;

namespace PdfReportSamples.IList
{
    public class User
    {
        public int Id { set; get; }
        public string Name { set; get; }
        public string LastName { set; get; }
        public long Balance { set; get; }
        public DateTime RegisterDate { set; get; }
    }
}
اکنون کلاس اصلی گزارش ما به صورت زیر خواهد بود:
using System;
using System.Collections.Generic;
using PdfRpt.Core.Contracts;
using PdfRpt.FluentInterface;

namespace PdfReportSamples.IList
{
    public class IListPdfReport
    {
        public IPdfReportData CreatePdfReport()
        {
            return new PdfReport().DocumentPreferences(doc =>
            {
                doc.RunDirection(PdfRunDirection.RightToLeft);
                doc.Orientation(PageOrientation.Portrait);
                doc.PageSize(PdfPageSize.A4);
                doc.DocumentMetadata(new DocumentMetadata { Author = "Vahid", Application = "PdfRpt", Keywords = "Test", Subject = "Test Rpt", Title = "Test" });
            })
            .DefaultFonts(fonts =>
            {
                fonts.Path(Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf",
                                  Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
            })
            .PagesFooter(footer =>
            {
                footer.DefaultFooter(DateTime.Now.ToString("MM/dd/yyyy"));
            })
            .PagesHeader(header =>
            {
                header.DefaultHeader(defaultHeader =>
                {
                    defaultHeader.ImagePath(AppPath.ApplicationPath + "\\Images\\01.png");
                    defaultHeader.Message("گزارش جدید ما");
                });
            })
            .MainTableTemplate(template =>
            {
                template.BasicTemplate(BasicTemplate.ClassicTemplate);
            })
            .MainTablePreferences(table =>
            {
                table.ColumnsWidthsType(TableColumnWidthType.Relative);
                table.NumberOfDataRowsPerPage(5);
            })
            .MainTableDataSource(dataSource =>
            {
                var listOfRows = new List<User>();
                for (int i = 0; i < 200; i++)
                {
                    listOfRows.Add(new User { Id = i, LastName = "نام خانوادگی " + i, Name = "نام " + i, Balance = i + 1000 });
                }
                dataSource.StronglyTypedList<User>(listOfRows);
            })
            .MainTableSummarySettings(summarySettings =>
            {
                summarySettings.OverallSummarySettings("جمع کل");
                summarySettings.PerviousPageSummarySettings("نقل از صفحه قبل");
                summarySettings.PageSummarySettings("جمع صفحه");
            })
            .MainTableColumns(columns =>
            {
                columns.AddColumn(column =>
                {
                    column.PropertyName("rowNo");
                    column.IsRowNumber(true);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(0);
                    column.Width(1);
                    column.HeaderCell("#");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<User>(x => x.Id);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(2);
                    column.HeaderCell("شماره");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<User>(x => x.Name);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(3);
                    column.HeaderCell("نام");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<User>(x => x.LastName);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(3);
                    column.Width(3);
                    column.HeaderCell("نام خانوادگی");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<User>(x => x.Balance);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(4);
                    column.Width(2);
                    column.HeaderCell("موجودی");
                    column.ColumnItemsTemplate(template =>
                    {
                        template.TextBlock();
                        template.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj));
                    });
                    column.AggregateFunction(aggregateFunction =>
                    {
                        aggregateFunction.NumericAggregateFunction(AggregateFunction.Sum);
                        aggregateFunction.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj));
                    });
                });

            })
            .MainTableEvents(events =>
            {
                events.DataSourceIsEmpty(message: "رکوردی یافت نشد.");
            })
            .Export(export =>
            {
                export.ToExcel();
                export.ToCsv();
                export.ToXml();
            })
            .Generate(data => data.AsPdfFile(AppPath.ApplicationPath + "\\Pdf\\RptIListSample.pdf"));
        }
    }
}
و برای استفاده از آن:
var rpt = new IListPdfReport().CreatePdfReport();
// rpt.FileName


برای نمونه، جهت مشاهده نمایش این خروجی در یک برنامه ویندوزی، به مثال‌های همراه سورس پروژه در مخزن کد آن مراجعه نمائید.

توضیحات بیشتر:

- در قسمت  DocumentPreferences، جهت راست به چپ (PdfRunDirection)، اندازه صفحه (PdfPageSize)، جهت صفحه (PageOrientation) و امثال آن تنظیم می‌شوند.
- سپس نیاز است قلم‌های مورد استفاده در گزارش مشخص شوند. در متد DefaultFonts باید دو  قلم را معرفی کنید. قلم اول، قلم پیش فرض خواهد بود و قلم دوم برای رفع نواقص قلم اول مورد استفاده قرار می‌گیرد. برای مثال اگر قلم اول فاقد حروف انگلیسی است، به صورت خودکار به قلم دوم رجوع خواهد شد.
- در ادامه در متد PagesFooter، تاریخ درج شده در پایین تمام صفحات مشخص می‌شود. در مورد ساخت Footer سفارشی در قسمت‌های بعدی بحث خواهد شد.
- در متد PagesHeader، متن و تصویر قرار گرفته در Header تمام صفحات گزارش قابل تنظیم است. این مورد نیز قابل سفارشی سازی است که در قسمت‌های بعد به آن خواهیم پرداخت.
- توسط MainTableTemplate، قالب ظاهری ردیف‌های گزارش مشخص می‌شود. یک سری قالب پیش فرض در کتابخانه PdfReport موجود است که توسط متد BasicTemplate آن قابل دسترسی است. در مورد نحوه تعریف قالب‌‌های سفارشی به مرور در قسمت‌های بعد، بحث خواهد شد.
- در قسمت MainTablePreferences تنظیمات جدول اصلی گزارش تعیین می‌شود. برای مثال چه تعداد ردیف در صفحه نمایش داده شود. اگر این مورد را تنظیم نکنید، به صورت خودکار محاسبه خواهد شد. نحوه تعیین عرض ستون‌های گزارش به کمک متد ColumnsWidthsType مشخص می‌شود که در اینجا حالت نسبی درنظر گرفته شده است.
- منبع داده مورد استفاده توسط متد MainTableDataSource مشخص می‌شود که در اینجا یک لیست جنریک تعیین شده و سپس توسط متد StronglyTypedList در اختیار گزارش ساز جاری قرار می‌گیرد. تعدادی منبع داده پیش فرض در PdfReport وجود دارند که هر کدام را در قسمت‌های بعدی بررسی خواهیم کرد. همچنین امکان تعریف منابع داده سفارشی نیز وجود دارد.
- با کمک متد MainTableSummarySettings، برچسب‌های جمع‌های پایین صفحات مشخص می‌شود.
- در قسمت MainTableColumns، ستون‌هایی را که علاقمندیم در گزارش ظاهر شوند، قید می‌کنیم. هر ستون باید با یک فیلد یا خاصیت منبع داده متناظر باشد. همچنین همانطور که مشاهده می‌کنید امکان تعیین Visibility، عرض و غیره آن نیز مهیا است (قابلیت ساخت گزارشاتی که به انتخاب کاربر، ستون‌های آن ظاهر یا مخفی شوند). در اینجا توسط callbackهایی که در متد ColumnItemsTemplate قابل دسترسی هستند، می‌توان اطلاعات را پیش از نمایش فرمت کرد. برای مثال سه رقم جدا کننده به اعداد اضافه کرد (برای نمونه در خاصیت موجودی فوق) و یا توسط متد AggregateFunction، می‌توان متد تجمعی مناسبی را جهت ستون جاری مشخص کرد.
- توسط متد MainTableEvents به بسیاری از رخدادهای داخلی PdfReport دسترسی خواهیم یافت. برای مثال اگر در اینجا رکوردی موجود نباشد، رخداد DataSourceIsEmpty صادر خواهد شد.
- به کمک متد Export، خروجی‌های دلخواه مورد نظر را می‌توان مشخص کرد. تعدادی خروجی، مانند اکسل، XML و CSV در این کتابخانه موجود است. امکان سفارشی سازی آن‌ها نیز پیش بینی شده است.
- و نهایتا توسط متد Generate مشخص خواهیم کرد که فایل گزارش کجا ذخیره شود.

 لطفا برای طرح مشکلات و سؤالات خود در رابطه با کتابخانه PdfReport از این قسمت سایت استفاده کنید.
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۲:۱۲
    ممنون آقای نصیری. من با توجه به مقالات گذشته شما در زمینه iTextSharp یک کتابخانه کوچک برای کارهای خودم تهیه کرده بودم ولی محدودیت‌ها و مشکلات زیادی داشت. با توجه به اینکه کیفیت pdf‌های سایت شما به نظرم خیلی خوب هستن تصمیم داشتم از شما درباره نحوه ساخت اونها سوال کنم که خودتون زحمتشو کشیدید. قصد دارم با اجازه شما این کتابخانه را جایگزین کنم. باز هم از شما ممنونم
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۲:۴۲
    بسیار بسیار ممنون و متشکر
    جدا برای گزارشات خصوصا در وب مشکل داشتم
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۵:۱۸
    ایول دارین آقای نصیری :دی ... از این حرکتتون لذت بردم :دی ... خدا اجرت بده :دی
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۶:۳۸
    ببخشید آقای نصیری آیا با استفاده از این کتابخانه می‌توان هر گزارشی را با هر شکلی طراحی کرد؟

    ممنونم
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۶:۵۳
      کلمات «هر گزارشی» و «هر شکلی» یعنی چی؟
      اگر «هر شکلی» منظور ساخت گزارشات نامنظم است، شاید این روش استفاده از قالب‌های open office بهتر باشد.
      • #
        ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۷:۰۴
        مثلاً بخواهیم هم از این مثالی که فرمودید با استفاده از open office پیاده سازی کردید استفاده کنم و در پایین صفحه یه جدول که به صورت یک Grid اطلاعات را نمایش دهد. مثلاً بخواهیم اطلاعات یک شخص را در بالای صفحه نمیش دهیم و در پایین صفحه تمام درخواست‌های آن کاربر را باید لیست کنیم در این حالت از کدام روش استفاده کنیم؟
        • #
          ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۷:۰۸
          - می‌تونید یک هدر سفارشی در PdfReport درست کنید. (چیزی که به همراه آن است یک هدر ساده همه منظوره است)
          - می‌تونید از قالب‌های AcroForm مربوط به Open Office در هدر Pdf Report استفاده کنید.
          این موارد رو در قسمت‌های بعدی توضیح می‌دم.
          • #
            ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۷:۱۰
            ممنونم استاد. پس من مشتاقانه منتظر این مطلبتون هستم. باز هم ممنونم
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۷:۳۰
    استاد نصیری ممنون از تمام زحماتی که می‌کشید؛ در حال حاضر جز تشکر چیزی از دستم بر نمیاد.
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۷:۳۵

    واقعا از زحماتتون تشکر میکنم

    خیلی مفید بود.

  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۱۳ مهر ۱۳۹۱، ساعت ۱۹:۴۷
    استاد خیلی ممنون واقعا شاهکاره.
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، جمعه ۱۴ مهر ۱۳۹۱، ساعت ۱۶:۰۱
    ممنون مهندس واقعا کار جالبی هست
    به نظرتون طراحی یه محیط Designer برای این کتابخانه هم میتونه خوب باشه
    اگه در این مورد موافق بودین من هم می‌تونم کمک کنم
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، جمعه ۱۴ مهر ۱۳۹۱، ساعت ۱۶:۴۸
      یکی از خوبی‌های کارهای سورس باز امکان مشارکت عموم برنامه نویس‌ها است. اگر علاقمند به مشارکت در آن بودید، می‌تونید وصله‌های خودتون رو در اینجا ارسال نمائید تا به پروژه یا مثال‌های آن اضافه شوند. با تشکر
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، شنبه ۱۵ مهر ۱۳۹۱، ساعت ۲۲:۱۵
    فوق العادست .
    خسته نباشید.
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۱۶ مهر ۱۳۹۱، ساعت ۰۲:۱۰
    مثل همیشه عالی
    تشکر فراوان دارم از شما
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۱۶ مهر ۱۳۹۱، ساعت ۰۳:۲۱
    ممنون آقای نصیری
    واقعا عالیه
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۲۰ مهر ۱۳۹۱، ساعت ۱۴:۱۴
    استاد من یک پروژه از نوع WebForms ایجاد کردم و سه کلاسی که شما در اینجا ایجاد کردید را عینن در پروژه ایجاد کردم ولی زمانی که پروژه را اجرا می‌کنم به خطای زیر بر می‌خورم


    • #
      ‫۱۱ سال و ۱۲ ماه قبل، پنجشنبه ۲۰ مهر ۱۳۹۱، ساعت ۱۴:۲۰
      - لطفا برای رفع مشکلات مرتبط با PdfReport از این قسمت سایت استفاده نمائید.
      - برای مشاهده خطای واقعی بر روی لینک view details (ذیل قسمت Actions تصویر فوق) کلیک کنید. در اینجا بهتر می‌توان بررسی کرد که مشکل اصلی چه چیزی بوده است. (ممکن است فونت مورد استفاده در مسیر برنامه شما نباشد، یا دسترسی write نداشته باشید، یا پوشه خروجی pdf در مسیر و ریشه برنامه شما ایجاد نشده (مطابق تنظیمات AppPath انتهای گزارش)، یا هر خطای دیگری که ریز آن در قسمت view details یاد شده، ذکر می‌شود)
       
  • #
    ‫۱۱ سال و ۱۱ ماه قبل، دوشنبه ۲۹ آبان ۱۳۹۱، ساعت ۱۹:۵۱
    اگر بخواهیم در قسمت Footer  گزارش(هر صفحه )، فقط از <hr/> و یک نوشته استفاده کنم باید از چه تنظیماتی استفاده کنم؟
    ممنون
    • #
      ‫۱۱ سال و ۱۱ ماه قبل، دوشنبه ۲۹ آبان ۱۳۹۱، ساعت ۲۰:۰۲
      لطفا برچسب PdfReport را در سایت بررسی کنید. به این موضوع پرداخته شده: (^)
  • #
    ‫۱۱ سال و ۹ ماه قبل، شنبه ۱۶ دی ۱۳۹۱، ساعت ۱۵:۲۴
    با سلام. آقای نصیری آیا می‌توان از pdf report در سیلورلایت استفاده کرد؟ با تشکر.
    • #
      ‫۱۱ سال و ۹ ماه قبل، شنبه ۱۶ دی ۱۳۹۱، ساعت ۱۶:۰۷
      بله (با استفاده از یک سرویس WCF). مثال‌های آن‌را دریافت کنید. مراجعه کنید به پوشه SLPdf آن جهت مشاهده یک نمونه آماده.
  • #
    ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۱۸ دی ۱۳۹۱، ساعت ۰۳:۴۹
    آقای نصیری .
    با سلام. من قصد دارم گزارشاتم را براساس pdf report ایجاد کنم ولی چند تا مشکل دارم. در صورت امکان راهنمایی کنید:
    1- آیا می‌شود محتوای فایل پی دی اف را درون سیلورلایت مثلاً در یک گرید یا یک بوردر  نمایش داد ؟
    2- حجم فایل خروجی در مثالی که شما برای دانلود قرار دادید 400 کیلوبایت بود. آیا می‌توان حجم آنرا پایین آورد؟
    3- در مثال شما حدود 20 ثانیه طول کشید تا گزارش ساخته شود. آیا می‌شود این زمان را کمتر کرد؟
    متشکرم از زحمات شما.
    • #
      ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۱۸ دی ۱۳۹۱، ساعت ۰۳:۵۹
      - نیاز به نمایش دهنده PDF نوشته شده با سیلورلایت دارید. یک سری کار تجاری از تلریک و امثال آن (^، ^) برای اینکار هست.
      - حجم فایل نهایی به اندازه کافی فشرده شده است. استفاده از تصاویر یا تعداد صفحات بالا، حجم را بیشتر خواهند کرد به همراه بالا بردن مدت زمان تولید فایل. همچنین یک سری پیوست/خروجی جانبی نیز به فایل اضافه می‌شوند، مانند خروجی اکسل، xml و csv. هر کدام از این‌ها را که مورد نیاز نیستند، در حین تهیه گزارش ذکر نکنید تا فایل نهایی حجم کمتری داشته باشد. بدیهی است تولید هر کدام نیز زمانی را به خود اختصاص خواهند داد.
      - مثالی که موجود بود را تست کردم حدود 1 ثانیه بیشتر طول نکشید؛ نه 20 ثانیه.
      روشی وجود دارد به نام warmup برای خیلی از کارهای دات نتی. در پشت صحنه سیستم، حین اجرای اولیه برنامه یک گزارش خالی را تولید کنید. به این صورت سیستم JIT دات نت مجبور خواهد شد سریعتر وارد عمل شود (نه در زمان نیاز). در دفعه بعد فراخوانی گزارشات، نتیجه کار بسیار سریع خواهد بود.
      • #
        ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۱۸ دی ۱۳۹۱، ساعت ۰۴:۱۱
        متشکرم از پاسخ شما.
        هنگام ساخته شدن گزارش بلافاصله پنجره دانلود باز می‌شود و درون فریم چیزی نمایش داده نمی‌شود، مشکل از کجاست؟
        با تشکر.
        • #
          ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۱۸ دی ۱۳۹۱، ساعت ۰۴:۱۳
          احتمالا دانلود منیجر شما طوری تنظیم شده که لینک‌های PDF را پیش از نمایش در مرورگر، ردیابی می‌کند.
        • #
          ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۰۳:۴۳
          اینجا راه حلش رو آقای نصیری رو توضیح دادند.
  • #
    ‫۱۱ سال و ۹ ماه قبل، پنجشنبه ۲۱ دی ۱۳۹۱، ساعت ۲۱:۰۰
    مهندس نصیری با سلام.
    می خواستم بایت تهیه pdfReport از شما تشکر کنم. 
    من در پروژه خودم از pdfReport استفاده کردم. بسیار هم راضی هستم. هم در سیلورلایت و هم در mvc. مزایای code first در ابتدا برایم غیرقابل قبول بود ولی الان code first انتخاب اول منه. همه جوره این کتابخانه عالیه. بسیار بسیار سپاس مهندس جان. یاعلی.
  • #
    ‫۱۱ سال و ۹ ماه قبل، شنبه ۲۳ دی ۱۳۹۱، ساعت ۱۹:۱۱
    درون سیلورلایت ، سورس فریم را به مسیر فایل پی دی اف (که توسط دستور AsPdfFile تولید می‌شود بوسیله WCF ) ست میکنم. امکان این وجود دارد که فایل بطور مستقیم درون فریم نمایش داده شود و در جایی ذخیره نشود؟
  • #
    ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۲ مرداد ۱۳۹۳، ساعت ۰۶:۳۳
    برچسب‌های summary، چگونه مقداردهی می‌شوند؟ و محل آنها چگونه تعیین می‌شود؟ به عبارت دیگر ارتباط متد MainTableSummarySettings با فیلدهای منبع داده متناظر چگونه است؟
    • #
      ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۲ مرداد ۱۳۹۳، ساعت ۱۴:۰۸
      - به صورت خودکار قبل از اولین ستونی که دارای AggregateFunction است ظاهر خواهند شد.
      - هچنین متدهای داخل MainTableSummarySettings دارای پارامترهای دیگری هم هستند (تک پارامتری نیستند) که بتوان توسط آن‌ها محل ظاهر شدن برچسب‌ها را صریحا مشخص کرد.
      • #
        ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۲ مرداد ۱۳۹۳، ساعت ۱۴:۴۹
        1- در صورتیکه چندین ستون عددی داشته باشیم و بخواهیم برای همه آنها برچسب‌های "نقل از صفحه قبل"، "جمع صفحه"، "جمع کل" داشته باشیم، چگونه امکان پذیر است؟
        2- آیا درست متوجه شدم که: جمع ستون دارای AggregateFunction، مقابل برچسب "جمع صفحه" درج می‌شود؟
        • #
          ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۲ مرداد ۱۳۹۳، ساعت ۱۵:۰۳
          - هر ستون عددی که در تعریف آن AggregateFunction درج و مشخص شود، به صورت خودکار دارای فیلدهای ته جمع خواهد بود.
          - برچسب‌ها هم فقط یکبار در هر ردیف مشخص می‌شوند به صورت خودکار (پیش فرض) یا حالت سفارشی که عنوان شد (مرسوم تمام گزارشات متداول به همین نحو است).
  • #
    ‫۹ سال و ۱۱ ماه قبل، دوشنبه ۱۹ آبان ۱۳۹۳، ساعت ۱۷:۰۳
    سلام، کدی نیاز دارم که فایل PDF رو در حافظه سرور درست کند نه در یک پوشه روی  سرور، و کاربر آن فایل رو دانلود کند. کلا این گزارشهایی که درست می‌کنم، واسه وب سایت میخوام.
    از لطف شما بسیار سپاس گزارم
  • #
    ‫۶ سال و ۱۰ ماه قبل، پنجشنبه ۴ آبان ۱۳۹۶، ساعت ۱۹:۲۱
    با تشکر؛ اگر بخواهیم از pdf report در برنامه‌های سازمانی استفاده کنیم با هر بار درخواست گزارش ،  یک نسخه فایل pdf در کلاینت‌ها دانلود می‌شود  ، و این به مرور باعث میشه فایل‌های زیادی در هر کلاینت بخاطر گزارش‌های مورد درخواستش ذخیره بشه . آیا این روش کار من  اشکالی داره؟ در حالت ویندوزی میشه یک فایل رو بازنویسی کرد و در پوشه اجرائی برنامه فقط یک فایل گزارش تولید میشه ولی در محیط وب  نتونستم راه حلی پیدا کنم ، اگر امکانش هست راهنمائی بفرمائید.
  • #
    ‫۵ سال و ۶ ماه قبل، یکشنبه ۱۲ اسفند ۱۳۹۷، ساعت ۱۴:۲۰
    با سلام; بنده در هنگام استفاده از فونت فارسی بعضی از کارکترهای خاص مثل "ء" (همزه)، آن‌ها را نمایش نمی‌دهد. مشکل از کجاست؟