Подтвердить что ты не робот

Запись хорошего приема в С# WPF для печати на термопринтере POS

Я пытаюсь реализовать функции печати в одном из моих проектов, но я не настолько хорош в этой работе.

Я уже подключился к моему термопринтеру и написал/распечатал те же образцы. Теперь я пытаюсь найти способ создать свою квитанцию, чтобы она выглядела как получение с прикрепленного изображения.

У меня есть некоторые идеи, но я не уверен, что они хороши для такого рода работ, одним из них является попытка отформатировать мою квитанцию ​​в 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

4b9b3361

Ответ 1

В прошлом, когда я делал это, я делил квитанцию ​​на отдельные части, которые использовали разные шрифты или выравнивания, такие как Header, Body, Footer.

Я использовал следующий макет класса, чтобы инкапсулировать мое определение текстового текста. (где вы получаете Шрифт и как вы управляете своей жизнью, зависит от вас)

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; }
}

Когда есть более длинные списки текстов с использованием одного и того же шрифта и отступов, то с помощью построителя строк для создания вашего текста упрощается жизнь, поэтому вы получите визуальное представление о том, как оно будет выглядеть только при проверке вашего кода.

Если у вас есть статический текст, вы можете поместить его все вместе так:

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;

Ответ 2

Я предполагаю, что вы не печатаете вывод на термопринтере, а обычный принтер с высокой разрешающей способностью с высоким разрешением? если это так, в основном вам необходимо создать растровое /pdf или другое графическое описание, которое вы можете отправить на принтер. так как в приведенном ниже примере изображения содержится текст, тогда ваша задача - просто разместить этот текст с координатами и размерами шрифта. проблема, с которой вы столкнетесь, однако, это поиск правильных шрифтов и получение интервала и кернинга и т.д. абсолютно правильно. это будет моей отправной точкой. посмотрите, можете ли вы найти шрифт, который похож на тот, что изображен на изображении. протестируйте его в Photoshop/Gimp или аналогичном. сделайте ваше фото термальной печати фоновым слоем, а затем посмотрите, можете ли вы сделать передний план тем же. как только вы сможете его скопировать, пойдите и закончите программное обеспечение. выберите текстовые координаты из макета фотошопа.

Ответ 3

Вы можете конвертировать квитанцию ​​в образ BitMaps и использовать класс XpsDocuentGenerator. Или используйте библиотеку с открытым исходным кодом, такую ​​как MigraDocs, где вы конвертируете ее в PDF и отправляете на принтеры