gpt4 book ai didi

c# - 在 C# WPF 中编写漂亮的收据以在热敏打印机 POS 上打印

转载 作者:可可西里 更新时间:2023-11-01 03:00:11 24 4
gpt4 key购买 nike

我正在尝试在我的一个项目中实现打印功能,但我不太擅长这种工作。

我已经连接到我的热敏打印机并写入/打印相同的样本。现在我正在尝试找到一些方法来设计我的收据,使其看起来像来自附加图像的收据。

我有一些想法,但我不确定它们是否适用于这种工作,其中之一是尝试将我的收据格式化为 html 并将它们渲染为 html,如位图(图像),然后打印它,我已经试过了,但看起来我的质量有所下降。

如果有人对我如何使收据看起来像图片有任何其他想法,请与我分享此信息,我将非常感激。

这是我已经为打印一些示例所做的,我使用 graphics.DrawString 进行格式化,但我认为使用它我无法完成太多工作。

public void Print()
{
var doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(ProvideContent);
doc.Print();
}

public void ProvideContent(object sender, PrintPageEventArgs e)
{
Graphics graphics = e.Graphics;
Font font = new Font("Courier New", 10);

float fontHeight = font.GetHeight();

int startX = 0;
int startY = 0;
int Offset = 20;

e.PageSettings.PaperSize.Width = 50;
graphics.DrawString("Welcome to MSST", new Font("Courier New", 8),
new SolidBrush(Color.Black), startX, startY + Offset);
Offset = Offset + 20;

graphics.DrawString("Ticket No:" + "4525554654545",
new Font("Courier New", 14),
new SolidBrush(Color.Black), startX, startY + Offset);
Offset = Offset + 20;


graphics.DrawString("Ticket Date :" + "21/12/215",
new Font("Courier New", 14),
new SolidBrush(Color.Black), startX, startY + Offset);

Offset = Offset + 20;
String underLine = "------------------------------------------";

graphics.DrawString(underLine, new Font("Courier New", 14),
new SolidBrush(Color.Black), startX, startY + Offset);

Offset = Offset + 20;
String Grosstotal = "Total Amount to Pay = " + "2566";

Offset = Offset + 20;
underLine = "------------------------------------------";
graphics.DrawString(underLine, new Font("Courier New", 14),
new SolidBrush(Color.Black), startX, startY + Offset);
Offset = Offset + 20;

graphics.DrawString(Grosstotal, new Font("Courier New", 14),
new SolidBrush(Color.Black), startX, startY + Offset);

}

enter image description here

最佳答案

在过去这样做时,我将收据分成单独的部分,使用不同的字体或对齐方式,例如页眉、正文、页脚。

我使用以下类布局来封装我的打印文本定义。(你从哪里获得字体以及如何管理它的生命周期取决于你)

public class PrintText
{
public PrintText(string text, Font font) : this(text, font, new StringFormat()) {}

public PrintText(string text, Font font, StringFormat stringFormat)
{
Text = text;
Font = font;
StringFormat = stringFormat;
}

public string Text { get; set; }

public Font Font { get; set; }

/// <summary> Default is horizontal string formatting </summary>
public StringFormat StringFormat { get; set; }
}

当有较长的文本列表使用相同的字体和填充时,使用 stringbuilder 来构建您的文本会让生活变得轻松,因此您只需检查代码就可以直观地了解它的外观。

如果你有静态文本,你可以把它们放在一起:

var sb = new StringBuilder();
sb.AppendLine("Start of receipt");
sb.AppendLine("================");
sb.AppendLine("Item 1");
sb.AppendLine("Item 2");
sb.AppendLine("================");

或者如果数据有点动态传递给一些对象,你可以遍历并附加你的格式化文本:

private class ReceiptItem
{
public string Name { get; set; }

public decimal Cost { get; set; }

public int Amount { get; set; }

public int Discount { get; set; }

public decimal Total { get { return Cost * Amount; } }
}
const int FIRST_COL_PAD = 20;
const int SECOND_COL_PAD = 7;
const int THIRD_COL_PAD = 20;

var sb = new StringBuilder();
sb.AppendLine("Start of receipt");
sb.AppendLine("================");

foreach (var item in receiptItems)
{
sb.Append(item.Name.PadRight(FIRST_COL_PAD));

var breakDown = item.Amount > 0 ? item.Amount + "x" + item.Cost : string.Empty;
sb.Append(breakDown.PadRight(SECOND_COL_PAD));

sb.AppendLine(string.Format("{0:0.00} A", item.Total).PadLeft(THIRD_COL_PAD));

if (item.Discount > 0)
{
sb.Append(string.Format("DISCOUNT {0:D2}%", item.Discount).PadRight(FIRST_COL_PAD + SECOND_COL_PAD));
sb.Append(string.Format("{0:0.00} A", -(item.Total / 100 * item.Discount)).PadLeft(THIRD_COL_PAD));
sb.AppendLine();
}
}

sb.AppendLine("================");

输出如下:

Start of receipt
================
Joes Food 1x10 10.00 A
DISCOUNT 10% -1.00 A
Fun Facts 1x20 20.00 A
DISCOUNT 15% -3.00 A
Bag of Sand 7x40 280.00 A
================

使用前面的 PrintText 类,我们可以存储格式良好的字符串构建器输出

var printText = new PrintText(sb.ToString(), new Font("Monospace Please...", 8));

最后在尝试绘制字符串时使用它

var layoutArea = new SizeF(AvailableWidth, 0);
SizeF stringSize = g.MeasureString(printText.Text, printText.Font, layoutArea, printText.StringFormat);

RectangleF rectf = new RectangleF(new PointF(), new SizeF(AvailableWidth, stringSize.Height));

g.DrawString(printText.Text, printText.Font, Brushes.Black, rectf, printText.StringFormat);

如果文本打印不正确,您还可以尝试一些不同的图形调整,例如:

g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;

关于c# - 在 C# WPF 中编写漂亮的收据以在热敏打印机 POS 上打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com