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