2013-02-27 10 views
6

Ich drucke ein Visual in WPF auf einen Belegdrucker (Star TSP 700II). Wenn die visuelle klein ist, ist es in Ordnung und es druckt in Ordnung.WPF PrintVisual auf Quittungsdrucker ist Clipping Bild

Wenn jedoch das visuelle Bild wächst, wird das Bild abgeschnitten und auf der Rolle im Star-Drucker auf eine bestimmte Größe gedruckt, und dann schneidet es einfach, ohne den Rest des Bildes zu drucken.

PrintDialog.PrintVisual(Grid1, "Test"); 

Ich habe versucht, die PageMediaSize Einstellung, aber das ändert sich nichts auf dem Ausdruck.

Interessant, wenn ich auf Microsoft XPS Document Writer drucke, hat die gespeicherte Datei das vollständige Bild.

enter image description here

Ich habe auch die Größe bemerkt es druckt immer maximale Höhe = Höhe einer A4-Seite. Frage ist, wie ich es über die Höhe eines A4 zu drucken (wenn ich ein Testdokument aus den Druckereinstellungen drucken kann, ist es in der Lage, dies zu tun).

+6

Ihr Barcode ist vollständig lesbar. – AgentFire

+0

Es ist sowieso nur von einem Testserver, also ist es nicht wirklich wichtig (danke für die Köpfe hoch). – DermFrench

Antwort

8

Ok Ich löste dies mit folgenden Klasse. Grundsätzlich Ich habe, was ich in einem Scroll drucken möchten, und setzen ein Stackpanel innen, dass dann diese Stackpanel zu meinen Druck Helfer übergeben und er druckt jetzt ohne Clipping:

public static class PrintHelper 
{ 

    public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog) 
    { 
     var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket); 
     var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight); 
     var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight); 
     var fixedDoc = new FixedDocument(); 
     //If the toPrint visual is not displayed on screen we neeed to measure and arrange it 
     toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize)); 
     // 
     var size = toPrint.DesiredSize; 
     //Will assume for simplicity the control fits horizontally on the page 
     double yOffset = 0; 
     while (yOffset < size.Height) 
     { 
      var vb = new VisualBrush(toPrint) 
      { 
       Stretch = Stretch.None, 
       AlignmentX = AlignmentX.Left, 
       AlignmentY = AlignmentY.Top, 
       ViewboxUnits = BrushMappingMode.Absolute, 
       TileMode = TileMode.None, 
       Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height) 
      }; 
      var pageContent = new PageContent(); 
      var page = new FixedPage(); 
      ((IAddChild)pageContent).AddChild(page); 
      fixedDoc.Pages.Add(pageContent); 
      page.Width = pageSize.Width; 
      page.Height = pageSize.Height; 
      var canvas = new Canvas(); 
      FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth); 
      FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight); 
      canvas.Width = visibleSize.Width; 
      canvas.Height = visibleSize.Height; 
      canvas.Background = vb; 
      page.Children.Add(canvas); 
      yOffset += visibleSize.Height; 
     } 
     return fixedDoc; 
    } 

    public static void ShowPrintPreview(FixedDocument fixedDoc) 
    { 
     var wnd = new Window(); 
     var viewer = new DocumentViewer(); 
     viewer.Document = fixedDoc; 
     wnd.Content = viewer; 
     wnd.ShowDialog(); 
    } 

    public static void PrintNoPreview(PrintDialog printDialog,FixedDocument fixedDoc) 
    { 
     printDialog.PrintDocument(fixedDoc.DocumentPaginator, "Test Print No Preview"); 

    } 

} 
+0

Danke für diese Antwort, es sichert meinen Tag. Ich habe alle anderen Dinge versucht, aber die PrintVisual-Methode ignoriert. –

0

Sie verwenden PrintDialog.PrintVisual, das nur drucken soll, was Sie sehen können. Bei mehrseitigen Ergebnissen müssten Sie mehr tun.

könnten Sie versuchen, die DocumentPaginator http://msdn2.microsoft.com/en-us/library/system.windows.documents.documentpaginator.aspx

oder

PrintDialog.PrintDocument http://msdn2.microsoft.com/en-us/library/system.windows.controls.printdialog.printdocument.aspx.

+0

wenn ich Visual drucken und wählen Sie den Microsoft XPS Document Writer druckt es gut, ich glaube nicht, das Problem ist, dass ich nicht das Visuelle sehen kann, wie ich alle visuellen auf dem Bildschirm sehen kann, scheint der Drucker zu schneiden Papier, bevor es alles ausdruckt. – DermFrench

1

Die letzten Tage habe ich auch dieses Problem hatte.

Die Lösung bestand darin, das Stammelement im Speicher zu rendern.

PrintDialog dlg = new PrintDialog(); 

// Let it meassure to the printer's default width 
// and use an infinity height 
Grid1.Meassure(new Size(dlg.PrintableAreaWidth, double.PositiveInfinity)); 

// Let it arrange to the meassured size 
Grid1.Arrange(new Rect(Grid1.DesiredSize)); 

// Update the element 
Grid1.UpdateLayout(); 

Dann eine neue Papiergröße erstellen für den Drucker zu verwenden:

Sie sollten Ihren Drucker Cut-Einstellungen überprüfen (z verwenden Receipt Schneidemodus).

// Create a new papersize with the printer's default width, and the Grids height 
dlg.PrintTicket.PageMediaSize 
= new PageMediaSize(dlg.PrintableAreaWidth, Grid1.ActualHeight); 

// Let's print ! 
dlg.PrintVisual(Grid1, "blah"); 

Das funktioniert wie ein Charme für mich und ersparte mir viel Code.

Als Beleg Drucker brauchen nicht pagination, ich denke, das ist sehr einfach zu bedienen.

Bitte beachte, dass ich diese Methode nicht verwenden zur Wiedergabe eines UIElement in XAML erstellt, es ist alles in Code mit einer StackPanel als Wurzelelement gemacht.

+0

Ich habe tatsächlich ein Bild gedruckt (also glaube ich nicht, dass ich dieses als Antwort akzeptieren kann)? – DermFrench

+0

Ist das nicht das Gleiche? Btw müssen Sie nicht, es ist nur für die zukünftige Referenz, wenn jemand anderes auf dieses Problem stößt, weil ich denke, es ist der einfachste Weg zu drucken, wenn Sie keine Paginierung benötigen;) – DeMama

+0

Es ist wahrscheinlich genau das gleiche, aber da der andere funktioniert, werden wir wahrscheinlich nicht versuchen, es zu testen, und es paginiert auch (falls Benutzer sich entscheidet, auf A4 Drucker zu drucken - ich weiß, dass das nicht in der ursprünglichen Frage war, aber scheint ein guter Nebeneffekt zu sein Antwort akzeptiere ich). – DermFrench