MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как правильно печатать из коллекции документ?"
Answer 1072363
Обязательно в наличии иметь электронный документ такой как например:doc чтобы корректно напечатать или можно напечатать нормально из контейнера ItemsControl?
Напечатать элемент UI "как есть" может и можно, но это не лучший путь. Качественно на страницы не разбить. См. например: Есть ли возможность разрыва таблицы DataGrid WPF для разделения её на несколько таблиц
Вместо этого лучше сформировать документ для печати специальными средствами API System.Windows.Documents. Например как-то так для коллекции, состоящей из изображения и текстовой строки:
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Documents; namespace WpfApp1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } const string path = "C:\\Test\\Images\\test.jpg"; public static FlowDocument CreateDocument(List<Foo> list) { FlowDocument fd = new FlowDocument(); Table t; TableCell cell; TableRow trow; foreach (Foo item in list) { //добавим таблицу из одной строки t = new Table(); t.Columns.Add(new TableColumn()); t.Columns.Add(new TableColumn()); trow = new TableRow(); //первый столбец - изображение cell = new TableCell(new Paragraph(new InlineUIContainer(item.Img))); trow.Cells.Add(cell); //второй столбец-строка cell = new TableCell(new Paragraph(new Run(item.Name))); trow.Cells.Add(cell); var rows = new TableRowGroup(); t.RowGroups.Add(rows); rows.Rows.Add(trow); fd.Blocks.Add(t); } return fd; } private void Window_Loaded(object sender, RoutedEventArgs e) { } private void Button_Click(object sender, RoutedEventArgs e) { List<Foo> items = new List<Foo>(); //сгенерируем тестовые данные for (int i = 0; i < 100; i++) { Image img = new Image(); img.Source = new BitmapImage(new Uri(path)); img.Height = 100; items.Add(new Foo { Img = img, Name = "item " + i.ToString() }); } //создадим документ FlowDocument fd = CreateDocument(items); PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { //зададим параметры страницы fd.PageHeight = printDialog.PrintableAreaHeight; fd.PageWidth = printDialog.PrintableAreaWidth; fd.PagePadding = new Thickness(25); fd.ColumnGap = 0; fd.ColumnWidth = (fd.PageWidth - fd.PagePadding.Left - fd.PagePadding.Right); //печать IDocumentPaginatorSource dps = fd; printDialog.PrintDocument(dps.DocumentPaginator, "My document"); } } } public class Foo { public Image Img { get; set; } public string Name { get; set; } } }
Так выглядит результат (при печати на тестовом принтере, сохраняющем в PDF):
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.