2017-08-25 14 views
0

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

Printer Settings for the BIXOLON SPP-R200III

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?

Antwort

1

Da gibt es so genannte "bildbare Fläche", die immer kleiner ist als die physikalischen Abmessungen des Blattes. Wahrscheinlich kann Ihr Drucker nicht direkt am Rand des Blattes drucken. Sie können sicherstellen, indem Sie die PrintCapabilities.PageBorderlessCapability Property überprüfen.

Siehe diesen Link: https://msdn.microsoft.com/en-us/library/system.printing.printcapabilities.pageborderlesscapability(v=vs.110).aspx

meisten Laser- und Tintenstrahldrucker randlosen Druck nicht unterstützen. Sie müssen einen unbedruckten Rand zulassen, um zu verhindern, dass Toner auf die Teile des Druckers gelangt, die das Papier bewegen. Viele Fotodrucker unterstützen jedoch den randlosen Druck. Wenn der Drucker randlosen Druck nicht unterstützt, ist die Sammlung leer.

+0

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

+1

Ein kleiner Vogel sagt mir, dass es 5 mm ist. –

+0

Überprüfen Sie die OriginWidth und OriginHeight der PageImageableArea. – Clemens