میخواهیم
الف) یک Watermark قطری را بر روی تمام صفحات گزارش ظاهر کنیم.
ب) عددهای درصد پیشرفت یک ستون را به صورت میلهای نمایش دهیم.
ج) در هر صفحه بجای اینکه یک جدول، اطلاعات را نمایش دهد و تمام صفحه را پر کند، دو جدول در دو ستون کنار هم اینکار را انجام دهند تا در حین چاپ گزارش، در میزان تعداد صفحات مصرفی صرفه جویی صورت گیرد.
د) مقادیر true با چک مارک و موارد false با علامت ضربدر نمایش داده شوند.
یک چنین شکلی در نهایت مد نظر است:
روش انجام کار را توسط کتابخانه PdfReport در ادامه بررسی خواهیم کرد.
ابتدا کلاس مدل زیر را در نظر بگیرید:
namespace PdfReportSamples.Models { public class Task { public int Id { set; get; } public string Name { set; get; } public int PercentCompleted { set; get; } public bool IsActive { set; get; } } }
using System; using System.Collections.Generic; using System.Drawing; using iTextSharp.text; using PdfReportSamples.Models; using PdfRpt; using PdfRpt.Core.Contracts; using PdfRpt.Core.Helper; using PdfRpt.FluentInterface; namespace PdfReportSamples.ProgressReport { public class ProgressReportPdfReport { private IPdfFont getWatermarkFont() { var watermarkFont = new GenericFontProvider( AppPath.ApplicationPath + "\\fonts\\irsans.ttf", Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf"); watermarkFont.Color = BaseColor.LIGHT_GRAY; watermarkFont.Size = 50; return watermarkFont; } 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" }); doc.DiagonalWatermark(new DiagonalWatermark { Text = "نمایش درصد پیشرفت", RunDirection = PdfRunDirection.RightToLeft, Font = getWatermarkFont() }); }) .DefaultFonts(fonts => { fonts.Path(AppPath.ApplicationPath + "\\fonts\\irsans.ttf", Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf"); }) .PagesFooter(footer => { footer.DefaultFooter(PersianDate.ToPersianDateTime(DateTime.Now, "/", true)); }) .PagesHeader(header => { header.DefaultHeader(defaultHeader => { defaultHeader.Message("گزارش جدید ما"); defaultHeader.ImagePath(AppPath.ApplicationPath + "\\Images\\01.png"); }); }) .MainTableTemplate(template => { template.BasicTemplate(BasicTemplate.SilverTemplate); }) .MainTablePreferences(table => { table.ColumnsWidthsType(TableColumnWidthType.Relative); table.MultipleColumnsPerPage(new MultipleColumnsPerPage { ColumnsGap = 20, ColumnsPerPage = 2, ColumnsWidth = 250, IsRightToLeft = true, TopMargin = 7 }); }) .MainTableDataSource(dataSource => { var listOfRows = new List<Task>(); var rnd = new Random(); for (int i = 0; i < 400; i++) { listOfRows.Add(new Task { Id = rnd.Next(1000, 10000), Name = "Task" + i, PercentCompleted = rnd.Next(1, 100), IsActive = rnd.Next(0, 2) == 1 ? true : false }); } dataSource.StronglyTypedList<Task>(listOfRows); }) .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("ردیف", captionRotation: 90); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.Id); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(1); column.Width(2); column.HeaderCell("شماره فعالیت"); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.Name); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(2); column.Width(3); column.HeaderCell("فعالیت"); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.PercentCompleted); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(3); column.Width(3); column.HeaderCell("درصد پیشرفت"); column.ColumnItemsTemplate(template => { template.ProgressBar(progressBarColor: Color.SkyBlue, showPercentText: true); template.DisplayFormatFormula(obj => { if (obj == null) return "% 0"; return "% " + obj.ToString(); }); }); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.IsActive); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(4); column.Width(2); column.HeaderCell("در جریان"); column.ColumnItemsTemplate(template => { template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed); }); }); }) .MainTableEvents(events => { events.DataSourceIsEmpty(message: "There is no data available to display."); }) .Export(export => { export.ToExcel(); }) .Generate(data => data.AsPdfFile(AppPath.ApplicationPath + "\\Pdf\\ProgressReportSample.pdf")); } } }
توضیحات:
- همانطور که در کدهای فوق ملاحظه میکنید، برای تعریف یک watermark قطری در سراسر سند تولیدی، نیاز است در متد DocumentPreferences، تنظیمات DiagonalWatermark را مشخص کرد:
doc.DiagonalWatermark(new DiagonalWatermark { Text = "نمایش درصد پیشرفت", RunDirection = PdfRunDirection.RightToLeft, Font = getWatermarkFont() });
private IPdfFont getWatermarkFont() { var watermarkFont = new GenericFontProvider( AppPath.ApplicationPath + "\\fonts\\irsans.ttf", Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf"); watermarkFont.Color = BaseColor.LIGHT_GRAY; watermarkFont.Size = 50; return watermarkFont; }
- برای ستون بندی گزارش باید به متد MainTablePreferences رجوع نمود. در اینجا میتوان تنظیمات دقیق ستونهای گزارش را مشخص کرد:
table.MultipleColumnsPerPage(new MultipleColumnsPerPage { ColumnsGap = 20, ColumnsPerPage = 2, ColumnsWidth = 250, IsRightToLeft = true, TopMargin = 7 });
- برای نمایش درصد پیشرفت در یک سلول خاص تنها کافی است قالب مخصوص آنرا انتخاب و مقدار دهی کنیم:
column.ColumnItemsTemplate(template => { template.ProgressBar(progressBarColor: Color.SkyBlue, showPercentText: true); template.DisplayFormatFormula(obj => { if (obj == null) return "% 0"; return "% " + obj.ToString(); }); });
- نمایش چک مارک و علامت ضربدر نیز به همین منوال است. باید قالب مناسبی را برای آن انتخاب و اعمال کرد:
column.ColumnItemsTemplate(template => { template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed); });