WPF DocumentPaginator и неожиданно обрезка DocumentPage

Я пытаюсь напечатать холст WPF на нескольких страницах.

Я очень доволен, масштабируя его по ширине страницы, затем обрезая и переводя холст для каждой страницы; все довольно простые математики.

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

var capabilities = printDialog.GetPrintCapabilities(dialog.PrintTicket);

Возможности имеет следующие свойства:

capabilities.PageImageableArea.ExtentWidth
// "Gets the width of the imageable area"

Что такое "область изображения"? это та область на бумаге, в которую я могу поместить содержимое? Я так думаю, потому что:

capabilities.PageImageableArea.OriginWidth
// Gets the distance from the left edge of the page to the imageable area.

Однако как насчет нижней и правой полей? Где я могу найти эту информацию?

Что следует PageSize собственность DocumentPaginator быть установленным в? Должен ли я установить это от capabilities.PageImageableArea? Или dialog.Print() Функция установить это, и мне просто нужно прочитать из него в GetPage()?

Наконец, когда я возвращаю DocumentPageчто я передам три аргумента геометрии pageSize, bleedBox а также contentBox?

Спасибо:)

2 ответа

Решение

Хорошо, кажется, что печать всегда происходит из (0, 0) (вверху слева) бумаги.

Получите размер бумаги с:

printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight

а верхний и левый поля с:

var printCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
printCapabilities.PageImageableArea.OriginWidth, printCapabilities.PageImageableArea.OriginHeight

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

Вы должны масштабировать и обрезать холст, как обычно, затем применить TranslateTransform размер полей для перемещения содержимого в область печати.

Вы смотрели на использование FlowDocument вместо простой печати Canvas? Здесь есть хороший пример создания и печати.

Надеюсь, это сведет на нет необходимость много математики.

Другие вопросы по тегам