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? Здесь есть хороший пример создания и печати.
Надеюсь, это сведет на нет необходимость много математики.