Skip to content

Instantly share code, notes, and snippets.

@chrodriguez
Last active May 25, 2021 12:24
Show Gist options
  • Save chrodriguez/b7a5d4bf9919e352b6aee15ecb2bf93c to your computer and use it in GitHub Desktop.
Save chrodriguez/b7a5d4bf9919e352b6aee15ecb2bf93c to your computer and use it in GitHub Desktop.
Agregar una marca de agua (o firma) a un PDF con varias páginas y a su vez paginarlas

¿Por qué?

Para un trámite administrativo, tuve que presentar un único PDF compuesto por varios más, cada uno de ellos en realidad eran imágenes escaneadas que se unían en un pdf. Documentación que incluía mi Curriculum, las certificaciones de títulos y cursos scaneados, notas adjuntas, etc. Todo eso unido, foliado y con una firma mía. Para hacerlo manual, la idea era imprimir, y justo llevé la impresora a arreglar, foliar y firmar, scanear y enviar el PDF.

Uno nunca sabe por qué nos piden estas cosas, pero es en ese momento que te preguntás:

¿lo hago a mano, artesanalmente, o busco un canismo automático para resolverlo?

Como el procedimiento manual es aburrido, repetitivo y probablemente tardé lo mismo en hacerlo automático que manual, me tomé el trabajo de subirlo acá para que me quede el proceso, y la próxima no deba repetirlo

Requerimientos

  • Para convertir varias fotos en un pdf, usé convert, la CLI de iamgick
  • Para unir pdfs, pdfunite
  • Para escalar todos los pdf en A4, usé cpdf
  • Para superponer pdfs, usé pdftk, que como no lo instalé en Ubuntu, lo usé con docker
  • Usé make con un Makefile para armar el documento que tiene todos los datos que me piden, y en él genero un archivo all.pdf con todos los documentos juntos

Qué archivos se muestran

  • El Makefile
  • firmar-pdf recibe un pdf con una firma o imagen cualquiera trasnparente de una hoja, un documento con varias hojas y el pdf resultado
  • numbers.tex es un pequeño documento latex que numera hojas. Genera un PDF numerado únicamente
#!/usr/bin/env bash
set -e
command -v convert &> /dev/null || \
(echo Imagemagick convert cli required && exit 2)
SIGN=$1
INPUT=$2
OUTPUT=$3
( [ -z "$SIGN" ] || [ -z "$INPUT" ] || [ -z "$OUTPUT" ] ) && \
( echo "Debe especificarse: firma.png input.pdf output.pdf" && exit 2 )
( [ -e "$SIGN" ] && [ -e "$INPUT" ] ) || \
( echo "No puede leerse o $SIGN o $INPUT" && exit 2 )
PAGES=$( pdfinfo $INPUT | grep Pages: | cut -d: -f2 | tr -d ' ' )
TMP_OUTPUT="$OUTPUT.tmp.pdf"
docker run --rm -it -u $UID -v "$PWD":/work mnuessler/pdftk $INPUT \
stamp $SIGN output $TMP_OUTPUT
sed "s/%PAGES%/$PAGES/g" numbers.tex > numbers.tmp.tex
pdflatex numbers.tmp.tex
docker run --rm -it -u $UID -v "$PWD":/work mnuessler/pdftk $TMP_OUTPUT \
multistamp numbers.tmp.pdf output $OUTPUT
rm $TMP_OUTPUT numbers.tmp*
FILES=certificaciones.pdf autor.pdf distinciones.pdf expositor.pdf titulos.pdf
CONVERT_FLAGS=-auto-orient -quality 100 -density 200
all.pdf: $(FILES)
pdfunite $(FILES) all-pre.pdf
./cpdf -scale-to-fit a4portrait -o all.pdf all.pdf
rm all-pre.pdf
certificaciones.pdf:
convert Certificaciones/* $(CONVERT_FLAGS) certificaciones.pdf
autor.pdf:
convert Autor/* $(CONVERT_FLAGS) autor.pdf
distinciones.pdf:
convert Disticiones/* $(CONVERT_FLAGS) distinciones.pdf
expositor.pdf:
convert Expositor/* $(CONVERT_FLAGS) expositor.pdf
titulos.pdf:
pdfunite Titulos/* titulos.pdf
.PHONY: clean
clean:
rm -f $(FILES)
\documentclass[12pt,a4paper]{article}
\usepackage{multido}
\usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\lfoot{Hoja \thepage \hspace{1pt} de %PAGES%}
\begin{document}
\multido{}{%PAGES%}{\vphantom{x}\newpage}
\end{document}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment