Member 11381811 Ответов: 2

Как выровнять и перенести слова, когда я хочу печатать на pos-принтере?


Мне нужно распечатать с помощью класса PrintDocument какую-то квитанцию на POS-принтере Nippon.
Поэтому мне нужно какое-то решение для culumns (предметы при получении)..повторите решение
И когда у меня есть длинное имя элемента нужно переносить слова как в Примере пункт 3
Qty Name                    Amount
==================================
1 x Coca Cola 0.25            2,00
2 x Filet Steak              11,00
  1 x mushrooms (1,00)
3 x poaspodpaoisdoiapodsipoaipoido
adslkjasldj                  12,00
==================================
                  Total:     25,00

это пример того, что мне нужно напечатать.

Что я уже пробовал:

...

string itemString = string.Empty;
            string modifierString = string.Empty;
            foreach (var item in ticket.ticketItems)
            {
                itemString = (item.quantity + "x" + item.name).PadLeft(0) + item.price.PadLeft(40); ;
                e.Graphics.DrawString(itemString, printFont, headerBrush, x, y);
                e.Graphics.DrawString(Environment.NewLine, printFont, Brushes.Black, x, y);
                y += lineOffset;

                foreach (var mod in item.modifiers)
                {
                    modifierString = (mod.quantity + "x" + mod.name).PadLeft(0) + mod.price.PadLeft(20);
                    e.Graphics.DrawString(modifierString, printFont, headerBrush, x, y);
                    e.Graphics.DrawString(Environment.NewLine, printFont, Brushes.Black, x, y);
                    y += lineOffset;
                }
            }

Alek Massey

А как выглядит ваш текущий выход?

2 Ответов

Рейтинг:
1

Richard MacCutchan

Ключевым моментом здесь является не принтер, а размеры бумаги, которую вы используете. Вам нужно получить размеры страницы, а затем использовать такие методы, как Графика.Метод MeasureString (System.Чертеж) | Microsoft Docs[^] чтобы настроить свой выход по размеру.


Рейтинг:
0

#realJSOP

0) вам нужно использовать непропорциональный шрифт.

1) вам нужно написать код, который будет форматировать ваши выводимые строки до нужной ширины.

2) я бы серьезно подумал об усечении имен до максимального размера, чтобы вы не получали несколько строк для одной строки. Это значительно упростило бы код.

3) Вот вам примерный и непроверенный код для начала:

public string FormatLineItem(int lineType, int linewidth, int quantity, string name, double amount)
{
    int qtyWidth = 3;
    int amtWidth = 5;
    int nameWidth = linewidth - (qtyWidth + amtWidth);
    string result = string.Empty;

    switch (lineType)
    {
        case 1 : // data
            {
                result = string.Format("{0:#0}x {1} {2:##.#0}", quantity, name.PadRight(nameWidth), amount);
            }
            break;
        case 2 : // header
            {
                result = string.Format("QTY {0} AMOUNT",  name.PadRight(nameWidth));
            }
            break;
        case 3 : // footer
            {
                result = string.Format("{0:##.#0"}, amount).PadLeft(linewidth-amtWidth));
            }
            break;
    }
    return result;
}


Member 11381811

ширина строки мне нужно как - то вычислить, сколько у меня есть формата бумаги- левое и правое поля?

Member 11381811

по каждому элементу (ВАР пункта в билете.ticketItems)
{
//д. Графика.DrawString(Environment.NewLine, printFont, Brushes.Черный, x, y);
//y += lineOffset;
itemString = FormatLineItem(1, 60, item.quantity, item.name, пункт.цена);
e.графика.Шнурок(itemString, printFont, кисти.Черный, x, y);
г += lineOffset;
//д. Графика.DrawString(Environment.NewLine, printFont, Brushes.Черный, x, y);
//y += lineOffset;
}
Нужно знать, как вычислить ширину линии и нужно обернуть txt для имени элемента, если оно такое длинное
я пытаюсь это сделать, но результат хромает..