6

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

但是,当视觉效果变大时,它会剪切图像并在 Star 打印机的卷筒上打印到特定尺寸,然后它只是剪切而不打印图像的其余部分。

PrintDialog.PrintVisual(Grid1, "Test");

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

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

在此处输入图像描述

我还注意到它打印的尺寸始终是最大高度 = A4 页面的高度。问题是如何让它打印超过 A4 的高度(当我从打印机首选项打印测试文档时,它能够做到这一点)。

4

3 回答 3

9

好的,我使用以下课程解决了这个问题。基本上我把我想打印的东西放在一个滚动查看器里面,然后在里面放一个堆栈面板,然后把这个堆栈面板传递给我的打印助手,它现在打印而不剪裁:

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

    }

}
于 2013-10-23T23:32:32.030 回答
1

您正在使用 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

于 2013-02-27T16:37:59.970 回答
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,我认为这很容易使用。

请注意,我使用此方法来呈现UIElement在 XAML 中创建的内容,它都是在代码中以StackPanelas root element制作的。

于 2013-11-15T11:39:37.300 回答