Сам себе генератор отчётов. Выводим содержимое окна WPF на принтер

Вывод на печать различных бланков и форм документов востребован во многих программах.

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

Современные генераторы отчётов обладают мощным и гибким функционалом, но к сожалению, они не всегда доступны. Например, вследствие того, что среда разработки не имеет в своём составе генератора отчётов или его функционал не отвечает требованиям проекта, а приобретение генераторов отчётов сторонних разработчиков связано с большими затратами или не оправдано так как их возможности будут использоваться лишь в незначительной степени.

Как поступить в подобной ситуации?

Ответ на этот вопрос во многом зависит от платформы на которой выполняется разработка. Но, в случае .NET писать свой генератор отчётов или скрепя сердце тратить огромные суммы на сторонние продукты не обязательно потому что в роли генератора отчётов вполне может выступить и сам фреймворк WPF.

Дело в том, что в WPF поддерживает вывод элементов XAML на печать в том виде, в котором они отображаются в работающей программе.

Рассмотрим следующий пример. Допустим есть окно, в котором отображается макет визитной карточки и эту карточку требуется распечатать.

Код его разметки на XAML:

Для печати содержимого окна используется обычный PrintDialog, а точнее его метод PrintVisual. Этот метод принимает два параметра: элемент, который нужно напечатать и название задания напечатать, которое будет отображаться в очереди печати Windows в виде строки (строка может быть пустой).

PrintDialog dialog = new PrintDialog();
dialog.PrintVisual(this.card, "Визитная карточка");

Важно отметить, что при вызове метода PrintVisual диалоговое окно не отображается и задание на печать сразу же отправляется на принтер по умолчанию.

Для того чтобы получить возможность подтвердить или отказаться от печати или выбрать нужный принтер следует предварительно воспользоваться методом ShowDialog, как показано ниже.

PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == true)
{
    dialog.PrintVisual(this.card, "Визитная карточка");
}

Поддерживается вывод как на обычный, так и на виртуальный принтер.

Для печати вовсе не обязательно, чтобы элемент относился непосредственно к окну. Он может находиться на пользовательском элементе управления и т.д.

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

Поэтому используя XAML для создания макетов печатных форм, можно легко обойтись и без стороннего генератора отчётов реализовав требуемый функционал стандартными средствами.

Комментарии
  1. Спасибо за отличную статью с примером создания простейшего отчёта средствами WPF.

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

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