گزارشی را در نظر بگیرید با این نیازها:
میخواهیم
الف) یک 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()
});
در اینجا Text، متنی است که نمایش داده خواهد شد. تنظیم PdfRunDirection.RightToLeft برای نمایش صحیح متون فارسی الزامی است. همچنین این watermark نیاز به قلم مناسب و متفاوتی نسبت به قلمهای پیش فرض گزارش نیز دارد:
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;
}
قلمهایی از جنس IPdfFont را توسط کلاس توکار GenericFontProvider به نحوی که ملاحظه میکنید میتوان ایجاد کرد.
- برای ستون بندی گزارش باید به متد MainTablePreferences رجوع نمود. در اینجا میتوان تنظیمات دقیق ستونهای گزارش را مشخص کرد:
table.MultipleColumnsPerPage(new MultipleColumnsPerPage
{
ColumnsGap = 20,
ColumnsPerPage = 2,
ColumnsWidth = 250,
IsRightToLeft = true,
TopMargin = 7
});
برای مثال در اینجا 2 ستون در هر صفحه تعریف شده است (ColumnsPerPage). فاصله بین این ستونها 20 است (ColumnsGap). عرض هر ستون 250 درنظر گرفته شده (ColumnsWidth) و همچنین توسط تنظیم IsRightToLeft، سبب خواهیم شد تا جداول از راست به چپ شروع و در صفحه نمایش داده شوند. (اگر به شماره ردیفها در شکل ابتدای بحث دقت کنید، ردیف 1 در سمت راست صفحه قرار دارد).
- برای نمایش درصد پیشرفت در یک سلول خاص تنها کافی است قالب مخصوص آنرا انتخاب و مقدار دهی کنیم:
column.ColumnItemsTemplate(template =>
{
template.ProgressBar(progressBarColor: Color.SkyBlue, showPercentText: true);
template.DisplayFormatFormula(obj =>
{
if (obj == null) return "% 0";
return "% " + obj.ToString();
});
});
قالب از پیش تعریف شده ProgressBar، مقدار سلول جاری را دریافت و آنرا تبدیل به یک میله افقی درصد پیشرفت میکند. همچنین در اینجا توسط DisplayFormatFormula، یک علامت درصد هم به متنی که قرار است نمایش داده شود، اضافه کردهایم.
- نمایش چک مارک و علامت ضربدر نیز به همین منوال است. باید قالب مناسبی را برای آن انتخاب و اعمال کرد:
column.ColumnItemsTemplate(template =>
{
template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed);
});
قالب Checkmark نیز جزو قالبهای از پیش تعریف شده PdfReport است و بر اساس گرافیک برداری کار میکند.