Assinatura de documentos PDF em lote via Bash
Na dica de hoje trago uma solução de caráter prático para quem está no trabalho remoto. Em meu emprego tenho que assinar um certo volume de documentos com alguma regularidade, por pura burocracia. Felizmente, posso fazê-lo de forma eletrônica e (muito felizmente) posso fazê-lo sem utilizar o aplicativo da Adobe. O objetivo da dica de hoje é criar um script que assina documentos automaticamente e ainda faz algumas firulas utilizando ferramentas simples como Bash e Inkscape.
Introdução e Setup
O problema
Tenho aqui um diretório cheio de PDF que precisam ser assinados por mim com alguma regularidade. Um comando para me ajudar a fazer é necessário.Adicionalmente, preciso que:
- A assinatura contenha informações da área (departamento) que está assinando;
- Data atualizada.
Eu poderia criar templates para cada tipo de documento e cada departamento, mas para a data o problema é um pouco mais embaixo. Felizmente, os arquivos SVG são compostos por texto internamente, então tudo que preciso é de um modelo geral que eu possa mudar via Bash.
Existem várias formas de editar um arquivo de texto em Bash. Na verdade existem formas demais e essa foi minha dificuldade no Stackoverflow. A maioria dos exemplos utilizava o AWK, que é bastante complexo para um problema tão simples, ou criavam implementações inteiras de cat + grep + regex. Por um milagre conheci o sed.
O comando sed é ridiculamente simples de utilizar. A sintaxe dele é:
sed "s/padrao/substituicao" alvo > saida
Então tudo que eu precisava fazer era criar um arquivo SVG com o template necessário. Essa foi a parte fácil.
Abaixo está uma amostra da imagem SVG. Minha assinatura de juiz está la, pode ser um scan, e dois campos para serem substituídos: DEPT e DATE. O primeiro será substituído por uma string, este é simples; o segundo será substituído por uma data, isso é menos simples. Disponibilizo também o SVG Original, assim vocês só precisam adaptar a assinatura e as variáveis necessárias.

Atualizando os campos no SVG
O comando DATE dá a data do sistema atualizada sem grandes problemas, mas tem a formatação mais feia do mundo. Além disto, ele dá certo com o locale atual do sistema que, no meu caso, não é português do Brasil.Então é necessário mudar o locale a cada chamada do date para que dê certo. Para isso, uma consulta ao comando locale se faz necessária.
locale --all
Este comando retorna todos os locales instalados no sistema. Existem várias strings para português do Brasil: PT-BR, PT-BR.utf8, iso. Veja qual funciona melhor para você, no meu caso foi a utf8.
Depois disto basta alterar a variável LC_TIME antes de chamar o date para ter o efeito desejado. A formatações do date podem ser consultadas com:
date --help
O comando final fica:
data=$(LC_TIME=pt_BR.utf8 date "+%A, %d de %B de %Y (%T)");
Isto nos retornará uma data no formato:
segunda, 17 de outubro de 2020 (16:08:50)
É possível mudar as capitalizações utilizando a expansões do Bash, mas isso é complicação demais para agora. Se estão interessados no caso consultem o manual do bash.
Agora podemos dar a data para o sed e utilizá-la em nosso arquivo de SVG:
sed "s/DATE/$data/" "source assinatura.svg" > "assinatura.svg";
Isto gerará um novo arquivo SVG com os campos atualizados. Para editar o departamento, o procedimento é o mesmo. Neste exemplo passarei o departamento com um parâmetro, mas sugiro consultar a dica sobre getopts se estiverem interessados em algo mais sofisticado.
sed "s/DEPT/${@}/" "source assinatura.svg" > "assinatura.svg";
Agora podemos passar para a próxima parte.