2013-02-27 2 views
6

Я печатаю визуальное изображение в WPF на принтере квитанции (Star TSP 700II). Когда визуальное изображение маленькое, оно прекрасное, и оно хорошо печатается.WPF PrintVisual на принтере квитанции обрезает изображение

Однако, когда изображение растет, оно будет обрезать изображение, и оно печатает на определенном размере на рулоне в принтере Star, а затем оно просто разрезается без печати оставшейся части изображения.

PrintDialog.PrintVisual(Grid1, "Test"); 

Я пытался настроить страницу PageMediaSize, но это ничего не меняет на распечатке.

Интересно, когда я печатаю в Microsoft XPS Document Writer, сохраненный файл имеет полное изображение.

enter image description here

Я также заметил, что размер его печатает на всегда максимальная высота = высота страницы А4. Вопрос в том, как заставить его печатать за высоту A4 (когда я печатаю тестовый документ из настроек принтера, он может это сделать).

+6

Ваш штрих-код является полностью читаемым. – AgentFire

+0

В любом случае, только с тестового сервера, так что на самом деле это не важно (спасибо за головы, хотя). – DermFrench

ответ

8

Хорошо, я решил это используя следующий класс. В принципе я ставлю то, что я хочу, чтобы напечатать внутри ScrollViewer и положить StackPanel внутри, что, а затем передать эту StackPanel в мой помощник печати и печатает без обрезки:

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

Спасибо за этот ответ, он защищает мой день. Я пробовал все остальное, но проигнорировал метод PrintVisual. –

0

Вы используете PrintDialog.PrintVisual, который должен только напечатать то, что вы можете видеть. Для многостраничных результатов вам нужно будет сделать больше.

Вы можете попробовать DocumentPaginator http://msdn2.microsoft.com/en-us/library/system.windows.documents.documentpaginator.aspx

или

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

+0

, когда я печатаю визуально и выбираю Microsoft XPS Document Writer, он печатает отлично, я не думаю, что проблема в том, что я не вижу визуального изображения, так как я вижу весь экран на экране, кажется, что принтер перед печатью все это. – DermFrench

1

Последние несколько дней я также имел эту проблему.

Решение заключается в рендеринге корневого элемента в памяти.

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

Затем создайте новый PaperSize для принтера использовать:

Вы должны проверить настройки срезанных вашего принтера (например использовать 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"); 

Это работает как прелесть для меня и сэкономит мне много кода.

Как получение принтера не нужно pagination, я думаю, что это очень просто использовать.

Обратите внимание, что я НЕ использовать этот метод для рендеринга UIElement создан в XAML, все это сделано в коде с StackPanel как корневой элемент.

+0

Я на самом деле печатал визуальный (так что я не думаю, что могу принять это как ответ)? – DermFrench

+0

Разве это не то же самое? Кстати, вам это не нужно, это просто для справок в будущем, если кто-то сталкивается с этой проблемой, потому что я думаю, что это самый простой способ печати, если вам не нужна 'pagination';) – DeMama

+0

Возможно, это одно и то же, но так как другой работает, мы, вероятно, не будем его тестировать, и он также разбивается на страницы (в случае, если пользователь решит распечатать на принтере A4), я знаю, что это не было в исходном вопросе, но кажется хорошим побочным эффектом для ответ я принял). – DermFrench

Смежные вопросы