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