I am working with printing in WPF.
I implement a class which inherit from DocumentPaginator
class
public class ReportPaginator : DocumentPaginator
{
private double pageUpperLimit;
private double pageDownLimit;
private Model.Report printedReport;
private int pageCount;
public override IDocumentPaginatorSource Source
{
get
{
return null;
}
}
public override bool IsPageCountValid
{
get { return true; }
}
public override int PageCount
{
get { return pageCount; }
}
public override Size PageSize
{
get
{
return new Size(printedReport.PageSize.Width, printedReport.PageSize.Height);
}
set
{
// validate the value.
if (value != null)
{
throw new ArgumentException("page size can not be null");
}
// TODO: here we have to validate if the page is A3, A4, A5. this is to set the SizeName.
// if you did not set the sizeName here we will get an exception.
printedReport.PageSize = new Model.PageSize { Height = value.Height, Width = value.Width };
CalculatesPage();
// if we have to set the PageSize (I do not think so), do not forget to call the PaginateData method.
}
}
public ReportPaginator( Model.Report report)
{
printedReport = report;
CalculatesPage();
}
public override DocumentPage GetPage(int pageNumber)
{
// validate the argument.
if (pageNumber < 0)
{
throw new ArgumentException("pageNumber parameter could not be negative number", "pageNumber");
}
// if the argument is outside of the available pages, return
if (pageNumber > pageCount - 1)
{
return DocumentPage.Missing;
}
// specify the start pixel and end pixel of the page according to the height of the report.
pageUpperLimit = pageNumber * PageSize.Height;
pageDownLimit = (pageNumber + 1) * PageSize.Height;
// create DrawingVisual for this DocumentPage
DrawingVisual visual = new DrawingVisual();
// get the DrawingContext for this DrawingVisual for this page.
using (DrawingContext pageContext = visual.RenderOpen())
{
// drawing operations for elements and sections go here.
// we will use the for loop instead of the foreach loop to enumerate the sections
// because we will need the know in which section we draw.
for (int sectionIndex = 0; sectionIndex < printedReport.Sections.Count; sectionIndex++)
{
PrintSection(pageContext, sectionIndex);
foreach (Model.BaseReportControl control in printedReport.Sections[sectionIndex].Controls)
{
PrintControl(pageContext, sectionIndex, control);
}
}
} // close the DrawingContext.
return new DocumentPage(visual);
}
}
there is more helper methods to do the jobs.
I want to create FixedDocument
object to return it from the Source
property
using DocumentPage
object that returned from GetPage
Method.
I need a FixedDocument
to be returned from the source Property
Because I want to make a preview to the File before printing
ReportPreviewerWindow window = new ReportPreviewerWindow();
window.previewer.Document = new ReportPaginator(printedSurface.ModelReport).Source;
window.ShowDialog();
the previewer is DocumentViewer
Object exists in the ReportPreviewerWindow
<Window x:Class="TanmiaGrp.Report.Designer.ReportPreviewerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Report Previewer" >
<Grid>
<DocumentViewer x:Name="previewer"/>
</Grid>
</Window>
After I asked this question I found something worked very correctly for me. if you have problem like the described above please refer this link
How to Print Preview when using a DocumentPaginator to print?