我正在使用 WPF 进行打印。
我实现了一个从类继承的DocumentPaginator
类
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);
}
}
有更多的辅助方法来完成这些工作。
我想创建FixedDocument
对象以使用从方法返回的对象从Source
属性中返回它。DocumentPage
GetPage
我需要FixedDocument
从源属性返回一个因为我想在打印之前对文件进行预览
ReportPreviewerWindow window = new ReportPreviewerWindow();
window.previewer.Document = new ReportPaginator(printedSurface.ModelReport).Source;
window.ShowDialog();
预览器是DocumentViewer
对象存在于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>