在C#WPF中编写好的收据,以便在热敏打印机POS上打印

Nic*_*Nic 17 c# printing wpf

我正在尝试在我的一个项目上实现打印功能,但我在这种工作中并不是那么好.

我已经连接了我的热敏打印机并写入/打印相同的样品.现在我正试图找到一些方法来设计我的收据看起来像附加图像的收据.

我有一些想法,但我不确定它们是否适合这种工作,其中一种是尝试在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);

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

lau*_*cee 21

在过去这样做时,我将收据拆分为使用不同字体或对齐方式(如标题,正文,页脚)的单独部分.

我使用以下类布局来封装我的打印文本定义.(从中获取字体以及如何管理其生命周期取决于您)

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; }
}
Run Code Online (Sandbox Code Playgroud)

如果有更长的文本列表使用相同的字体和填充,那么使用字符串构建器来构建文本可以简化生活,这样您就可以直观地检查代码.

如果您有静态文本,则可以将它们组合在一起,如下所示:

var sb = new StringBuilder();
sb.AppendLine("Start of receipt");
sb.AppendLine("================");
sb.AppendLine("Item 1");
sb.AppendLine("Item 2");
sb.AppendLine("================");
Run Code Online (Sandbox Code Playgroud)

或者,如果数据在某个对象中有点动态传递,则可以迭代并附加格式化文本:

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; } }
}
Run Code Online (Sandbox Code Playgroud)
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("================");
Run Code Online (Sandbox Code Playgroud)

输出结果如下:

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
================
Run Code Online (Sandbox Code Playgroud)

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

var printText = new PrintText(sb.ToString(), new Font("Monospace Please...", 8));
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
Run Code Online (Sandbox Code Playgroud)