Документы и печать WPF

Типы документов

Фиксированные документы – документы готовые для печати. Все
позиционирование в документе является фиксированным.

Потоковые документы – документ предназначен для просмотра на мониторе, WPF может компоновать содержимое документа динамически.

Типы элементов содержимого

Блочные элементы – применяются для группирования других элементов. Например: Paragraph.

Встроенные элементы – содержат данные, которые будут находится в блочном элементе. Например: Run.

Встроенные элементы содержимого

  • Run – содержит обычный текст.
  • Span — Заключает в себе любое количество встроенных элементов
  • содержимого.
  • Bold, Italic, Underline – применение форматов.
  • Hyperlink – создание ссылки.
  • LineBreak – добавление разрыва строки внутри блочного элемента.
  • InlineUIConteiner – подобен BlockUIElement используется для добавления элементов которые наследуются от класса UIElement
  • Floater, Figure – позволяет создавать плавающие блоки содержимого с текстом, изображением и прочим. Большинство свойств Figure не будут работать в контейнере FlowDocumentScrollViewer

Контейнеры потоковых документов

  • FlowDocumentScrollViewer – контейнер с линией прокрутки, он не поддерживает разбиение на страницы или отображение в несколько колонок.
  • FlowDocumentPageViewer – разбивает содержимое документа на страницы.
  • FlowDocumentReader – комбинирует два предыдущих контейнера и обладает функцией поиска.

Методы для печати

Для печати используется два метода:

  • PrintVisual() печать объектов производных от класса Visual.
  • PrintDocument() печать потоковых документов.

Пример использования PrintDocument

using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace PrintFlowDocument
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void cmdPrint_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog printDialog = new PrintDialog();
            if (printDialog.ShowDialog() == true)
            {
                // для печати потоковых документов используется метод PrintDocument
                printDialog.PrintDocument(((IDocumentPaginatorSource)docReader.Document).DocumentPaginator, "A Flow Document");
            }
        }

        private void cmdPrintCustom_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog printDialog = new PrintDialog();
            if (printDialog.ShowDialog() == true)
            {
                FlowDocument doc = docReader.Document;

                // Сохранить все существующие настройки.                               
                double pageHeight = doc.PageHeight;
                double pageWidth = doc.PageWidth;
                Thickness pagePadding = doc.PagePadding;
                double columnGap = doc.ColumnGap;
                double columnWidth = doc.ColumnWidth;

                // Подгоняем размеры FlowDocument под размеры страницы для печати
                doc.PageHeight = printDialog.PrintableAreaHeight;
                doc.PageWidth = printDialog.PrintableAreaWidth;
                doc.PagePadding = new Thickness(50);

                // Применяем две колонки.
                doc.ColumnGap = 25; // Пробелы между колонками.
                doc.ColumnWidth = (doc.PageWidth - doc.ColumnGap
                    - doc.PagePadding.Left - doc.PagePadding.Right) / 2;

                printDialog.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "A Flow Document");

                // Возобновляем старые настройки.
                doc.PageHeight = pageHeight;
                doc.PageWidth = pageWidth;
                doc.PagePadding = pagePadding;
                doc.ColumnGap = columnGap;
                doc.ColumnWidth = columnWidth;
            }
        }
    }
}


 

Пример использования PrintVisual

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace PrintCustomVisual
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void cmdPrint_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog printDialog = new PrintDialog();
            if (printDialog.ShowDialog() == true)
            {
                // Создание DrawingVisual для рисования.
                DrawingVisual visual = new DrawingVisual();

                // Получения DrawingContext
                using (DrawingContext dc = visual.RenderOpen())
                {
                    Pen pen = new Pen(Brushes.Black, 1);
                    Rect rect = new Rect(printDialog.PrintableAreaWidth / 2 - 50, 
                        printDialog.PrintableAreaHeight / 2 - 50, 100, 100);
                    dc.DrawRectangle(Brushes.Black, pen, rect);
                }

                // Печать
                printDialog.PrintVisual(visual, "A Custom-Printed Page");
            }

        }
    }
}

 

Обновлено: 30.04.2021 — 16:59

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.