本地报告收据打印

本文关键字:打印 报告 | 更新日期: 2023-09-27 18:09:52

我正在使用LocalReport打印一个3英寸的收据,代码来自"演练:打印没有预览的本地报告"

有些打印机需要DeviceInfo PageWidth为8.5英寸才能正常工作,有些则需要3.0英寸。报告似乎被拉长了,填错了页码。我试过调整报告纸张大小和打印机纸张大小,但似乎不能得到正确的组合。

有人经历过吗?

本地报告收据打印

我明白了。你需要考虑打印机的dpi

获取打印机默认页面设置:

        PrinterSettings ps = new PrinterSettings();
        ps.PrinterName = printerName;
        this.defaultPageSettings = ps.DefaultPageSettings;

用info:

构建DeviceInfo Xml
    private string BuildDeviceInfo()
    {
        StringBuilder returnValue;
        System.Xml.XmlWriter writer;
        returnValue = new StringBuilder(1024);
        writer = System.Xml.XmlWriter.Create(returnValue);
        writer.WriteStartElement("DeviceInfo");
        writer.WriteElementString("OutputFormat", "EMF");
        if (defaultPageSettings != null)
        {
            // DPI will keep the output from scaling in weird ways
            writer.WriteElementString("PrintDpiX", defaultPageSettings.PrinterResolution.X.ToString());
            writer.WriteElementString("PrintDpiY", defaultPageSettings.PrinterResolution.Y.ToString());
            writer.WriteElementString("PageWidth", (defaultPageSettings.PaperSize.Width / 100m).ToString("F2") + "in");
            writer.WriteElementString("PageHeight", (defaultPageSettings.PaperSize.Height / 100m).ToString("F2") + "in");
       }
        writer.Close();
        return returnValue.ToString();
    }

这对我很有效。我正在从WPF应用程序打印到STAR TSP100收据打印机。当我设置边距&我自己打印出来的页码很大,但是当我计算了最小页边距和页码大小,并根据打印机的默认设置设置了dpi后,收据打印正确了。

我用这个来计算最小边距:(H/T http://www.dreamincode.net/forums/topic/135864-printing-with-minimum-margins-specified-by-the-printer/)

Dim minimumMarginLeft, minimumMarginRight, minimumMarginTop,
 minimumMarginBottom As Single
minimumMarginLeft = PrintDialog1.PrinterSettings.DefaultPageSettings.PrintableArea.Left
minimumMarginRight = PrintDialog1.PrinterSettings.DefaultPageSettings.PaperSize.Width - _
                                  PrintDialog1.PrinterSettings.DefaultPageSettings.PrintableArea.Right
minimumMarginTop = PrintDialog1.PrinterSettings.DefaultPageSettings.PrintableArea.Top
minimumMarginBottom =  PrintDialog1.PrinterSettings.DefaultPageSettings.PaperSize.Height - _
                                      PrintDialog1.PrinterSettings.DefaultPageSettings.PrintableArea.Bottom

-I figured this out. You need to account for the printer dpi.
-Get the Printer Default Page Settings:
        PrinterSettings ps = new PrinterSettings();
        ps.PrinterName = printerName;
        this.defaultPageSettings = ps.DefaultPageSettings; The Build the DeviceInfo Xml with that info:
    private string BuildDeviceInfo()
    {
        StringBuilder returnValue;
        System.Xml.XmlWriter writer;
        returnValue = new StringBuilder(1024);
        writer = System.Xml.XmlWriter.Create(returnValue);
        writer.WriteStartElement("DeviceInfo");
        writer.WriteElementString("OutputFormat", "EMF");
        if (defaultPageSettings != null)
        {
            // DPI will keep the output from scaling in weird ways
            writer.WriteElementString("PrintDpiX", defaultPageSettings.PrinterResolution.X.ToString());
            writer.WriteElementString("PrintDpiY", defaultPageSettings.PrinterResolution.Y.ToString());
            writer.WriteElementString("PageWidth", (defaultPageSettings.PaperSize.Width / 100m).ToString("F2") + "in");
            writer.WriteElementString("PageHeight", (defaultPageSettings.PaperSize.Height / 100m).ToString("F2") + "in");
       }
        writer.Close();
        return returnValue.ToString();
    }