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.

[ Hits: 4.901 ]

Por: Bruno Rafael Santos em 30/12/2022 | Blog: https://cutt.ly/4H7vrPh


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.
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.

    Próxima página

Páginas do artigo
   1. Introdução e Setup
   2. Produto
   3. Script Final
Outros artigos deste autor

Cronogramas e gestão do tempo com o LibreOffice Calc

Campos no LibreOffice: usos e abusos

GNU Parallel: criando atividades em paralelo com shell script

Defesa pessoal com o GPG, Nautilus Scripts, partições encriptadas e leves doses de paranoia

Tutorial GIMP: Preparando mapas para artigos científicos

Leitura recomendada

Extracttext - como extrair texto de uma área selecionada da tela

Liberar navegação para Speedy Home

Como programar backup com rsync e cron de maneira rápida e simples

O comando tput

Executando backup do MySQL e enviando por FTP

  
Comentários
[1] Comentário enviado por fabio em 30/12/2022 - 21:19h

Muito bom! Bash é vida rsrs

[2] Comentário enviado por maurixnovatrento em 01/01/2023 - 18:23h


Isso aí é bom demais. Ótimo artigo.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10

[3] Comentário enviado por adrianoh2 em 04/01/2023 - 09:54h

Excelente solução. Realmente prático! - Vou adaptar para meu uso!
Acredito que exista uma função "estilo ALPHA" para o background do Imagetrick, que pode facilitar problemas com cortes em partes semi-preenchidas da assinatura.
No geral, ele apaga tudo que é branco, e as vezes, nem sempre fica 100%.
Aqui uma solução que pode retirar "aos poucos" o fundo branco, para problemas com assinaturas muito finas, com muitos detalhes, ou que foram erroneamentes cortadas.
Da forma abaixo, você pode ir proporcionalmente.
https://stackoverflow.com/questions/9155377/set-transparent-background-using-imagemagick-and-command...

Valeu, excelente material!



Entrega o teu caminho ao Senhor; confia nele, e ele o fará. - Salmos 37:5
Tava bão, ocê veio, fico mió!

[4] Comentário enviado por santosbrc em 05/01/2023 - 21:53h


[3] Comentário enviado por adrianoh2 em 04/01/2023 - 09:54h

Excelente solução. Realmente prático! - Vou adaptar para meu uso!
Acredito que exista uma função "estilo ALPHA" para o background do Imagetrick, que pode facilitar problemas com cortes em partes semi-preenchidas da assinatura.
No geral, ele apaga tudo que é branco, e as vezes, nem sempre fica 100%.
Aqui uma solução que pode retirar "aos poucos" o fundo branco, para problemas com assinaturas muito finas, com muitos detalhes, ou que foram erroneamentes cortadas.
Da forma abaixo, você pode ir proporcionalmente.
https://stackoverflow.com/questions/9155377/set-transparent-background-using-imagemagick-and-command....

Valeu, excelente material!



Entrega o teu caminho ao Senhor; confia nele, e ele o fará. - Salmos 37:5
Tava bão, ocê veio, fico mió!



Eu sofri bastante para achar esse comando. Deve ter sim uma solução melhor no ImageMagick. Coloquei a assinatura em um fundo diferente para evitar este tipo de problema, isso evita que o ImageMagick peque tudo de forma indiscriminada.

[5] Comentário enviado por CerberusBH em 13/01/2023 - 09:16h

Excelente! Meus parabéns!
Salvei nos meus favoritos!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts