PrintDocument DrawString C# 换行问题

在使用 80mm 小票机 做 再次开发时  使用   DrawString 无法自动换行 导致文字被截断

终于找到解决方案:

    private void button_print_Click(object sender, EventArgs e)
        {
            PrintDocument pd = new PrintDocument();
            // 修改成自己的默认打印机名称
            pd.PrinterSettings.PrinterName = currentPrinter;//pd.DefaultPageSettings.PrinterSettings.PrinterName;//默认打印机
            pd.PrintPage += (object sender, PrintPageEventArgs e) =>
            {
                if (e.Graphics == null) { throw new NullReferenceException("e.Graphics 是空值"); }

                float rowWidth = 285.0F;

                // 字体高度
                float fontHeight = 16.0F;

                // 如果完全用字体高度来计算可能最后一行会有部分 显示不全 这里保底 留点间距
                float bottomMargin = fontHeight;

                //var drawStrings = new List<string>{
                //    "单层牛肉芝士汉堡 60元 * 1份",
                //    "牛油果鲜虾沙拉 60元 * 1份",
                //    "炭烤上脑心 19元 * 1份",
                //    "培根蛋黄通心粉 19元 * 1份",
                //    "芝士薯条 19元 * 1份",
                //    "时令水果 19元 * 1份",
                //     "无花果柑橘茶 19元 * 1份",
                //};

                //                var drawStrings = new List<string>{
                //"1、绝句二首 (其一)",
                //"(唐)杜甫",
                //"迟日江山丽,春风花草香。",
                //"泥融飞燕子,沙暖睡鸳鸯。",
                //"2、咏柳(唐)贺知章",
                //"碧玉妆成一树高,万条垂下绿丝绦。",
                //"不知细叶谁裁出,二月春风似剪刀。",
                //"3、江南春(唐)杜牧",
                //"千里莺啼绿映红,水村山郭酒旗风。",
                //"南朝四百八十寺,多少楼台烟雨中。",
                //"4、春兴(唐)武元衡",
                //"杨柳阴阴细雨晴,残花落尽见流莺。",
                //"春风一夜吹乡梦,又逐春风到洛城。",
                //"5、钱塘湖春行(唐)白居易",
                //"孤山寺北贾亭西,水面初平云脚低。",
                //"几处早莺争暖树,谁家新燕啄春泥。",
                //"乱花渐欲迷人眼,浅草才能没马蹄。",
                //"最爱湖东行不足,绿杨阴里白沙堤。",};



                var drawStrings = new List<string>{
               "<c>钱塘湖春行",
               "<c>(唐)白居易",
               "<b>孤山寺北贾亭西,水面初平云脚低。",
               "<b>几处早莺争暖树,谁家新燕啄春泥。",
               "<b>乱花渐欲迷人眼,浅草才能没马蹄。",
               "<b>最爱湖东行不足,绿杨阴里白沙堤。",
               "<r>打印时间:2023-04-07",};

                //string drawString = "赤尾发顺丰发大水发科内科解决了看看看就按时计费打发到灌砂法";
                System.Drawing.Font drawFont = new System.Drawing.Font("黑体", fontHeight);
                System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
                float x = 0F;
                float y = 0F;


                System.Drawing.StringFormat stringFormat = new System.Drawing.StringFormat();


                foreach (var item in drawStrings)
                {
                    var drawString = item;

                    // 是否加粗
                    if (drawString.Contains("<b>"))
                    {
                        drawFont = new System.Drawing.Font("黑体", fontHeight, FontStyle.Bold);
                        drawString = drawString.Replace("<b>", "");
                    }
                    else
                    {
                        drawFont = new System.Drawing.Font("黑体", fontHeight);
                    }

                    // 是否居中
                    if (drawString.Contains("<c>"))
                    {
                        stringFormat.Alignment = StringAlignment.Center;
                        drawString = drawString.Replace("<c>", "");
                    }// 是否居右
                    else if (drawString.Contains("<r>"))
                    {
                        stringFormat.Alignment = StringAlignment.Far;
                        drawString = drawString.Replace("<r>", "");
                    }
                    else
                    {
                        stringFormat.Alignment = StringAlignment.Near;
                    }



                    // 获取行高
                    var rowHeight = GetTrueHight(drawString, stringFormat, drawFont, e.Graphics, rowWidth, fontHeight) + bottomMargin;

                    RectangleF drawRect = new RectangleF(x, y, rowWidth, rowHeight);

                    e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect, stringFormat);

                    y += rowHeight;
                }
            };
            pd.Print();
        }

        /// <summary>
        /// 获取一段字符串完全打印需要的高度
        /// </summary>
        /// <param name="drawString"></param>
        /// <param name="stringFormat"></param>
        /// <param name="drawFont"></param>
        /// <param name="graphics"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        private float GetTrueHight(string drawString, StringFormat stringFormat, Font drawFont, Graphics graphics, float width, float height)
        {
            int chars; int lines;

            // 打印机范围 同 RectangleF 画布的 宽高
            SizeF layoutArea = new SizeF();
            layoutArea.Width = width;
            layoutArea.Height = height;

            // chars  在这个范围内实际会打印的字数
            // lines  在这个范围内实际会打印的行数
            // 得到的 chars 如果小于 drawString.length 说明 打印不全 需要增加高度(行) 再次尝试 直到 chars =  drawString.length 说明打印完整文字
            graphics.MeasureString(drawString, drawFont, layoutArea, stringFormat, out chars, out lines);

            Console.WriteLine($"chars:{chars}  lines:{lines}");

            if (chars < drawString.Length)
            {
                return GetTrueHight(drawString, stringFormat, drawFont, graphics, width, height += 25);
            }
            else
            {
                return height;
            }
        }

别忘了给我点赞,留言

源代码如下:立跑可用

        

链接:https://pan.baidu.com/s/1vywMUvGXMaFh_1o7ywDQTA?pwd=yyyy 
提取码:yyyy

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值