Ich versuche, von einer C# -WPF-Anwendung aus auf einen ungewöhnlichen Drucker (BIXOLON SPP-R200III) zu drucken. Die Breite dieser Papierrolle des Druckers ist 58mm, wie mit einem Lineal gemessen und wie in dem Windows-Druckdialogfeld angezeigt:Seitenbreite passt nicht Papiergröße im Windows-Druckdialog
Allerdings, wenn ich versuche, diesen Drucker zu verbinden und verhören seine Fähigkeiten über die System.Printing
APIs in .NET Framework, bekomme ich eine andere Papierbreite.
Der folgende Code aufzählt Druckwarteschlangen und findet die richtige:
const string printQueueName = @"BIXOLON SPP-R200III";
PrintServer printServer = new PrintServer();
PrintQueue printQueue = null;
PrintQueueCollection printQueues = printServer.GetPrintQueues();
foreach (PrintQueue queue in printQueues)
{
if (String.Equals(queue.FullName, printQueueName, StringComparison.CurrentCultureIgnoreCase))
{
printQueue = queue;
break;
}
}
Dieser Code abfragt, seine Fähigkeiten:
PrintTicket defaultTicket = printQueue.DefaultPrintTicket;
PrintCapabilities printCapabilities = printQueue.GetPrintCapabilities(defaultTicket);
double pageWidth = (printCapabilities.OrientedPageMediaWidth.Value/96.0) * 25.4;
Aber das Ergebnis, pageWidth
ist 48,047 und nicht 58mm wie erwartet! (PrintCapabilities.OrientedPageMediaWidth
ist 181.59496062992128.)
Ich habe auch versucht, die Standard-Ticket Struktur selbst zu suchen, aber printQueue.DefaultPrintTicket.PageMediaSize.Width
hat den gleichen Wert von 181.59496062992128.
Schließlich habe ich versucht, die System.Windows.Controls.PrintDialog
mit dem folgenden Code zu verwenden:
PrintDialog printDialog = new PrintDialog();
printDialog.PrintQueue = printQueue;
printDialog.ShowDialog();
double pageWidth = (printDialog.PrintTicket.PageMediaSize.Width.Value/96.0) * 25.4;
Und ich habe das gleiche Ergebnis.
Warum ist das? Warum stimmen diese Breiten nicht überein? Ändere ich falsch von Punkten in Millimeter? Missverstehe ich die Druckerfunktionen vollständig?
Was ist der richtige Weg, um die Papiergröße zu finden, die von einem Drucker unterstützt wird, wie es im Screenshot oben in dieser Frage gezeigt wird?
ich darüber dachte aber 'PrintCapabilities.PageBorderlessCapability' ist eine leere Sammlung und' 'printQueue.DefaultPrintTicket.PageBorderless' ist null', wie' printDialog.PrintTicket.PageBorderless'. Dies bedeutet, dass der Drucker das randlose Drucken nicht unterstützen kann, aber es gibt keinen Hinweis darauf, was der Rand tatsächlich ist. Meine Frage steht noch. – Xharlie
Ein kleiner Vogel sagt mir, dass es 5 mm ist. –
Überprüfen Sie die OriginWidth und OriginHeight der PageImageableArea. – Clemens