使用POS打印机

图卡利佩

成员
已加入
2017年7月7日
留言内容
8
编程经验
Beginner
我当前正在编写一个获取字符串,一些参数并将其输出到POS热敏USB打印机的库。

我不确定我是否采用正确的方法,我希望其他人看看我在做什么:

C#:
        public static void RecebePrint(string texto, Fonte font, StringFormat alignment, bool breakline)
        {
            Linha line = new Linha()
            {
                linha = texto,
                fonte = font.tipo,
                alinhamento = alignment,
                quebralinha = breakline
            };
            transmitir.Add(line);
        }

丰特是我定义的一个类:
C#:
    public class Fonte
    {
        public Font tipo;
    }

丰泰的一个例子:
C#:
        public static Fonte corpo = new Fonte { tipo = new Font("Arial Narrow", 8f, FontStyle.Regular) };



C#:
        public static void NewLine(object sender, PrintPageEventArgs ev)        {
            SizeF size = new SizeF();
            float currentUsedHeight = 0f;
            foreach (Linha line in transmitir)
            {
                if (line.linha == "**END OF RECEIPT**")
                {
                    ev.Graphics.DrawString("***", line.fonte, Brushes.Black, new RectangleF(0, currentUsedHeight+300, 1000, 1000), line.alinhamento);
                    break;
                }
                else
                {
                    ev.Graphics.DrawString(line.linha, line.fonte, Brushes.Black, new RectangleF(0, currentUsedHeight, 290, 1000), line.alinhamento);
                    size = ev.Graphics.MeasureString(line.linha, line.fonte);
                }
                if (line.quebralinha is true)
                {
                    if (ev.Graphics.MeasureString(line.linha, line.fonte).Width > 290)
                    {
                        currentUsedHeight += size.Height * 2;
                    }
                    else
                    {
                        currentUsedHeight += size.Height;
                    }
                }
                else if (line.quebralinha is false)
                {
                }
            }
        }

基本上,此代码获取RecebePrint接收到的每个字符串并进行绘制。 RectangleF的1000值是任意的,从经验上讲并不重要,但是我不知道为什么它不重要使我感到困扰。

C#:
        public static void Printa()        {
            PrintDocument printDoc = new PrintDocument();
            printDoc.PrinterSettings.PrinterName = "Daruma DR800";
            printDoc.DefaultPageSettings.PaperSize = new PaperSize("Bobina", 400, 10000);
            printDoc.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
            printDoc.DocumentName = "Cupom";


            if (!printDoc.PrinterSettings.IsValid)
                throw new Exception("Não foi possível localizar a impressora");


            printDoc.PrintPage += new PrintPageEventHandler(PrinterNS.PrintFunc.NewLine);


            printDoc.Print();
            LimpaSpooler();
        }

同样,页面高度的任意值似乎并不影响最终结果。我不知道如何设定"paper size"因为POS热敏纸每卷4厘米乘80米长,所以我认为将纸高设置为80米并不明智。

实际的应用程序像
C#:
            PrintFunc.RecebePrint("CPF/CNPJ do Consumidor: CONSUMIDOR NÃO IDENTIFICADO", corpo, esquerda.align, true); //For each line, and when all lines are stored,
PrintFunc.Printa();


因为我是C#的初学者,所以我希望有一个经验丰富的人可以看一下这段代码。稍后,我还将打印条形码和QR码,但这是另一个主题,需要进一步讨论。
我不确定我的做法是否正确...

另外,我还需要满足一个要求,在该要求中,库必须在送入所有行之前打印出单独的行。如果在运行时一次填充所有行:
C#:
            PrintFunc.RecebePrint("CASA FARACO COMERCIAL DE GENEROS ALIMENTICIOS LTD", corpo, centro.align, true);            PrintFunc.RecebePrint("RUA FREI VITAL DE FRESCAROLO 514 JARDIM JOAO XXIII-SAO PAULO-055696-030", corpo, centro.align, true);
            PrintFunc.RecebePrint("CNPJ: 10.922.257/0001-54 IE: 148657180110 IM:", corpo, centro.align, true);
            PrintFunc.RecebePrint(new string('-', 91), negrito, esquerda.align, true);
            PrintFunc.RecebePrint("Extrato No. 021487", Titulo, centro.align, true);
            PrintFunc.RecebePrint("CUPOM FISCAL ELETRÔNICO - SAT", Titulo, centro.align, true);
            PrintFunc.RecebePrint(new string('-', 55), negrito, esquerda.align, true);
            PrintFunc.RecebePrint("CPF/CNPJ do Consumidor: CONSUMIDOR NÃO IDENTIFICADO", corpo, esquerda.align, true);
            PrintFunc.RecebePrint(new string('-', 55), corpo, esquerda.align, true);
            PrintFunc.RecebePrint("001 0000004022 Pipoca Coberta Com C 1 UN X 3,950 (0,81) 3,95", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("002 0000001389 Kinder Chocolate-12, 1 UN X 1,000 (0,36) 1,00", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("003 0000002390 Confeitos Fini-Todos 1 UN X 4,750 (0,53) 4,75", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("VALOR TOTAL R$", Titulo, esquerda.align, false);
            PrintFunc.RecebePrint("9,70", Titulo, direita.align, true);
            PrintFunc.RecebePrint("Cartão de débito", corpo, esquerda.align, false);
            PrintFunc.RecebePrint("9,70", corpo, direita.align, true);
            PrintFunc.RecebePrint(" ", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("02.03.03.02 - Consulte o QRCode deste extrato atra´ves do App DeOlhoNaNota", corpo, esquerda.align, true);
            PrintFunc.RecebePrint(new string('-', 55), corpo, esquerda.align, true);
            PrintFunc.RecebePrint("OBSERVAÇÕES DO CONTRIBUINTE", Titulo, esquerda.align, true);
            PrintFunc.RecebePrint("13/07/17 15:51       LJ0001 OP000004 CX003 SQ401499", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("OBRIGADO VOLTE SEMPRE!!", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("**FIM DA NOTA**", corpo, esquerda.align, true);
            PrintFunc.Printa();


I get what I need:

fL4nm9U.jpg

如果我使用:

C#:
            PrintFunc.RecebePrint("CASA FARACO COMERCIAL DE GENEROS ALIMENTICIOS LTD", corpo, centro.align, true);
            PrintFunc.RecebePrint("RUA FREI VITAL DE FRESCAROLO 514 JARDIM JOAO XXIII-SAO PAULO-055696-030", corpo, centro.align, true);
            PrintFunc.RecebePrint("CNPJ: 10.922.257/0001-54 IE: 148657180110 IM:", corpo, centro.align, true);
            PrintFunc.RecebePrint(new string('-', 91), negrito, esquerda.align, true);
            PrintFunc.RecebePrint("Extrato No. 021487", Titulo, centro.align, true);
            PrintFunc.RecebePrint("CUPOM FISCAL ELETRÔNICO - SAT", Titulo, centro.align, true);
            PrintFunc.RecebePrint(new string('-', 55), negrito, esquerda.align, true);
            PrintFunc.RecebePrint("CPF/CNPJ do Consumidor: CONSUMIDOR NÃO IDENTIFICADO", corpo, esquerda.align, true);
            PrintFunc.RecebePrint(new string('-', 55), corpo, esquerda.align, true);
            PrintFunc.Printa();
            PrintFunc.RecebePrint("001 0000004022 Pipoca Coberta Com C 1 UN X 3,950 (0,81) 3,95", corpo, esquerda.align, true);
            PrintFunc.Printa();
            PrintFunc.RecebePrint("002 0000001389 Kinder Chocolate-12, 1 UN X 1,000 (0,36) 1,00", corpo, esquerda.align, true);
            PrintFunc.Printa();
            PrintFunc.RecebePrint("003 0000002390 Confeitos Fini-Todos 1 UN X 4,750 (0,53) 4,75", corpo, esquerda.align, true);
            PrintFunc.Printa();
            PrintFunc.RecebePrint("VALOR TOTAL R$", Titulo, esquerda.align, false);
            PrintFunc.RecebePrint("9,70", Titulo, direita.align, true);
            PrintFunc.RecebePrint("Cartão de débito", corpo, esquerda.align, false);
            PrintFunc.RecebePrint("9,70", corpo, direita.align, true);
            PrintFunc.RecebePrint(" ", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("02.03.03.02 - Consulte o QRCode deste extrato atra´ves do App DeOlhoNaNota", corpo, esquerda.align, true);
            PrintFunc.RecebePrint(new string('-', 55), corpo, esquerda.align, true);
            PrintFunc.RecebePrint("OBSERVAÇÕES DO CONTRIBUINTE", Titulo, esquerda.align, true);
            PrintFunc.RecebePrint("13/07/17 15:51       LJ0001 OP000004 CX003 SQ401499", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("OBRIGADO VOLTE SEMPRE!!", corpo, esquerda.align, true);
            PrintFunc.RecebePrint("**FIM DA NOTA**", corpo, esquerda.align, true);
            PrintFunc.Printa();

我得到:


Cf6LFNm.jpg
 
最佳 底部