WPF DocumentPaginator и DocumentPage Неожиданная обрезка
-
02-10-2019 - |
Вопрос
Я пытаюсь распечатать холст 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
?
Спасибо :)
Решение
Хорошо, кажется, что печать всегда происходит от (0, 0)
(сверху слева) бумаги.
Получите размер бумаги с:
printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight
и верхняя и левая поля с:
var printCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
printCapabilities.PageImageableArea.OriginWidth, printCapabilities.PageImageableArea.OriginHeight
Я предположил, что дно и правые поля были такими же, как топ и слева, хотя это может не быть в безопасности.
Вы должны масштабировать и заправить холст, как обычно, тогда примените TranslateTransform
Размер ваших краев для перемещения содержимого в зону для печати.
Другие советы
Вы смотрели, используя FlowDocument вместо того, чтобы просто печатать холст? Есть хороший пример создания и печати Здесь.
Надеюсь, что бы отрицать необходимость в масштабе математики.