Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Biblioteca para realizar impressões (impressora não fiscal) utilizando comandos Esc/Bema, Esc/Daruma e Esc/Pos 🚀

License

Notifications You must be signed in to change notification settings

leandrovip/Vip.Printer

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

79 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Vip.Printer - Impressão em mini-impressoras de um jeito simples e fácil 📇

Nuget NuGet

Biblioteca para realizar impressões em mini‑impressoras (não fiscais) com os sets de comandos ESC/POS, ESC/Bematech e ESC/Daruma — funcionando por RAW, TCP/IP) e Serial (RS‑232/USB‑Serial).
Suporta marcas como Bematech, Elgin, Epson, Sweda, Tanca, Daruma, Dimep, ControliD, Jetway, Tomate, entre outras.

Funcionalidades disponíveis

  • Alinhamento
  • Negrito
  • Itálico
  • Sublinhado
  • Expandido
  • Condensado
  • Tamanho da Fonte
  • Abertura de Gaveta (dinheiro)
  • QRCode
  • Imagem
  • Código de Barras (EAN13, CODE128, CODE39)
  • Guilhotina
  • Propriedades com o número limite de colunas
  • Número de cópias
  • Auto Teste

Requisitos

  • .NET Standard 2.0 (lib)
  • Compatível com .NET Framework 4.6.1+
  • Bibliotecas utilizadas como dependência System.IO.Ports, System.Drawing.Common ambas na versão 6.0.0

Instalação

Install-Package Vip.Printer

Dica de Encoding: para em .NET Core/5+/Android Xamarin/MAUI registre os code pages na inicialização do projeto:

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

🚀 Como começar

1) Modo rápido (construtores antigos — compatíveis)

using Vip.Printer;
using Vip.Printer.Enums;

// Impressora local instalada (RAW/Spool)
var p1 = new Printer("MINHA_IMPRESSORA", PrinterType.Epson);
p1.WriteLine("Olá ESC/POS!");
p1.PartialPaperCut();
p1.PrintDocument();

// Impressora de rede (porta 9100)
var p2 = new Printer("192.168.0.50:9100", PrinterType.Epson, ProtocolType.Network);
p2.WriteLine("Impressão pela rede");
p2.PrintDocument();

🔹 Novo padrão recomendado (com PrinterSettings)

var settings = PrinterSettings.Create()
    .WithPrinterName("Elgin I9")
    .WithProtocol(ProtocolType.Raw)
    .WithPrinterType(PrinterType.Epson)
    .WithEncoding(Encoding.GetEncoding("IBM860"))         // opcional
    .WithColumns(normal: 48, condensed: 64, expanded: 24) // opcional
    .Build();

var p = new Printer(settings);

// Exemplo simples
p.AlignCenter();
p.BoldMode("Vip.Printer");
p.NewLine();
p.WriteLine("Impressão via Spool (nome da impressora)");
p.Separator();
p.PartialPaperCut();
p.PrintDocument();

Quando usar:

  • RAW: quando a impressora estiver instalada/local/compartilhada na estação (nome da impressora, porta ou nome do compartilhamento).
  • Network: impressoras via REDE (ex.: ip:porta - 192.168.0.1:9100). Caso não passe a porta, a biblioteca assume por padrão 9100.
  • Serial: quando ligada à porta COM ou USB/Serial (defina as propriedades da porta Serial).

🔹 RAW (compartilhamento/porta local)

using Vip.Printer;
using Vip.Printer.Enums;

// Mantido construtores antigos para retrocompatibilidade
var p = new Printer("MINHA_IMPRESSORA", PrinterType.Epson);

p.WriteLine("Olá, Vip.Printer!");
p.Separator();
p.WriteLine("Estou usando o protocolo RAW!");
p.PartialPaperCut();
p.PrintDocument();

🔹 REDE (TCP/IP – ex: 192.168.0.50:9100)

using Vip.Printer;
using Vip.Printer.Enums;

// Dica: Caso passe somento número do IP, será assumido a porta 9100 como padrão.

var settings = PrinterSettings.Create()
    .WithPrinterName("192.168.1.100")
    .WithProtocol(ProtocolType.Network)
    .WithPrinterType(PrinterType.Epson)
    .WithColumns(normal: 48, condensed: 64, expanded: 24) // opcional
    .Build();

var p = new Printer(settings);

p.AlignCenter();
p.BoldMode("Pedido #123");
p.NewLine();
p.QrCode("https://sistemaviperp.com.br");
p.PartialPaperCut();
p.PrintDocument();

🔹 SERIAL (porta serial/usb serial)

using Vip.Printer;
using Vip.Printer.Enums;

var settings = PrinterSettings.Create()
    .WithPrinterName("COM10")
    .WithProtocol(ProtocolType.Serial)
    .WithPrinterType(PrinterType.Epson)
    .WithSerialOptions(9600, 8, Parity.None, StopBits.One, Handshake.None)
    .Build();

var p = new Printer(settings);

p.AlignCenter();
p.ExpandedMode("Impressão via Serial");
p.NewLine();
p.WriteLine("Estou usando a porta COM10");
p.FullPaperCut();
p.PrintDocument();

Formatação de texto e alinhamento

p.AlignLeft();
p.WriteLine("Texto normal");

p.ItalicMode("Texto Itálico");
p.BoldMode("Texto Negrito");
p.UnderlineMode("Texto Sublinhado");

p.ExpandedMode(PrinterModeState.On);
p.WriteLine("Expandido");
p.ExpandedMode(PrinterModeState.Off);

p.CondensedMode(PrinterModeState.On);
p.WriteLine("Condensado");
p.CondensedMode(PrinterModeState.Off);

p.NewLines(2);           // múltiplas quebras de linha
p.Separator();           // linha de separação (-----)

Largura da fonte (colunas)

p.NormalWidth();
p.WriteLine("Largura Normal");
p.DoubleWidth2();
p.WriteLine("Largura 2");
p.DoubleWidth3();
p.WriteLine("Largura 3");

// Ajuste fino via colunas (se necessário)
p.ConfigureCols(normal: 48, condensed: 64, expanded: 24);

Códigos de barras e QR Code

p.Code128("ABC123456");
p.Code39("VIP123");
p.Ean13("7891234567890");

p.QrCode("https://seu.link/aqui");                     // tamanho padrão
p.QrCode("https://seu.link/aqui", QrCodeSize.Size6);   // tamanho custom

Imagens

p.Image("caminho/arquivo.bmp");                 // de arquivo
p.Image(streamDoLogo);                          // de stream
p.Image(bytesDoLogo);                           // de byte[]
p.Image(minhaImagemBitmap, highDensity: true);  // de Image (System.Drawing)

Observação: a imagem é rasterizada para a largura da cabeça térmica seguindo o comando do set (Esc/POS/Bema/Daruma).

Gaveta e Guilhotina

p.OpenDrawer();         // abre gaveta
p.PartialPaperCut();    // corte parcial
p.FullPaperCut();       // corte total

Inicialização, teste e buffer

p.InitializePrint(); // envia sequência de inicialização (Reset)
p.AutoTest();        // imprime teste do set de comandos
p.TestPrinter();     // imprime uma demo completa

p.Clear();           // limpa o buffer antes de montar outro documento
p.PrintDocument(2);  // imprime 2 cópias do buffer atual

Codificação (acentos) – IBM850 / IBM860

  • Padrão:
    • Para Bematech: Encoding.GetEncoding(850) (IBM850).
    • Para Epson/Daruma (via Esc/POS/EscDaruma): Encoding.GetEncoding("IBM860").
  • Recomendação (evitar erro “Encoding 860 not found” em .NET Core/Android):
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    // e então, se quiser, force um encoding específico:
    p.ConfigureEncoding(Encoding.GetEncoding("IBM860"));
  • Se preferir outro code page (ex.: 1252), defina no construtor ou via ConfigureEncoding.

Usando uma Engine customizada

Você pode plugar qualquer método de comunicação que implemente IEngine — por exemplo, para logar em arquivo (tests) ou enviar via Bluetooth.
Quando uma engine custom é informada, o ProtocolType do PrinterSettings é ignorado.

1) FileEngine (dump binário para testes)

using Vip.Printer.Interfaces.Engine;

public sealed class FileEngine : IEngine
{
    private readonly string _path;
    public FileEngine(string path) => _path = path ?? throw new ArgumentNullException(nameof(path));

    public bool Send(string printer, byte[] content)
    {
        var dir = System.IO.Path.GetDirectoryName(_path);
        if (!string.IsNullOrEmpty(dir)) System.IO.Directory.CreateDirectory(dir);
        System.IO.File.WriteAllBytes(_path, content ?? Array.Empty<byte>());
        return true;
    }
}

// Uso
var engine = new FileEngine(@"C:\temp\saida-escpos.bin");

var settings = PrinterSettings.Create()
    .WithPrinter("dummy")
    .WithPrinterType(PrinterType.Epson)
    .WithEngine(engine)
    .Build();

var printer = new Printer(settings);
printer.WriteLine("Imprimindo (na prática, gravando bytes ESC/POS em arquivo)...");
printer.PrintDocument();

Protocolos de comunicação

  • RAW: imprime em fila local/compartilhada (porta LPT/USB/compartilhamento).
  • REDE (TCP/IP): use IP + Porta (ex.: 192.168.0.50:9100).
  • SERIAL: defina porta (ex.: COM3). Parâmetros da serial são lidos de PrinterSettings quando Protocol=Serial.

Troubleshooting (erros comuns)

  • “Não foi possível acessar a impressora: X”
    Verifique nome/compartilhamento, IP:porta, permissões e se a impressora está online.
  • “Image file not found”
    Caminho do arquivo inválido. Use caminho absoluto ou File.Exists antes de chamar Image(...).
  • “QR-Code não impresso corretamente”
    Verifique se o set de comando informado é o mesmo da impressora. Para impressora como bematech, pode ser necessário atualizar
  • Acentos saindo com caracteres estranhos / exceção de Encoding
    Registre os code pages (Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)) e/ou selecione manualmente IBM850/IBM860. Faça a impressão do auto teste e verifique o encoding configurado.
  • Nada imprime ao chamar PrintDocument()
    Garanta que o buffer foi montado (Write/WriteLine/...) antes de imprimir. Use TestPrinter() para validar, se necessário.

Impressoras testadas

Marca / Modelo EscPos EscBema EscDaruma
Bematech MP-2500
Bematech MP-4000
Bematech MP-4200
Bematech MP-4800
Daruma DR-700
Daruma DR-800
Dimep D-Print DUAL
Elgin i7
Elgin i9
Elgin VOX
Evadin Ep26m
Epson TM-20
ControliD Print iD
Tanca TP-550
Tanca TP-650
Jetway JP-880
Tomate MDK-080/081

Dica: mesmo sendo Esc/POS, alguns modelos exigem ajustes de colunas/encoding.

Release Notes

04/11/2025 - v2.0.11

  • Adiciona novo padrão de configuração da biblioteca com novo construtor
  • Adiciona protocolo de comunicação via porta SERIAL
  • Adiciona possibilidade de adicionar engine customizada implementando a interface IEngine

29/06/2022 - v2.0.6

  • Melhoria no comando de acionamento da gaveta para ESC/Bema

16/05/2022 - v2.0.4

  • Adiciona protocolo de comunicação via REDE (tcp/ip)

05/02/2021 - v1.0.22

  • Corrige o método NewLine

10/11/2020 - v1.0.21

  • Adiciona o parâmetro 'copies' no método PrintDocumet para informar a quantidade de cópias a serem impressas

20/10/2020 - v1.0.20

  • Corrige impressão do código de barras 'CODE128' no set de comandos EscPos

Licença

MIT

About

Biblioteca para realizar impressões (impressora não fiscal) utilizando comandos Esc/Bema, Esc/Daruma e Esc/Pos 🚀

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.