WPF DocumentPaginator und Document unerwartetes Zuschneiden
-
02-10-2019 - |
Frage
Ich versuche, eine WPF-Leinwand über mehrere Seiten gedruckt werden sollen.
Ich bin vollkommen zufrieden damit die Skalierung auf die Seitenbreite passt, dann Clipping und übersetzen die Leinwand für jede Seite; alle ziemlich einfache Mathematik.
Was ich nicht verstehe, ist, wie ich die Abmessungen des Druckbereichs erhalten, und wie der Drucker sagen, wohin sie zu drucken. Was auch immer ich versuche, es erscheint die Werte Ich verwende die Größe des Papiers sind, und ich bekomme daher Zuschneiden auftritt als der Drucker kann nicht bis zum Rand des Papiers drucken.
var capabilities = printDialog.GetPrintCapabilities(dialog.PrintTicket);
Fähigkeiten haben die folgenden Eigenschaften:
capabilities.PageImageableArea.ExtentWidth
// "Gets the width of the imageable area"
Was ist die „bebilderbaren“ -Bereich? das ist der Bereich auf dem Papier, in dem ich zufrieden stellen kann? Ich denke, so, weil:
capabilities.PageImageableArea.OriginWidth
// Gets the distance from the left edge of the page to the imageable area.
Doch was ist mit den unteren und rechten Rand? Wo finde ich diese Informationen?
Was sollte die PageSize
Eigenschaft des DocumentPaginator
zu setzen? Sollte ich dies aus capabilities.PageImageableArea
? Oder hat die dialog.Print()
Funktion dieses gesetzt, und ich brauche nur von ihm in GetPage()
zu lesen?
Schließlich, wenn ich eine DocumentPage
zurückkehren, was passiere ich an die drei Geometrie Argumente pageSize
, bleedBox
und contentBox
?
Danke:)
Lösung
Ok es scheint, dass immer Druck von (0, 0)
auftritt (oben links) des Papiers.
Holen Sie sich die Größe des Papiers mit:
printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight
und die oberen und linken Ränder mit:
var printCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
printCapabilities.PageImageableArea.OriginWidth, printCapabilities.PageImageableArea.OriginHeight
ging ich davon aus, dass die unteren und rechten Ränder der gleiche wie der oben waren und nach links, obwohl dies nicht sicher sein kann.
Sie haben die Leinwand zu skalieren und Clip wie gewohnt, dann eine TranslateTransform
die Größe der Ränder gelten die Inhalte in auf den druckbaren Bereich zu bewegen.
Andere Tipps
Haben Sie sich das Drucken eines Flowdocument, anstatt nur die Leinwand zu verwenden? es ist ein gutes Beispiel für das Erstellen und Drucken von