4

複数のページに 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()ですか?

最後に、 を返すとき、3 つのジオメトリ引数、およびDocumentPageに何を渡しますか?pageSizebleedBoxcontentBox

ありがとう :)

4

2 に答える 2

4

印刷は常に(0, 0)用紙の (左上) から行われるようです。

用紙のサイズを取得するには:

printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight

および上と左の余白は次のとおりです。

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

これは安全ではないかもしれませんが、下と右の余白は上と左の余白と同じであると想定しました。

通常どおりにキャンバスを拡大縮小してクリップし、TranslateTransform余白のサイズを適用して、コンテンツを印刷可能な領域に移動する必要があります。

于 2010-07-08T10:48:01.600 に答える
1

Canvas を印刷するだけでなく、FlowDocument を使用することを検討しましたか? ここに作成して印刷する良い例があります。

うまくいけば、それは多くの数学の必要性を否定するでしょう.

于 2010-07-07T12:55:17.300 に答える