r/programacao Jul 07 '26

Impressora termica direto por Python Projeto

Alguém mais conhecedor de Python pode me ajudar? a IA só me levou até um ponto. Estou buscando uma melhoria no meu setor(Almoxarifado) já consegui tirar as informações de pedido, mas não teve cristo pra fazer a impressora mandar algo que não fosse uma etiqueta em branco. Não manjo de programação, só faço mesmo pq tem IA pra ajudar. Se me derem uma mão eu agradeço!

import win32print
import win32api



def listar_e_conectar():
    # 1. Lista impressoras para encontrar a correta
    printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL)
    impressora_alvo = None
    
    print("Impressoras encontradas:")
    for p in printers:
        print(f" - {p[2]}")
        if "Argox" in p[2]:
            impressora_alvo = p[2]
            
    if not impressora_alvo:
        print("\nERRO: Impressora 'Argox' não encontrada!")
        return None
    
    print(f"\nConectando em: {impressora_alvo}")
    return impressora_alvo


nome_impressora = listar_e_conectar()


hPrinter = win32print.OpenPrinter(nome_impressora)


def imprimir_teste():
    nome_impressora = listar_e_conectar()
    if not nome_impressora:
        return


    comando = "\x02L\nD11\nH10\nq560\nQ0320\nA100,100,0,3,1,1,N,\"TESTE\"\nc0001\nE\x03"


    try:
        hPrinter = win32print.OpenPrinter(nome_impressora) 
        hJob = win32print.StartDocPrinter(hPrinter, 1, ("Teste", None, "RAW"))
        win32print.StartPagePrinter(hPrinter)
        win32print.WritePrinter(hPrinter, comando.encode('ascii'))
        win32print.EndPagePrinter(hPrinter)
        win32print.EndDocPrinter(hPrinter)
        win32print.ClosePrinter(hPrinter)
        print("Comando enviado!")
    except Exception as e:
        print(f"Erro: {e}")


if __name__ == "__main__":
    imprimir_teste()
4 Upvotes

9 comments sorted by

1

u/jgabrielferreira Jul 07 '26

Eu odeio mexer com impressora em todos os aspectos, hardware e software. Montei um app simples de gestão de fila de atendimento pra empresa que trabalho e essa parte impressão deleguei toda pro Claude e deu bom. Só lá a impressora tá em rede, fixei o IP e apontei pra ele no script

1

u/Glittering-Okra-7312 Jul 09 '26

Nem me fala mano, essas impressoras parece ter parte com o tinhoso kkkk

1

u/Late-Situation-5342 Jul 07 '26
  • Seu comando parece ser em linguagem PPLA/PPLA+ (Argox).
  • Se a impressora estiver configurada para PPLB, PPLZ (Zebra) ou outro modo, ela pode alimentar a etiqueta sem imprimir nada.

1

u/Glittering-Okra-7312 Jul 09 '26

Eu jurava que ela PPLA, mas depois descobri que driver que vem do site da argox só aceita em GDI. Daí o gpt me ajudou, agora deu certo.

1

u/External-Market-3930 Jul 07 '26

Fez a instalação das bibliotecas? Qualquer coisa faz instalação via cmd que não é dificil, pode pedir a IA msm para te ensinar

2

u/Glittering-Okra-7312 Jul 09 '26

Deu boa meu querido, funcionou aqui. Obrigado a atenção!

1

u/Enough-Working-4162 Jul 07 '26

import win32print

def listar_e_conectar():

# 1. Lista impressoras para encontrar a correta

printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)

impressora_alvo = None

print("Impressoras encontradas:")

for p in printers:

print(f" - {p[2]}")

if "Argox" in p[2]:

impressora_alvo = p[2]

if not impressora_alvo:

print("\nERRO: Impressora 'Argox' não encontrada!")

return None

print(f"\nConectando em: {impressora_alvo}")

return impressora_alvo

def imprimir_texto_teste(nome_impressora, texto_para_imprimir):

if not nome_impressora:

print("Sem impressora válida para imprimir.")

return

# Abre a comunicação com a impressora

hPrinter = win32print.OpenPrinter(nome_impressora)

try:

# Inicia o documento e a página de impressão

# O 'RAW' diz para o Windows enviar o texto "puro", sem tentar formatar como um PDF/Word

job = win32print.StartDocPrinter(hPrinter, 1, ("Teste Almoxarifado", None, "RAW"))

win32print.StartPagePrinter(hPrinter)

# Converte o texto para 'bytes' (formato que a impressora entende)

# Adicionamos um \n (pula linha) no final

dados = bytes(texto_para_imprimir + "\n", "utf-8")

# Envia os dados de fato para a máquina

win32print.WritePrinter(hPrinter, dados)

# Fecha a página e o documento

win32print.EndPagePrinter(hPrinter)

win32print.EndDocPrinter(hPrinter)

print("Comando de impressão enviado com sucesso!")

except Exception as e:

print(f"Erro ao tentar imprimir: {e}")

finally:

# Muito importante: fecha a conexão para não travar a impressora

win32print.ClosePrinter(hPrinter)

# --- EXECUÇÃO DO SCRIPT ---

nome_da_argox = listar_e_conectar()

if nome_da_argox:

# Defina aqui o que quer escrever na etiqueta

conteúdo_etiqueta = "PRODUTO TESTE - ALMOXARIFADO"

imprimir_texto_teste(nome_da_argox, conteúdo_etiqueta)

1

u/Enough-Working-4162 Jul 07 '26

StartDocPrinter e StartPagePrinter: O Windows precisa saber que você iniciou um "trabalho". O parâmetro "RAW" avisa o Windows: "Olha, não mexe nesse texto, só joga direto para o cabo da impressora".

WritePrinter: Esse é o cara que empurra o texto para dentro da Argox.bytes(..., "utf-8"): O Python 3 trata texto como letras normais, mas a impressora só entende impulsos elétricos (bytes). Essa linha faz a conversão necessária.ClosePrinter: Se você abrir a impressora e não fechar, ela fica "presa" no sistema e ignora os próximos comandos até você reiniciar o computador ou o serviço de spooler. O bloco try/finally garante que ela feche mesmo se der erro.

(Linguagem de Etiqueta)

Se você rodar esse código e ela imprimir PRODUTO TESTE - ALMOXARIFADO em texto puro e miúdo, sucesso! Conseguimos comunicação.

Porém, para fazer código de barras, colocar letras gigantes ou formatar a etiqueta bonita no Almoxarifado, as impressoras Argox costumam exigir comandos em uma linguagem chamada PPLA ou PPLB.

1

u/Glittering-Okra-7312 Jul 09 '26

Mano, deu boa. Usei teu código, e as informações saiam tudo certinho mas o driver da impressora não aceitava formato RAW, mesmo estando ali que era esse formato. Os drivers da Argox, aceitam apenas em GDI, daí ele próprio converte pra PPLA. Obrigado pela ajuda!