Sistema híbrido de gerenciamento de logs de impressoras/plotters com interface gráfica moderna em Python e processamento de alto desempenho em Zig.
Este sistema permite processar arquivos HTML de logs de impressoras, extrair informações relevantes (nome do arquivo, dimensões, data de impressão, quantidade de cópias) e calcular métricas como metros de material utilizado. A interface gráfica permite visualizar, buscar e somar dados de forma intuitiva.
O sistema utiliza uma arquitetura híbrida:
- Frontend (GUI): Python 3.12 com CustomTkinter para interface moderna e responsiva
- Backend (processamento): Zig 0.15.2 compilado como shared library (.so/.dll)
- Comunicação: FFI (Foreign Function Interface) via ctypes - Python carrega a biblioteca e chama funções diretamente
┌─────────────┐
│ Python │ ──ctypes──> ┌─────────────┐
│ (GUI App) │ │ Zig Library │
│ │ <──FFI────── │ (.so/.dll) │
└─────────────┘ └─────────────┘
Por que Zig + Python?
- Zig oferece performance e segurança de memória para processamento pesado
- Python oferece facilidade de desenvolvimento e bibliotecas ricas para GUI
- FFI permite integração direta sem overhead de subprocess
- Versão: 0.15.2
- Instalação:
# Linux (via package manager) # Arch Linux sudo pacman -S zig # Ubuntu/Debian # Baixar de: https://ziglang.org/download/ # Verificar instalação zig version
- Versão: 3.12
- Dependências: CustomTkinter
pip install -r frontend-python/requirements.txt
log-manager/
├── backend-zig/
│ ├── src/
│ │ └── main.zig # Backend com funções exportadas para FFI
│ ├── build.zig # Build script do Zig
│ └── build.zig.zon # Dependências (se necessário)
├── frontend-python/
│ ├── gui_app.py # Interface CustomTkinter
│ ├── zig_bridge.py # Bridge Python ↔ Zig via ctypes
│ └── requirements.txt # customtkinter
├── dist/ # Binários compilados
│ ├── liblogparser.so # Linux
│ └── logparser.dll # Windows
├── build.sh # Script de build
└── README.md
cd backend-zig
zig build -Dtarget=native -Doptimize=ReleaseFast
mkdir -p ../dist
cp zig-out/lib/liblogparser.so ../dist/cd backend-zig
zig build -Dtarget=x86_64-windows -Doptimize=ReleaseFast
cp zig-out/lib/logparser.dll ../dist/Use o script build.sh para compilar ambas as plataformas:
./build.shEste script:
- Compila para Linux nativo
- Cross-compila para Windows
- Copia os binários para
dist/
-
Compile o backend Zig (se ainda não compilou):
./build.sh
-
Instale as dependências Python:
cd frontend-python pip install -r requirements.txt -
Execute a aplicação:
python frontend-python/gui_app.py
- Carregar Tabela: Carrega dados de um arquivo JSON e exibe na tabela
- Limpar Tabela: Remove todos os dados da tabela
- Buscar: Busca arquivos por nome (busca em tempo real)
- Somar Linhas: Calcula a soma de metros das linhas selecionadas
- Processar Logs: Processa diretório de arquivos HTML e gera JSON
O backend expõe as seguintes funções via FFI:
-
processarHtml: Processa um arquivo HTML individual- Entrada: caminho do HTML, caminho de saída JSON
- Saída: 0 (sucesso) ou -1 (erro)
-
processarCsv: Processa um arquivo CSV individual- Entrada: caminho do CSV, caminho de saída JSON
- Saída: 0 (sucesso) ou -1 (erro)
-
processarDiretorio: Processa todos os arquivos HTML e CSV de um diretório- Entrada: diretório origem, diretório destino
- Saída: JSON consolidado em
resultado.json - Detecta automaticamente HTML e CSV pela extensão
-
calcularMetros: Calcula metros baseado em dimensão e cópias- Fórmula:
(altura_cm × quantidade_cópias) / 100
- Fórmula:
-
limparNomeArquivo: Remove caminho completo, retorna apenas nome
O sistema processa dois formatos de log:
- Máquinas: DX-1602, DX-1604
- Estrutura: Tabelas HTML com pares
<TH>/<TD> - Encoding: latin-1 ou UTF-8
- Extensões:
.html,.HTML
O parser espera HTML com estrutura de tabela:
<table>
<tr><th>INICIAR TRABALHO DE RIP</th></tr>
<tr><th>ARQUIVO:</th><td>C:\caminho\arquivo.pdf</td></tr>
<tr><th>DIMENSÃO:</th><td>100 x 150 cm</td></tr>
<tr><th>INÍCIO, DATA E HORA DO RIP:</th><td>2024-09-15 14:30:00</td></tr>
<tr><th>QUANTIDADE DE CÓPIAS:</th><td>2</td></tr>
</table>- Máquinas: [A definir conforme máquinas que geram CSV]
- Estrutura: Colunas separadas por vírgula
- Encoding: UTF-8
- Extensões:
.csv,.CSV - Formato:
Data,Hora,Arquivo,Largura,Altura,Unidade,Copias 03/01/2024,07:47:47,PAINEL PATRULHA CANINA 11.tif,158.0,158.0,cm,1 03/01/2024,12:45:36,GIRAFA malha 158x210.tif,158.0,210.4,cm,1
Campos CSV:
Data: Data no formato DD/MM/YYYYHora: Hora no formato HH:MM:SSArquivo: Nome do arquivo (pode incluir caminho)Largura: Largura em cm ou polegadasAltura: Altura em cm ou polegadasUnidade: Unidade de medida (cmouin/inch/inches)Copias: Quantidade de cópias (número inteiro)
Conversão de Unidades:
- Se a unidade for
in,IN,inchouinches, a altura é convertida para cm (multiplicando por 2.54) - O cálculo de metros sempre usa cm:
metros = (altura_cm × quantidade_cópias) / 100
O sistema detecta automaticamente o formato pela extensão do arquivo.
[
{
"nome_arquivo": "arquivo.pdf",
"metros": 3.0,
"data_impressao": "2024-09-15 14:30:00"
}
]- Abra a aplicação:
python frontend-python/gui_app.py - Clique em "Processar Logs"
- Selecione o diretório com arquivos HTML e/ou CSV
- Selecione o diretório de destino
- Aguarde o processamento (o sistema detecta automaticamente HTML e CSV)
- Clique em "Carregar Tabela" para visualizar os resultados
from zig_bridge import ZigBackend
# Carregar backend
backend = ZigBackend()
# Processar diretório
sucesso = backend.processar_diretorio(
"/caminho/html",
"/caminho/json"
)
if sucesso:
print("Processamento concluído!")- Os arquivos HTML são assumidos como UTF-8 ou latin-1 compatível
- O parser é simples e busca padrões específicos no HTML
- Extrai altura da dimensão (formato: "largura x altura cm")
- Fórmula:
metros = (altura_cm × quantidade_cópias) / 100
- Funções retornam
0para sucesso,-1para erro - Arquivos com erro são pulados durante processamento de diretório
- Mensagens de erro são exibidas na interface gráfica
Erro: FileNotFoundError: Biblioteca não encontrada: ./dist/liblogparser.so
Solução:
- Verifique se compilou o backend:
./build.sh - Verifique se o arquivo existe:
ls -lh dist/ - Certifique-se de executar a partir do diretório raiz do projeto
Erro: Caracteres estranhos no JSON gerado
Solução:
- O parser assume UTF-8. Se seus HTMLs estão em latin-1, pode ser necessário converter antes do processamento
Erro: Erro ao compilar para Windows
Solução:
- Verifique se o Zig está atualizado:
zig version(deve ser 0.15.2) - Tente compilar manualmente:
cd backend-zig zig build -Dtarget=x86_64-windows -Doptimize=ReleaseFast
Erro: Erro ao importar CustomTkinter
Solução:
pip install --upgrade customtkinterAviso: "Backend Zig não disponível"
Solução:
- Compile o backend primeiro
- Certifique-se de que está executando do diretório raiz
- Verifique permissões do arquivo .so/.dll
O parser é intencionalmente simples e busca padrões específicos:
- Usa
std.mem.indexOfpara encontrar tags - Não usa bibliotecas externas de parsing
- Específico para o formato dos logs de impressora
- Zig usa
GeneralPurposeAllocatorpara alocação - Memória é liberada automaticamente com
defer - Strings C são null-terminated para compatibilidade FFI
build.zigconfigura a compilação como shared library- Suporta diferentes targets (native, x86_64-windows)
- Otimização:
ReleaseFastpara performance máxima
Este projeto é de código aberto. Sinta-se livre para usar e modificar conforme necessário.
Contribuições são bem-vindas! Por favor:
- Faça fork do projeto
- Crie uma branch para sua feature
- Commit suas mudanças
- Abra um Pull Request
Para problemas ou dúvidas:
- Abra uma issue no repositório
- Verifique a seção de Troubleshooting acima
Desenvolvido com ❤️ usando Zig e Python