Definieren, wo auf der Seite das FlowDocument, das ich drucke, "beginnt" und "endet"

Ich bin fast fertig mit der Implementierung einer Druckfunktion, aber ich habe Probleme, die letzte Hürde zu überwinden.

Mein Problem ist, dass ich einige Berichte drucke, die aus einer Kopfzeile (mit Informationen über die Person, um die es in dem Bericht geht), einer Fußzeile (mit einer Seitenzahl) und dem Inhalt in der Mitte bestehen, der ein FlowDocument ist. Da die FlowDocuments ziemlich lang sein können, ist es sehr wahrscheinlich, dass sie sich über mehrere Seiten erstrecken.

ein Ansatz besteht darin, einen benutzerdefinierten FlowDocumentPaginator zu erstellen, der von DocumentPaginator abgeleitet is

ort definiere ich meine Kopf- und Fußzeil

Wenn ich jedoch meine Seite drucke, sind das Flussdokument und meine Kopf- und Fußzeile übereinander.

So ist meine Frage schlicht und einfach - wie definiere ich, wo und wohin der FlowDocument-Teil auf den Seiten platziert wird?

hier ist der Code von meinem Kunden Paginator:

public class HeaderedFlowDocumentPaginator : DocumentPaginator
{
    private DocumentPaginator flowDocumentpaginator;

    public HeaderedFlowDocumentPaginator(FlowDocument document)
    {
        flowDocumentpaginator = ((IDocumentPaginatorSource) document).DocumentPaginator;
    }

    public override bool IsPageCountValid
    {
        get { return flowDocumentpaginator.IsPageCountValid; }
    }

    public override int PageCount
    {
        get { return flowDocumentpaginator.PageCount; }
    }

    public override Size PageSize
    {
        get { return flowDocumentpaginator.PageSize;  }
        set { flowDocumentpaginator.PageSize = value; }
    }

    public override IDocumentPaginatorSource Source
    {
        get { return flowDocumentpaginator.Source; }
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        DocumentPage page = flowDocumentpaginator.GetPage(pageNumber);

        ContainerVisual newVisual = new ContainerVisual();
        newVisual.Children.Add(page.Visual);

        DrawingVisual header = new DrawingVisual();
        using (DrawingContext dc = header.RenderOpen())
        {
            //Header data
        }
        newVisual.Children.Add(header);

        DrawingVisual footer = new DrawingVisual();
        using (DrawingContext dc = footer.RenderOpen())
        {
            Typeface typeface = new Typeface("Trebuchet MS");
            FormattedText text = new FormattedText("Page " + (pageNumber + 1).ToString(), CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, 14, Brushes.Black);

            dc.DrawText(text, new Point(page.Size.Width - 100, page.Size.Height-30));
        }

        newVisual.Children.Add(footer);

        DocumentPage newPage = new DocumentPage(newVisual);
        return newPage;
    }
}

Und hier ist der Aufruf von printdialogue:

private void btnPrint_Click(object sender, RoutedEventArgs e)
{
    try
    {
        PrintDialog printDialog = new PrintDialog();
        if (printDialog.ShowDialog() == true)
        {
            FlowDocument fd = new FlowDocument();
            MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(<My string of text - RTF formatted>));

            TextRange tr = new TextRange(fd.ContentStart, fd.ContentEnd);
            tr.Load(stream, DataFormats.Rtf);

            stream.Close();
            fd.ColumnWidth = printDialog.PrintableAreaWidth;

            HeaderedFlowDocumentPaginator paginator = new HeaderedFlowDocumentPaginator(fd);

            printDialog.PrintDocument(paginator, "myReport");
        }
    }
    catch (Exception ex)
    {
        //Handle
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage