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

Der*_*nch 6 c# printing wpf

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

然而,当视觉增长时,它将剪切图像并在星形打印机的卷筒上打印到一定大小,然后它只是切割而不打印图像的其余部分.

PrintDialog.PrintVisual(Grid1, "Test");
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

Der*_*nch 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");

    }

}
Run Code Online (Sandbox Code Playgroud)