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
, 、3つのジオメトリの引数に何を渡すことができますか pageSize
, bleedBox
と contentBox
?
ありがとう :)
解決
OK、印刷は常に発生しているようです (0, 0)
紙の(左上)。
紙のサイズを取得します:
printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight
そして、上部と左のマージン:
var printCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
printCapabilities.PageImageableArea.OriginWidth, printCapabilities.PageImageableArea.OriginHeight
私は、底部と右のマージンが上部と左と同じであると仮定しましたが、これは安全ではないかもしれません。
通常のようにキャンバスをスケーリングしてクリップする必要があります。 TranslateTransform
コンテンツを印刷可能な領域に移動するためのマージンのサイズ。
他のヒント
キャンバスを印刷するだけでなく、フロードキュメントを使用することを見ましたか?作成と印刷の良い例があります ここ.
うまくいけば、それが多くの数学の必要性を否定するでしょう。