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

PrintDocument DrawString C# 换行问题相关推荐

  1. java drawstring 换行_java Graphics2D drawString()内容换行问题

    //字符串总宽度 private int getStringLength(Graphics g,String str) { char[] strcha=str.toCharArray(); int s ...

  2. 使用Graphics.DrawString如何实现textBox换行打印

    ---恢复内容开始--- 使用下面代码可以实现文本换行操作 using (Font font = new Font("方正黑体简体", 10F, FontStyle.Regular ...

  3. GDI+的DrawString多行、换行,自动换行

    代码来自GDIPlus::DrawString计算一定区域显示字符个数的问题-CSDN社区 直接复制到初始化GDI+代码后面就行,这是个内嵌的方法: 直接代码: auto fun_tradeno = ...

  4. C# TSC TE244 PrintDocument 固定资产哑银不干胶标签打印

    #region MyRegionprivate void ShowPrint(){ppvw.PrintPreviewControl.Zoom = 2.0; //显示比例为100%System.Draw ...

  5. C# PrintDocument 打印表格

    1.封装好的辅助类: 1 using System; 2 using System.Data; 3 using System.Drawing; 4 using System.Drawing.Print ...

  6. python回车换行怎么不行_解决pycharm回车之后不能换行或不能缩进的问题

    解决pycharm回车之后不能换行或不能缩进的问题 如果不小心按到键盘上的Insert键的话,光标显示的就不是一条竖线,而是一个类似方块的阴影区域,比如 插入一下insert键的介绍:它叫插入键,缩写 ...

  7. Java实现可换行文字转图片

    文章目录 需求来源 需求分析 效果展示 代码展示 后期功能 需求来源 由于微信公众号无法直接复制别人的文章转发,因为会被检测认为是相同的原创文章,所以很多公众号运营者就想到把文字转成图片来发文,这样系 ...

  8. C#.NET PrintDocument 自定义报表数据打印

    这是一个自定义的报表打印,是对PrintPreviewDialog的扩展和封装.PrintPreviewDialog是一个windows的打印预览控件,该类返回的就是一个PrintPreviewDia ...

  9. Java Graphics and 界面显示文字并换行

    问题是没有很好的换行 在调用时显示想处理的字符 Main,java public class Main {public static void main(String[] strings){Strin ...

最新文章

  1. 2020最大赢家!马斯克身家达1600亿美元,2张图拆解他的巨额财富
  2. 【总结】MTO/MTS操作步骤及月末结算
  3. Python列表排序 reverse、sort、sorted 操作方法详解
  4. 解析网上的XML文件
  5. abstract class和interface有什么区别
  6. C#调用bat 不显示DOS窗口,禁止DOS窗口一闪而过
  7. python永真循环_《Python语言程序设计》 —2.5.5 continue
  8. 安装Logstash
  9. 【转载】中国煤层气资源量
  10. Response.Write 用法总结
  11. RadASM配色方案工具fix
  12. python求excel的最大行_解决使用Pandas 读取超过65536行的Excel文件问题
  13. 自然语言处理工具之 HanLP 鸟瞰
  14. Mysql语句商城系统表案例
  15. js对内容进行编码(富文本编辑器使用居多)
  16. The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be reso site:blog.csdn.net
  17. 计算机本地用户名称怎么改win10系统,win10系统如何设置本地账户用户名
  18. 2023年报考CSM敏捷教练认证好不好?含金量高吗?
  19. 堆垛实训报告总结_叉车实训总结
  20. 【读书】你有认真看见过这个世界吗?

热门文章

  1. 学习方法——TRIZ创新理论中的40个发明原则(三)
  2. 硬件描述语言要用计算机吗,非过程计算机硬件描述语言
  3. 【WPS绘图】用PPT画立方八面体单晶
  4. 同济大学数理强化计算机,同济大学考研之学科设置介绍
  5. 【excel】几个公式任意增减提取单元格内容
  6. Zynq7000 IO分配
  7. android生成apk流程,Android Studio生成APK的基本流程
  8. 信号与系统陈后金matlab,陈后金信号与系统matlab实验4.pdf
  9. 通达信软件在哪个接口导入软件
  10. 见到了故事中的人,搜狗输入法之父:马占凯