Определение, где на странице flowdocument я печатаю, 'запустится' и 'закончится'

Я почти сделан с реализацией функциональности печати, но я испытываю затруднения при получении последнего препятствия, покончили.

Моя проблема, что я печатаю некоторые отчеты, состоя из заголовка (с информацией о человеке, который отчет о), нижний колонтитул (с номером страницы) и содержание в середине, которая является FlowDocument. Так как flowdocuments может быть довольно длинным, очень возможно, что они охватят несколько страниц.

Мой подход должен сделать пользовательский FlowDocumentPaginator, который происходит из DocumentPaginator.

Там я определяю свой заголовок и свой нижний колонтитул.

Однако, когда я печатаю свою страницу, flowdocument, и мой заголовок и нижний колонтитул друг на друге.

Таким образом, мой вопрос прост и прост - как я определяю от того, где и туда, где flowdocument часть на страницах будет помещена?

вот код от моего изготовленного на заказ 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;
    }
}

И вот вызов 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
    }
}
6
задан Chris J 20 February 2014 в 09:16
поделиться

1 ответ

Я нашел это сам - есть функция pagepadding, где я могу установить расстояние от четырех сторон бумаги :)

Довольно простое решение - я просто не знал, что искать

Пример:

Flowdocument fd = new FlowDocument();

fd.PagePadding = new Thickness(0.25,160,0.25,45);
6
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: