收据打印机上的WPF PrintVisual是剪切图像

时间:2013-02-27 16:32:50

标签: c# wpf printing

我正在将WPF中的视觉效果打印到收据打印机(Star TSP 700II)。 当视觉很小时它很好并打印好。

然而,当视觉效果增长时,它会剪切图像,并在星形打印机的卷筒上打印到一定的尺寸,然后只剪切而不打印图像的其余部分。

PrintDialog.PrintVisual(Grid1, "Test");

我尝试过调整PageMediaSize,但这并没有改变打印输出上的任何内容。

有趣的是,当我打印到Microsoft XPS Document Writer时,保存的文件具有完整的图像。

enter image description here

我还注意到它打印的尺寸总是最大高度= A4页面的高度。 问题是如何让它打印超过A4的高度(当我从打印机首选项打印测试文档时,它能够执行此操作)。

3 个答案:

答案 0 :(得分:9)

好的我用下面的课解决了这个问题。基本上我把我想要打印的内容放在一个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");

    }

}

答案 1 :(得分: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();

然后为打印机创建一个新的纸张大小:

您应该检查打印机的剪切设置(例如使用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,我认为这很容易使用。

请注意,我 NOT 使用此方法呈现在XAML中创建的UIElement,它都是在代码中以StackPanel为根元素

答案 2 :(得分: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