昨天突然接到任务,对接一下汉印的TP582打印机,打印机是USB接口的,使用起来很简单,所以画一下模板就行了。

    小票的打印需求比较简单,罗列一些收费的数据就可以了,数据通过掉接口获取,然后手动拼接成字符串,调用打印方法就可以了。实现方法记录一下,代码如下:

        /// <summary>
        /// 打印58mm收费小票
        /// </summary>
        /// <param name="printStr"></param>
        public void Print58(string printStr)
        {
            try
            {
                var printList = printStr.Split('\r', '\n').ToList();
                var rows = printList.Count(o => !string.IsNullOrEmpty(o));
                //打印预览
                // var previewDialog = new PrintPreviewDialog();
                var printDocument = new PrintDocument();
                //设置边距
                var margin = new Margins(1, 1, 10, 10);
                printDocument.DefaultPageSettings.Margins = margin;
                var height = (rows + 1) * 19;//计算高度(行数*行高)
                var pageSize = new PaperSize("First custom size", (int)(58 * 100 / 25.4), height);//58mm
                printDocument.DefaultPageSettings.PaperSize = pageSize;
                //打印事件设置
                printDocument.PrintPage += (a, b) =>
                {
                    var font = new Font("Arial", 8, FontStyle.Regular);//字体设置
                    var yLocation = b.MarginBounds.Y; //Y轴打印位置
                    foreach (var print in printList)
                    {
                        float heightStep = 0;
                        if (!string.IsNullOrEmpty(print))
                        {
                            var size = b.Graphics.MeasureString(print, font);
                            heightStep = size.Height * 1.3f;//1.3倍行间距
                            b.Graphics.DrawString(print, font, Brushes.Black, 0, yLocation);
                        }
                        yLocation += Convert.ToInt32(heightStep);
                    }
                    b.Graphics.DrawString(".", font, Brushes.Black, 0, yLocation); //多打一行,因为汉印打印机不打空白行
                };
                printDocument.Print();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "打印收据失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

    我这边的实现是把字符串用 \r\n 拼接,也就是换行符,然后传递给 Print58 这个方法。通过计算得到代码中的字体的行高差不多是 18.x 所幸就按照每行19算,每行可以写14个汉字,所以也要注意每行的字不要超出这个范围了。


遇到你之后,我才知道,原来这世间是如此的美好。