Assinatura de documentos PDF em lote via Bash
Parte 2: Produto
Gerando o pdf
O ImageMagick faz jus ao nome, mas é bem complicado de utilizar as vezes, mas tem uma boa documentação, algo raro em muitas bibliotecas poderosas.Para o Bash o acesso ao ImageMagick é via o comando convert que faz todo tipo de coisa. No nosso caso, preciso transformar um arquivo svg em pdf mantendo as transparências do svg e com uma qualidade razoável.
Como é um único comando, o mostrarei de uma vez:
convert -density 300 -transparent white "assinatura.svg" "assinatura.pdf";
A estrutura do convert é simples de entender: 'converte entrada saída'. O -density 300 faz a saída ser 300dpi pois o padrão do convert é 72dpi, o que é bem pobre em termos de qualidade da imagem. O -transparent white foi o mais difícil de encontrar. Ele define branco como a cor transparente pois o ImageMagick não trata pdf como ele trata PNGs e tende a achatar as imagens removendo as transparências completamente. Então tive que definir uma cor transparente explicitamente.
Copiar e Colar
Agora que temos nosso pdf pronto podemos deixa o pdftk fazer o resto do serviço. O pdftk é um ferramente versátil de edição de PDFs, mas pouco utilizada em sua versão linha de comando. O tk é de toolkit, mas antigamente tinha uma versão com interface em gtk.O comando que precisamos é simples, a operação no pdftk se chama stamp (de carimbo) e colocará a assinatura em todas as páginas. Existe uma variação chamada multistamp que coloca assinaturas distintas em páginas distintas (sugiro explorar para quem quer assinar a primeira página e rubricar as outras).
pdftk "arquivo.pdf" stamp "assinatura.pdf" output "arquivo.assinado.pdf";
Pronto, simples assim.
Possíveis Problemas
Alguns problemas podem acontecer:- O arquivo de saída fica chapado: acontece porque o ImageMagick não deu conta de exportar o pdf transparente. Isso pode acontecer porque o arquivo em si não tinha a transparência ou a definição da cor estava errada.
- As cores podem ser definidas por nome, hexa ou RGB (manual ImageMagick]). O ideal é corrigir no svg e garantir que o plano de fundo seja transparente. - Exportar em png é uma forma de testar se está funcionando pois a maioria dos visualizadores de pdf não renderiza a transparência direito.
- O sed utiliza uma sintaxe simples, então seja prático quanto à string que será substituída. Eu tentei criar uma variável $DATE e deu confusão.
- O suporte é POSIX, que é bem parecido com PERL.