Este projeto é uma solução moderna baseada em microserviços para conversão de ficheiros de texto e imagem de forma escalável, segura e eficiente.
A arquitetura utiliza Python, Flask, Docker, Consul para service discovery, autenticação básica, HTTPS com certificados self-signed e agora também RabbitMQ para processamento assíncrono.
Inclui suporte a processamento paralelo (multi-threading), aceleração opcional com OpenCL, interface gráfica em CustomTkinter e um sistema de callback HTTP para entrega automática dos ficheiros convertidos ao cliente.
- Cliente: Interface gráfica em CustomTkinter para upload e download dos ficheiros convertidos.
O cliente arranca um pequeno servidor HTTP local para receber ficheiros convertidos automaticamente via callback, e permite escolher a pasta de destino. - Dispatcher: Serviço Flask que recebe pedidos do cliente, descobre o microserviço adequado via Consul e encaminha o pedido.
Agora suporta apenas pedidos assíncronos via RabbitMQ, exigindo sempre umcallback_urlpara entrega do resultado. - Microserviços:
service_text: Converte ficheiros.docxpara.pdf,.pdfpara.docx,.docx/.pdfpara.png(cada página como imagem, processamento paralelo com até 5 threads, resultado em.zip). Consome pedidos da fila RabbitMQ e envia o ficheiro convertido para ocallback_urldo cliente.service_image: Converte imagens entre.jpg,.pnge.gif, com suporte a pós-processamento OpenCL. Consome pedidos da fila RabbitMQ e envia o ficheiro convertido para ocallback_urldo cliente.
- RabbitMQ: Broker de mensagens para processamento assíncrono dos pedidos de conversão.
- Consul: Descoberta dinâmica de serviços.
- Logs: Todos os serviços registam logs detalhados em ficheiros dedicados.
- Conversão de ficheiros DOCX ↔ PDF, PDF ↔ DOCX, PDF/DOCX → PNG (multi-página, multi-thread, ZIP)
- Conversão de imagens entre JPG, PNG e GIF
- Processamento paralelo (máx. 5 threads) para conversão de páginas em PNG
- Resultado de conversão PDF/DOCX → PNG é sempre um ficheiro ZIP com todas as páginas numeradas
- Aceleração opcional com OpenCL (se disponível)
- Deteção automática do sistema operativo para escolher entre Word/docx2pdf (Windows) ou LibreOffice (Linux/Docker)
- Interface gráfica moderna (CustomTkinter)
- Cliente deteta extensão correta do ficheiro devolvido e sugere nome adequado ao guardar
- Cliente pode escolher a pasta de destino para guardar ficheiros convertidos
- Entrega automática do ficheiro convertido ao cliente via callback HTTP
- Comunicação segura via HTTPS (certificados self-signed)
- Autenticação básica em todos os endpoints
- Logs detalhados por serviço
- Limpeza automática de ficheiros temporários
- Processamento assíncrono com RabbitMQ:
- O dispatcher publica sempre os pedidos na fila RabbitMQ, incluindo o
callback_url. - Os microserviços consomem pedidos das filas (
text_convert_queueeimage_convert_queue) e processam-nos em background, enviando o resultado para o callback do cliente.
- O dispatcher publica sempre os pedidos na fila RabbitMQ, incluindo o
- Volumes Docker para desenvolvimento:
- O código-fonte dos serviços e dispatcher está montado como volume, permitindo alterações rápidas sem rebuild.
- Sistema de callback HTTP: O cliente arranca um servidor HTTP local e recebe automaticamente o ficheiro convertido, sem polling manual.
- Retry automático para RabbitMQ: Os serviços tentam ligar ao RabbitMQ até este estar disponível, evitando falhas ao arrancar.
- Nome dos ficheiros convertidos: Todos os ficheiros devolvidos (incluindo ZIPs) mantêm o nome do ficheiro original, apenas com a nova extensão.
- Cliente com escolha de pasta de destino: O utilizador pode escolher onde guardar os ficheiros convertidos.
- Remoção da barra de loading: A interface está mais simples e direta para o utilizador.
- Documentação e exemplos melhorados: O README foi atualizado para refletir todas estas alterações e facilitar a explicação do funcionamento do sistema.
- Python 3.8+
- Docker (para Consul, RabbitMQ e serviços)
- Pipenv ou venv (recomendado)
- Consul (pode ser via Docker)
- Poppler (para PDF→PNG)
- (Opcional) LibreOffice (para DOCX→PDF em Linux/Docker)
pip install -r requirements.txtmkdir certs
openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365 -nodes -subj "/CN=localhost"docker-compose up --buildNota: O código dos serviços e dispatcher está montado como volume, pelo que qualquer alteração ao código é refletida imediatamente sem rebuild.
python client/app.py- Abre o cliente (
client/app.py). - Seleciona o ficheiro, o formato de destino e a pasta onde queres guardar o ficheiro convertido.
- Clica em "Converter".
- O ficheiro convertido será entregue automaticamente na pasta escolhida, com o nome correto (ex:
documento.zippara PDF/DOCX→PNG).
- Cada página é processada em paralelo (máx. 5 threads).
- Todas as imagens são guardadas como PNG numerados (
page_001.png,page_002.png, ...). - O resultado é sempre um ficheiro ZIP com todas as imagens.
- O nome do ZIP devolvido é igual ao ficheiro original, mas com extensão
.zip.
- Em Windows: usa Microsoft Word via docx2pdf.
- Em Linux/Docker: usa LibreOffice em modo headless.
- Se disponível, pode ser usado para pós-processamento de imagens (ex: inversão de cores).
- O código deteta automaticamente se OpenCL está disponível e usa-o apenas se possível.
- O dispatcher publica sempre os pedidos na fila RabbitMQ, incluindo o
callback_urldo cliente. - Os microserviços consomem pedidos das filas e, após processar, fazem um POST para o
callback_urlcom o ficheiro convertido. - O cliente recebe o ficheiro automaticamente e guarda-o na pasta escolhida.
- O código-fonte dos serviços e dispatcher está montado como volume (
./services/service_text:/app, etc.), permitindo desenvolvimento rápido sem rebuilds.
conv-dist/
├── client/
│ └── app.py
├── dispatcher/
│ └── dispatcher.py
├── services/
│ ├── service_text/
│ │ └── service.py
│ └── service_image/
│ └── service.py
├── certs/
├── logs/
│ ├── service-logs/
│ ├── client-logs.txt
│ └── dispatcher-logs.txt
├── docker-compose.yml
├── requirements.txt
├── .env
└── README.md
- Para conversão de PDF/DOCX para PNG é necessário instalar o Poppler e garantir que o executável está no
PATH. - Para conversão de DOCX para PDF em Linux/Docker, é necessário instalar o LibreOffice.
- O cliente deteta automaticamente o tipo de ficheiro devolvido e sugere a extensão correta ao guardar.
- Os logs detalhados de cada serviço estão na pasta
logs/. - Para produção, recomenda-se usar certificados válidos e um WSGI server (ex: gunicorn).
- O ciclo de retry automático nos serviços garante ligação ao RabbitMQ mesmo que este demore a arrancar.
- O nome do ficheiro convertido devolvido (incluindo ZIPs) é sempre igual ao ficheiro original, apenas com a nova extensão.
Este projeto é open-source e está licenciado sob a licença MIT.
Desenvolvido como parte de um trabalho acadêmico universitário.