A ESC/POS Printer Commands Helper.
The NuGet Package can be found here and you can install it with:
PM> Install-Package ESCPOS
All command methods will return a byte array that you should concatenate with the bytes of your data, and then send it all to your printer.
The Print
extension method will send a byte array to the informed printer address, which can be something like COM3
, LPT1
, \\127.0.0.1\printer
, 192.168.0.100:9100
, etc. or even a path to a text file like ./print.txt
.
There is also an Add
and ToBytes
extension methods located in the namespace ESCPOS.Utils
.
The first one for byte arrays, you can use it to concatenate 2 or more byte arrays just like this:
byte[] result = array1.Add(array2, array3, ..., arrayN);
The second for strings, you can use it to convert a UTF-8 string to a byte array:
byte[] result = "Some string".ToBytes();
All examples will assume the using statements below:
using static ESCPOS.Commands;
using ESCPOS;
using ESCPOS.Utils;
byte[] qrCodeCommand = PrintQRCode("Some data");
qrCodeCommand.Print("COM2");
byte[] barCodeCommand = PrintBarCode(BarCodeType.EAN13, "9780201379624");
barCodeCommand.Print("LPT1");
This example will assume that the variable cfe
is a deserialized object from the CFe XML, and will print the receipt using its fields.
Also this example will print a 32 columns receipt, which is ideal for 56mm paper roll.
var line = "--------------------------------".ToBytes();
byte[] array = null;
array.Add(LF, SelectCharSizeHeight(CharSizeHeight.Double), SelectJustification(Justification.Center));
if (cfe.infCFe.emit.xFant != null)
array.Add(cfe.infCFe.emit.xFant.ToBytes());
array.Add(LF, SelectCharSizeHeight(CharSizeHeight.Normal), cfe.infCFe.emit.xNome.ToBytes(),
LF, $"{cfe.infCFe.emit.enderEmit.xLgr},{cfe.infCFe.emit.enderEmit.nro} {cfe.infCFe.emit.enderEmit.xBairro} - {cfe.infCFe.emit.enderEmit.xMun} {cfe.infCFe.emit.enderEmit.CEP}".ToBytes(),
LF, $"CNPJ: {cfe.infCFe.emit.CNPJ}".ToBytes(),
LF, $"IE: {cfe.infCFe.emit.IE}".ToBytes(),
LF, line, SelectCharSizeHeight(CharSizeHeight.Double), $"Extrato No. {cfe.infCFe.ide.nCFe}".ToBytes(),
LF, "CUPOM FISCAL ELETRONICO - SAT".ToBytes(), SelectCharSizeHeight(CharSizeHeight.Normal),
LF, LF);
if (!string.IsNullOrEmpty(cfe.infCFe.dest?.Item))
array.Add(line, "CPF/CNPJ do Consumidor:".ToBytes(), cfe.infCFe.dest.Item.ToBytes(), LF);
array.Add(line, "#|COD|DESC|QTD|UN|VL UNIT R$|(VL TRIB R$)*|VL ITEM R$".ToBytes(),
LF, line, SelectJustification(Justification.Left));
int i = 1;
foreach (var det in cfe.infCFe.det)
{
string prod = $"{det.prod.cProd} {det.prod.xProd} {det.prod.qCom:0.0##} {det.prod.uCom} X {det.prod.vUnCom:0.00#} {((det.imposto?.vItem12741 ?? 0) == 0 ? "" : $"({det.imposto.vItem12741:f2})*")}";
array.Add($" {i++:D3} ".ToBytes());
while (prod.Length > 20)
{
var wrap = prod.Length >= 20 ? prod.Substring(0,20) : prod;
array.Add(wrap).ToBytes(), LF, " ".ToBytes());
prod = prod.Substring(20);
}
array.Add(prod.PadRight(20).ToBytes(), det.prod.vProd.ToString("f2").PadLeft(6).ToBytes(), LF);
}
array.Add(LF);
if (cfe.infCFe.total.ICMSTot.vDesc > 0)
array.Add($" Desconto R${cfe.infCFe.total.ICMSTot.vDesc.ToString("f2").PadLeft(19)}".ToBytes(), LF);
if (cfe.infCFe.total.ICMSTot.vOutro > 0)
array.Add($" Acrescimo R${cfe.infCFe.total.ICMSTot.vOutro.ToString("f2").PadLeft(18)}".ToBytes(), LF);
array.Add(SelectCharSizeHeight(CharSizeHeight.Double), $" TOTAL R${cfe.infCFe.total.vCFe.ToString("f2").PadLeft(22)}".ToBytes(), LF,
SelectCharSizeHeight(CharSizeHeight.Normal), LF);
foreach (var mp in cfe.infCFe.pgto.MP)
{
string description;
switch (Convert.ToInt32(mp.cMP ?? "1"))
{
case 2:
description = "Cheque";
break;
case 3:
description = "Cartao de Credito";
break;
case 4:
description = "Cartao de Debito";
break;
case 5:
description = "Credito na Loja";
break;
case 10:
description = "Vale Alimentacao";
break;
case 11:
description = "Vale Refeicao";
break;
case 12:
description = "Vale Presente";
break;
case 13:
description = "Vale Combustivel";
break;
case 14:
description = "Duplicata Mercantil";
break;
case 90:
description = "Sem Pagamento";
break;
default:
description = "Dinheiro";
break;
}
array.Add($" {description.PadRight(18)}{mp.vMP.ToString("f2").PadLeft(12)}".ToBytes(), LF);
}
String accessKey = cfe.infCFe.Id.Substring(3, 44);
array.Add($" Troco{cfe.infCFe.pgto.vTroco.ToString("f2").PadLeft(25)}".ToBytes(), LF);
foreach (var obs in cfe.infCFe.infAdic.obsFisco)
array.Add($" {obs.xCampo}-{obs.xTexto}".ToBytes(), LF);
array.Add(line, "OBSERVACOES DO CONTRIBUINTE".ToBytes(), LF);
foreach (var item in cfe.infCFe.infAdic.infCpl.Split(';'))
array.Add(item.ToBytes(), LF);
array.Add(LF, line, SelectCharSizeHeight(CharSizeHeight.Double), SelectJustification(Justification.Center), $"SAT No. {cfe.infCFe.ide.nserieSAT}".ToBytes(),
LF, SelectCharSizeHeight(CharSizeHeight.Normal), DateTime.ParseExact($"{cfe.infCFe.ide.dEmi} {cfe.infCFe.ide.hEmi}", "yyyyMMdd HHmmss", System.Globalization.CultureInfo.InvariantCulture).ToString("dd/MM/yyyy HH:mm:ss").ToBytes(),
LF, LF, SelectCharSizeHeight(CharSizeHeight.Double), accessKey.ToBytes(),
LF, LF, PrintBarCode(BarCodeType.CODE128, accessKey.Substring(0, 22), 30), PrintBarCode(BarCodeType.CODE128, accessKey.Substring(22), 30),
LF, LF,
PrintQRCode($"{accessKey}|{cfe.infCFe.ide.dEmi}{cfe.infCFe.ide.hEmi}|{cfe.infCFe.total.vCFe}|{cfe.infCFe.dest?.Item ?? ""}|{cfe.infCFe.ide.assinaturaQRCODE}"),
SelectCharSizeHeight(CharSizeHeight.Normal),
LF, line, LF, LF, LF);
array.Print(@"\\127.0.0.1\printer");
This library will only accept UTF8 Encoding for Barcodes and QRCodes data.
You can see the changelog here.