Pdfesto: Criei um serviço simples para geração de PDFs e decidi compartilhar
Recentemente precisei resolver um problema que a princípio achei que seria simples: Gerar contratos parametrizados com as informações da venda e do cliente no momento da compra.
Como em minha empresa usamos Java, e também é essa a linguagem que conheço em maior profundidade, procurei por ferramentas que atendessem minhas necessidades da melhor forma possível mas sempre esbarrava em alguns problemas típicos:
- Ferramentas demasiadamente complexas: Opções de mais e entrega de menos;
- Configuração via aplicações datadas, legadas ou pagas: Como os contratos são escritos pela equipe do jurídico, era essencial que a manipulação dos templates fosse a mais simples possível;
- Problemas de performance ou compatibilidade em contêiner: Vi experiências de outras equipes que sempre tinham geração de PDF como gargalo, principalmente em ambientes de alto throughput;
- Utilização de campos com valor variável: Em algumas ferramentas que me indicaram os campos parametrizados eram de tamanho fixo, deixando o resultado final feio e pouco profissional;
Quem acabou me salvando no fim das contas foi um velho amigo: o LibreOffice.
Parametrizando arquivos de texto
Uma das primeiras coisas que descobri que me deu uma luz no fim do túnel é que existe um sistema de variáveis dentro dos documentos ODT (Open Document Format - o formato padrão do LibreOffice Writer). Isso mataria um dos principais problemas que eu tinha, pois o pessoal do jurídico poderia escrever os contratos em ODT (inclusive no próprio MS Word) e meu time se responsabilizaria em parametrizar no Writer.
A primeira versão que publiquei para testes utilizava uma lib para fazer a manipulação dessas variáveis dentro do ODT e depois utilizava outra lib 100% Java para fazer a geração do PDF.
Infelizmente o resultado ficou péssimo... A geração do PDF nunca correspondia 100% ao documento original. Tabulações, margens, fontes, tudo dava algum tipo de problema.
Antes de perder as esperanças, decidi pesquisar mais um pouco. Até que descobri que o LibreOffice é ainda mais poderoso do que eu imaginava.
Gerando PDFs perfeitos através do LibreOffice
O LibreOffce possui ferramentas de linhas de comando muito interessantes, além de ferramentas que são disponíveis fora do ambiente GUI da aplicação. Uma das possibilidades é a de conversão de documentos para PDF.
Não foi muito difícil descobrir uma lib que permitia conexão fácil e segura com o LibreOffice e que permitisse gerar PDFs exatamente iguais aos gerados por dentro da aplicação já que por baixo dos panos, é o próprio LibreOffice que está fazendo tudo. Bastava apenas instalar o editor dentro do contêiner Docker e bingo! PDFs perfeitos, sem problemas de performance, sem código complexo e a partir de templates simples em ODT que qualquer um saberia editar.
Como utilizar
No repositório do projeto Pdfesto eu coloquei as principais instruções de como manipular o ODT e como utilizá-lo no serviço.
Em resumo, basta utilizar o sistema de "Váriáveis" do LibreOffice para colocar no meio do texto os campos que devem ser substituídos. Depois, basta fazer um POST para a aplicação passando o arquivo e os parâmetros através de nome/valor.
Para rodar a aplicação é simples: basta utilizar a imagem Docker disponibilizada no repositório ou compilar a aplicação para rodar (lembrando que é necessário a instalação do LibreOffice na máquina para que tudo funcione).
Importante destacar que o projeto que disponibilizei não é o mesmo que está rodando na empresa onde trabalho. Lá foi desenvolvido todo um sistema que faz o gerenciamento dos arquivos com versionamento de templates, criação de parâmetros e busca dos arquivos gerados. Mas, de qualquer forma, o coração das duas ferramentas é muito parecido e utilizam praticamente as mesmas dependências.
Enfim, não tenho intenção que isso cresça de alguma forma, se trata apenas de compartilhamento de um conhecimento (ou de uma solução) que acho que pode ser útil para outras pessoas. Dúvidas, sugestões ou comentários estou sempre à disposição :)
Link do repositório:
https://github.com/leoconon/pdfesto-service