2013-02-27 51 views
6

Tôi đang in một hình ảnh trong WPF tới một máy in biên lai (Star TSP 700II). Khi hình ảnh nhỏ, nó là tốt và nó in được.WPF PrintVisual trên máy in hóa đơn đang cắt hình ảnh

Tuy nhiên khi hình ảnh phát triển nó sẽ cắt hình ảnh và nó in với kích thước nhất định trên cuộn trong máy in Sao và sau đó nó chỉ cắt mà không cần in phần còn lại của hình ảnh.

PrintDialog.PrintVisual(Grid1, "Test"); 

Tôi đã thử điều chỉnh PageMediaSize nhưng điều đó không thay đổi bất kỳ thứ gì trên bản in.

Thú vị khi tôi in tới Microsoft XPS Document Writer tệp đã lưu có hình ảnh đầy đủ.

enter image description here

Tôi cũng nhận thấy kích thước nó in luôn là tối đa height = chiều cao của một trang A4. Câu hỏi là làm cách nào để tôi in nó qua độ cao của A4 (khi tôi in tài liệu thử nghiệm từ các tùy chọn máy in, nó có thể thực hiện việc này).

+6

Mã vạch của bạn hoàn toàn có thể đọc được. – AgentFire

+0

Chỉ có một máy chủ thử nghiệm của nó, do đó, không thực sự quan trọng (cảm ơn cho người đứng đầu lên mặc dù). – DermFrench

Trả lời

8

Ok tôi đã giải quyết vấn đề này bằng cách sử dụng lớp học sau. Về cơ bản tôi đặt những gì tôi muốn in bên trong một ScrollViewer và đặt một stackpanel bên trong, sau đó vượt qua stackpanel này để helper in của tôi và bây giờ in mà không cần cắt:

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

Cảm ơn câu trả lời này, nó bảo vệ ngày của tôi. Tôi đã thử tất cả những thứ khác nhưng bỏ qua phương pháp PrintVisual. –

0

Bạn đang sử dụng PrintDialog.PrintVisual chỉ được phép in những gì bạn có thể thấy. Đối với kết quả nhiều trang, bạn sẽ cần phải làm nhiều hơn nữa.

Bạn có thể thử các DocumentPaginator http://msdn2.microsoft.com/en-us/library/system.windows.documents.documentpaginator.aspx

hoặc

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

+0

khi tôi in hình ảnh và chọn Microsoft XPS Document Writer nó in tốt, tôi không nghĩ rằng vấn đề là tôi không thể nhìn thấy hình ảnh, như tôi có thể nhìn thấy tất cả các hình ảnh trên màn hình, máy in dường như cắt giấy trước khi in tất cả. – DermFrench

1

Vài ngày qua tôi cũng có vấn đề này.

Giải pháp là hiển thị phần tử gốc trong bộ nhớ.

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(); 

Sau đó tạo một papersize mới cho máy in sử dụng:

Bạn nên kiểm tra các thiết lập cắt của máy in của bạn (ví dụ sử dụng chế độ cắt Receipt).

// 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"); 

Điều này làm việc như một sự quyến rũ đối với tôi và đã lưu cho tôi nhiều mã.

Vì máy in biên lai không cần pagination, tôi nghĩ điều này rất dễ sử dụng.

Lưu ý rằng tôi KHÔNG sử dụng phương pháp này cho rendering một UIElement tạo ra trong XAML, tất cả đều thực hiện trong mã với một StackPanel như phần tử gốc.

+0

Tôi đã thực sự in một hình ảnh (vì vậy tôi không nghĩ rằng tôi có thể chấp nhận điều này như là một câu trả lời)? – DermFrench

+0

Không phải như vậy? Btw bạn không phải làm, nó chỉ là để tham khảo trong tương lai nếu ai đó gặp phải vấn đề này, bởi vì tôi nghĩ đó là cách dễ nhất để in nếu bạn không cần 'pagination';) – DeMama

+0

Nó có lẽ chỉ giống nhau, nhưng vì cái kia hoạt động, chúng ta có lẽ sẽ không bận tâm kiểm tra nó, và nó cũng phân trang quá (trong trường hợp người dùng quyết định in sang máy in A4 - tôi biết rằng không có trong câu hỏi gốc nhưng có vẻ là một tác dụng phụ tốt cho tôi đã chấp nhận). – DermFrench

Các vấn đề liên quan