wpfprintingfixeddocumentdocumentpage

How to get FixedDocument from PageDocuments


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>

Solution

  • 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?