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.
Depois basta transformar o svg em pdf com o
convert (parte do ImageMagick) e o incorporá ao arquivo utilizando o pdftk.
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.