Pregunta

Estoy casi hecho con la implementación de una funcionalidad de impresión, pero estoy teniendo problemas para conseguir el último obstáculo hecho con.

Mi problema es que estoy imprimiendo algunos informes, que consiste en una cabecera (con información sobre la persona que trata el informe), un pie de página (con un número de página) y el contenido en el medio, que es un FlowDocument. Desde los flowdocuments pueden ser bastante largo, es muy posible que van a abarcar varias páginas.

Mi enfoque es hacer una FlowDocumentPaginator a medida que se deriva de DocumentPaginator.

En no defino mi cabecera y mi pie de página.

Sin embargo, cuando imprimo mi página, el FlowDocument y mi cabecera y el pie están encima de otro.

Así que mi pregunta es simple y llanamente - ¿Cómo definir desde dónde y hacia donde se colocará la parte FlowDocument en las páginas

?

aquí está el código de mi Paginator custommade:

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;
    }
}

Y aquí está la llamada 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
    }
}
¿Fue útil?

Solución

Lo encontré a mí mismo - hay una función llamada pagepadding, donde puedo ajustar la distancia desde los cuatro lados del papel:)

solución bastante fácil - Yo no sabía qué buscar

Ejemplo:

Flowdocument fd = new FlowDocument();

fd.PagePadding = new Thickness(0.25,160,0.25,45);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top