Exporting WPF Flexgrid to PDF
C1Flexgrid for WPF provides lot of flexibility in terms of exporting the data to various formats. In this blog, we look at the approach to export the grid data to PDF Format. PDF Export technique depends on the following two important things :
- GetPageImages method of C1Flexgrid
- Page Template
GetPageImages method returns a list of images that represent a paged view of the grid. These images can then be added to a collection and rendered to the PDF page. Page Template defines the layout of the Page to be rendered in the exported PDF. Following Code snippet defines the PDF Export :
// export the grid to a PDF file
void SavePdf(Stream s, string documentName)
{
// get root element to lay out the PDF pages
Panel root = null;
for (var parent = c1Flexgrid1.Parent as FrameworkElement; parent != null; parent = parent.Parent as FrameworkElement)
{
if (parent is Panel)
{
root = parent as Panel;
}
}
// create pdf document
var pdf = new C1PdfDocument(PaperKind.Letter, false);
// get page size
var rc = pdf.PageRectangle;
var m = new Thickness(96, 96, 96 / 2, 96 / 2);
var scaleMode = ScaleMode.ActualSize;
// create panel to hold elements while they render
var pageTemplate = new PageTemplate();
pageTemplate.Width = rc.Width;
pageTemplate.Height = rc.Height;
pageTemplate.SetPageMargin(m);
root.Children.Add(pageTemplate);
// render grid into PDF document
var sz = new Size(rc.Width - m.Left - m.Right, rc.Height - m.Top - m.Bottom);
var pages = c1Flexgrid1.GetPageImages(scaleMode, sz, 100);
for (int i = 0; i < pages.Count; i++)
{
// skip a page when necessary
if (i > 0)
{
pdf.NewPage();
}
// set content
pageTemplate.PageContent.Child = pages[i];
//pageTemplate.PageContent.Stretch = System.Windows.Media.Stretch.Uniform;
pageTemplate.PageContent.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
// set header/footer text
//pageTemplate.HeaderLeft.Text = documentName;
pageTemplate.FooterRight.Text = string.Format("Page {0} of {1}",
i + 1, pages.Count);
// measure page element
pageTemplate.Measure(new Size(rc.Width, rc.Height));
pageTemplate.UpdateLayout();
// add page element to PDF
pdf.DrawElement(pageTemplate, rc);
}
// done with template
root.Children.Remove(pageTemplate);
// save the PDF document
pdf.Save(s);
s.Close();
}
Refer to the attached samples for complete implementation. Download C# Sample Download VB Sample