Типы документов
Фиксированные документы – документы готовые для печати. Все
позиционирование в документе является фиксированным.
Потоковые документы – документ предназначен для просмотра на мониторе, 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"); } } } }