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
PrintDocument DrawString C# 换行问题相关推荐
- java drawstring 换行_java Graphics2D drawString()内容换行问题
//字符串总宽度 private int getStringLength(Graphics g,String str) { char[] strcha=str.toCharArray(); int s ...
- 使用Graphics.DrawString如何实现textBox换行打印
---恢复内容开始--- 使用下面代码可以实现文本换行操作 using (Font font = new Font("方正黑体简体", 10F, FontStyle.Regular ...
- GDI+的DrawString多行、换行,自动换行
代码来自GDIPlus::DrawString计算一定区域显示字符个数的问题-CSDN社区 直接复制到初始化GDI+代码后面就行,这是个内嵌的方法: 直接代码: auto fun_tradeno = ...
- C# TSC TE244 PrintDocument 固定资产哑银不干胶标签打印
#region MyRegionprivate void ShowPrint(){ppvw.PrintPreviewControl.Zoom = 2.0; //显示比例为100%System.Draw ...
- C# PrintDocument 打印表格
1.封装好的辅助类: 1 using System; 2 using System.Data; 3 using System.Drawing; 4 using System.Drawing.Print ...
- python回车换行怎么不行_解决pycharm回车之后不能换行或不能缩进的问题
解决pycharm回车之后不能换行或不能缩进的问题 如果不小心按到键盘上的Insert键的话,光标显示的就不是一条竖线,而是一个类似方块的阴影区域,比如 插入一下insert键的介绍:它叫插入键,缩写 ...
- Java实现可换行文字转图片
文章目录 需求来源 需求分析 效果展示 代码展示 后期功能 需求来源 由于微信公众号无法直接复制别人的文章转发,因为会被检测认为是相同的原创文章,所以很多公众号运营者就想到把文字转成图片来发文,这样系 ...
- C#.NET PrintDocument 自定义报表数据打印
这是一个自定义的报表打印,是对PrintPreviewDialog的扩展和封装.PrintPreviewDialog是一个windows的打印预览控件,该类返回的就是一个PrintPreviewDia ...
- Java Graphics and 界面显示文字并换行
问题是没有很好的换行 在调用时显示想处理的字符 Main,java public class Main {public static void main(String[] strings){Strin ...
最新文章
- 2020最大赢家!马斯克身家达1600亿美元,2张图拆解他的巨额财富
- 【总结】MTO/MTS操作步骤及月末结算
- Python列表排序 reverse、sort、sorted 操作方法详解
- 解析网上的XML文件
- abstract class和interface有什么区别
- C#调用bat 不显示DOS窗口,禁止DOS窗口一闪而过
- python永真循环_《Python语言程序设计》 —2.5.5 continue
- 安装Logstash
- 【转载】中国煤层气资源量
- Response.Write 用法总结
- RadASM配色方案工具fix
- python求excel的最大行_解决使用Pandas 读取超过65536行的Excel文件问题
- 自然语言处理工具之 HanLP 鸟瞰
- Mysql语句商城系统表案例
- js对内容进行编码(富文本编辑器使用居多)
- The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be reso site:blog.csdn.net
- 计算机本地用户名称怎么改win10系统,win10系统如何设置本地账户用户名
- 2023年报考CSM敏捷教练认证好不好?含金量高吗?
- 堆垛实训报告总结_叉车实训总结
- 【读书】你有认真看见过这个世界吗?