You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
6.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Globalization;
namespace Utils.Printers
{
public class PrinterUtil
{//TODO:改为文字受宽度限制:即当文字超长时,截断超长部分
/// <summary>
/// 绘制文字(打印用)
/// </summary>
/// <param name="startPoint">文字左上角的起始坐标(不是文字的实际坐标,实际坐标还受到左边距和行距的影响)</param>
/// <param name="dc">DrawingContext</param>
/// <param name="text">文字</param>
/// <param name="fontSize">字的大小</param>
/// <param name="textLeftMargin">左边距。文字最左侧的距起始坐标左侧的距离</param>
/// <param name="lineDistance">行距</param>
/// <param name="typeFace">Typeface</param>
/// <param name="nextLineY">下一行文字的起始Y坐标位置</param>
/// <returns>文字最右上角的坐标</returns>
public static Point DrawText(Point startPoint, DrawingContext dc, string text, double fontSize, double textLeftMargin, double lineDistance, Typeface typeFace, out double nextLineY)
{
var ft = GetFormattedText(text, typeFace, fontSize);
double textHeight;
if (string.IsNullOrEmpty(text))
textHeight = GetFormattedText("龙", typeFace, fontSize).Height;
else
textHeight = ft.Height;
dc.DrawText(ft, new Point(startPoint.X + textLeftMargin, startPoint.Y + lineDistance / 2));
nextLineY = startPoint.Y + lineDistance + textHeight;
return new Point(startPoint.X + ft.Width + textLeftMargin, startPoint.Y);
}
/// <summary>
/// 绘制文字(打印用)
/// </summary>
/// <param name="startPoint">文字左上角的起始坐标(不是文字的实际坐标,实际坐标还受到左边距和行距的影响)</param>
/// <param name="dc">DrawingContext</param>
/// <param name="text">文字</param>
/// <param name="fontSize">字的大小</param>
/// <param name="lineDistance">行距</param>
/// <param name="typeFace">Typeface</param>
/// <param name="nextLineY">下一行文字的起始Y坐标位置</param>
/// <returns>文字最右上角的坐标</returns>
public static Point DrawText(Point startPoint, DrawingContext dc, string text, double fontSize, double lineDistance, Typeface typeFace, out double nextLineY)
{
return DrawText(startPoint, dc, text, fontSize, 0, lineDistance, typeFace, out nextLineY);
}
/// <summary>
/// 绘制文字(打印用)
/// </summary>
/// <param name="startPoint">文字左上角的起始坐标(不是文字的实际坐标,实际坐标还受到左边距和行距的影响)</param>
/// <param name="dc">DrawingContext</param>
/// <param name="text">文字</param>
/// <param name="fontSize">字的大小</param>
/// <param name="lineDistance">行距</param>
/// <param name="typeFace">Typeface</param>
/// <returns>文字最右上角的坐标</returns>
public static Point DrawText(Point startPoint, DrawingContext dc, string text, double fontSize, double lineDistance, Typeface typeFace)
{
double nextLineY;
return DrawText(startPoint, dc, text, fontSize, 0, lineDistance, typeFace, out nextLineY);
}
/// <summary>
/// 绘制带框的文字(打印用)
/// </summary>
/// <param name="startPoint">框的左上角的坐标</param>
/// <param name="dc">DrawingContext</param>
/// <param name="text">文字</param>
/// <param name="fontSize">字的大小</param>
/// <param name="typeFace">Typeface</param>
/// <param name="rectangleWidth">框的宽度</param>
/// <param name="rectangleThickness">框的粗细</param>
/// <param name="textLeftMargin">文字左侧到框的距离</param>
/// <param name="lineDistance">行距</param>
/// <param name="nextLineY">框的底线的Y坐标</param>
/// <returns>框的右上角坐标</returns>
public static Point DrawTextWithRectangle(Point startPoint, DrawingContext dc, string text, double fontSize, Typeface typeFace, double rectangleWidth, double rectangleThickness, double textLeftMargin, double lineDistance, out double nextLineY)
{
var rightPoint = DrawText(startPoint, dc, text, fontSize, textLeftMargin, lineDistance, typeFace, out nextLineY);
dc.DrawRectangle(null, new Pen(Brushes.Black, rectangleThickness), new Rect(startPoint.X, startPoint.Y, rectangleWidth, nextLineY - startPoint.Y));
return new Point(startPoint.X + rectangleWidth, startPoint.Y);
}
/// <summary>
/// 绘制带框的文字(打印用)
/// </summary>
/// <param name="startPoint">框的左上角的坐标</param>
/// <param name="dc">DrawingContext</param>
/// <param name="text">文字</param>
/// <param name="fontSize">字的大小</param>
/// <param name="typeFace">Typeface</param>
/// <param name="rectangleWidth">框的宽度</param>
/// <param name="rectangleThickness">框的粗细</param>
/// <param name="textLeftMargin">文字左侧到框的距离</param>
/// <param name="lineDistance">文字顶部到框的距离</param>
/// <returns>框的右上角坐标</returns>
public static Point DrawTextWithRectangle(Point startPoint, DrawingContext dc, string text, double fontSize, Typeface typeFace, double rectangleWidth, double rectangleThickness, double textLeftMargin, double lineDistance)
{
double nextLineY;
return DrawTextWithRectangle(startPoint, dc, text, fontSize, typeFace, rectangleWidth, rectangleThickness, textLeftMargin, lineDistance, out nextLineY);
}
/// <summary>
/// 按指定样式格式化字符
/// </summary>
public static FormattedText GetFormattedText(string text, Typeface typeFace, double fontSize)
{
return new FormattedText(text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeFace, fontSize, Brushes.Black);
}
/// <summary>
/// 获取文字的宽度
/// </summary>
/// <param name="charCount">文字个数</param>
/// <param name="fontSize">字号</param>
/// <param name="typeFace">Typeface</param>
/// <returns>文字的宽度</returns>
public static double GetWidth(int charCount, double fontSize, Typeface typeFace)
{
string text = string.Empty;
for (int i = 0; i < charCount; i++)
text += "字";
var ft = GetFormattedText(text, typeFace, fontSize);
return ft.Width;
}
}
}