Automatizando a Criação de Anais de Eventos com PHP, mPDF e Ferramentas Linux
Sou desenvolvedor PHP há muitos anos (desde o finado PHP 4) e, desde os primeiros desafios — como ter que definir uma variável antes mesmo de verificá-la (rsrsrs) — cada obstáculo me preparou para os problemas atuais do desenvolvimento web.
Evolução da Plataforma de Seminários Online
Desde 2019, desenvolvo uma plataforma de seminários online que, inicialmente, se limitava a gerenciar eventos e exibir aulas. Embora simples à época, com o passar dos anos novas funcionalidades foram sendo implementadas. Lembro bem do momento em que surgiu a necessidade de permitir a submissão de resumos. Tudo funcionou como mágica: feature analisada, desenvolvida e entregue. Bendito seja o mPDF!
Logo depois, enfrentamos o novo desafio de oferecer suporte à submissão de trabalhos completos. O que antes era apenas um formulário com um editor de texto precisou evoluir para aceitar arquivos nos formatos PDF e DOC (sim, o bom e velho Word). Novamente, a solução foi encontrada e implementada com sucesso:
— Feature analisada, desenvolvida e entregue.
Superando Novos Desafios com Ferramentas de Conversão e Mesclagem
Contudo, o desafio não parou por aí. Percebi que faltava incluir cabeçalho e rodapé em todas as páginas dos documentos submetidos. Mais uma vez, o mPDF mostrou sua versatilidade, possibilitando a padronização dos PDFs de forma simples e eficaz.
Mas e os arquivos DOC? Após pesquisas, descobri a biblioteca phpword/phpword, que permite ler documentos do Word e exportá-los para PDF — que, por sua vez, podem ser processados pelo mPDF.
— Feature analisada, desenvolvida e entregue.
Em seguida, surgiu um novo desafio: mesclar todos os trabalhos e resumos enviados para gerar uma revista dos anais do evento. Utilizando recursos de importação e templates do mPDF, a estratégia consistiu em agrupar os PDFs (primeiro com segundo, terceiro com quarto, e assim por diante) até formar um único arquivo. Apesar do processo demorado, o resultado final atendeu às expectativas.
Lidando com Grandes Arquivos e Timeouts
O sistema fez enorme sucesso em um evento com mais de 1000 submissões e cerca de 3000 páginas, gerando um PDF de 4GB — fruto de inúmeros timeouts e desafios técnicos. Em meio a esse cenário, surgiu um bug: um PDF com versão proprietária que comprometia o sistema, agravando os problemas.
Após muita pesquisa, encontrei a solução utilizando o Ghostscript "um verdadeiro canivete suíço para manipulação de documentos PDF":
gs -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=saida.pdf entrada.pdf
Com essa abordagem, o PDF era convertido de forma eficaz. Mas o desafio dos 4GB persistia.
Otimizando a Conversão e Compressão de Arquivos
A conversão lenta de DOC para PDF também representava um gargalo. Para contornar esse problema, adotei o LibreOffice em modo headless (sem interface gráfica) para converter documentos:
libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /caminho/de/saida /caminho/do/arquivo.docx
Essa solução reduziu significativamente a carga no PHP. Em seguida, o Ghostscript foi novamente acionado para comprimir o PDF:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -sOutputFile=/caminho/de/saida/arquivo_comprimido.pdf /caminho/de/saida/arquivo.pdf
Mesclando PDFs com QPDF
Ainda restava a necessidade de mesclar os PDFs gerados. Para isso, recorri ao QPDF, uma ferramenta de linha de comando especial que permite listar e combinar todos os arquivos de uma pasta em um novo documento:
qpdf --empty --pages /caminho/origem/*.pdf -- /caminho/destino/arquivo_mesclado.pdf
O resultado foi surpreendente: um único arquivo com milhares de páginas, totalmente personalizado para o evento e com cabeçalho e rodapé em cada página.
Conclusão e Próximos Desafios
A única etapa que ainda falta era a adição da capa e do sumário para compor uma revista completa — uma nova feature implementada (bastou salvar na mesma que os demais arquivos listando-os por primeiro).
Este relato resume minha jornada para criar, de forma 100% automatizada, uma revista dos anais de eventos. Além dessa empreitada, há outros processos — como a revisão dos trabalhos e apresentações — conversa para outro post.
Obs. Se alguém tiver sugestões para melhorar esse processo, aceito dicas!