WPF DocumentPaginator и неожиданно обрезка DocumentPage - PullRequest
4 голосов
/ 07 июля 2010

Я пытаюсь напечатать холст 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 ]

4 голосов
/ 08 июля 2010

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

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

printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight

, а сверху и слеваполя с:

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

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

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

1 голос
/ 07 июля 2010

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

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

...