Created
May 19, 2021 05:47
-
-
Save bolorino/842f4eee023f47e31ba86cc374f38615 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# process-pdfs.sh | |
# | |
# por Jose Bolorino | |
# https://github.com/bolorino | |
# | |
################ | |
# Procesa un directorio con archivos PDF para: | |
# 1.- Separar los archivos de varias páginas en varios archivos de 1 sola página | |
# 2.- Numerar correlativamente cada PDF insertando el número en la parte superior izquierda del documento | |
# Los archivos numerados se crean en un nuevo directorio "numerados", manteniendo los originales | |
# | |
# Dependencias: | |
# exiftool, enscript, ps2pdf, pdftk, gs | |
# | |
# https://www.bolorino.net/blog/automatizando-tareas-justificaciones-publicas/#automatizando-tareas-justificaciones-publicas | |
# Creado para la oficina de Provisional Danza | |
################ | |
# Quitar la barra final de la ruta, si existe | |
PDF_PATH="${2%/}" | |
PAGES_FILE="${PDF_PATH}/pages.txt" | |
SPLITTED_PDF_PATH="${PDF_PATH}/separados" | |
OUTPUT_PDF_PATH="${PDF_PATH}/numerados" | |
dependencies=("exiftool" "enscript" "ps2pdf" "pdftk" "gs") | |
err_msg=("Hay problemas para ejecutar el script") | |
usage() { | |
echo "ESTE SCRIPT SE OFRECE SIN NINGUNA GARANTÍA Y NO HA SIDO PROBADO MÁS ALLÁ DE UN CASO DE USO PARTICULAR." 2>&1 | |
echo 'USA SIEMPRE UNA COPIA DE LOS ARCHIVOS ORIGINALES PARA PROBARLO.' | |
echo | |
echo "Uso: $(basename $0) [-ahins] directorio" | |
echo ' -h muestra esta ayuda' | |
echo ' -a procesamiento completo (crear índice, separar páginas y numerar los archivos)' | |
echo ' -i crear el indice' | |
echo ' -n numerar los PDF' | |
echo ' -s separar las páginas' | |
echo | |
echo '### Ejemplos ###' | |
echo | |
echo '# Añadir numeración consecutiva a los PDF en un directorio.' | |
echo '# Añade la numeración en la parte superior izquierda de la primera página: ' | |
echo 'process-pdfs.sh -n /ruta/directorio/pdfs' | |
echo | |
echo '# Crear un índice con los nombres de los archivos y el número de páginas de cada uno.' | |
echo '# Crea un archivo "pages.txt" en el mismo directorio de los PDF:' | |
echo 'process-pdfs.sh -i /ruta/directorio/pdfs' | |
echo | |
echo '# Separar los archivos con más de 1 página en 1 archivo por página.' | |
echo '# Mueve el archivo original al directorio "separados" y crea nuevos archivos con el sufijo -n donde n es el número de página:' | |
echo 'process-pdfs.sh -s /ruta/directorio/pdfs' | |
echo | |
exit 1 | |
} | |
if [[ ${#} -eq 0 || -z ${2} ]]; then | |
usage | |
fi | |
optstring=":ahins" | |
# No ejecutar el script si hay problemas | |
dont_run() { | |
for message in "${err_msg[@]}" | |
do | |
: | |
echo $message | |
done | |
exit 1 | |
} | |
# Crea un archivo con una lista de los PDF y el número de páginas de cada uno | |
create_pdfs_index() { | |
exiftool -T -filename -PageCount -s3 -ext pdf ${PDF_PATH} > "${PAGES_FILE}" | |
} | |
# Divide las páginas de un PDF en varios archivos | |
split_pages() { | |
gs -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${PDF_PATH}/${output_file_name}" -dFirstPage=${current_page} -dLastPage=${current_page} -sDEVICE=pdfwrite "${PDF_PATH}/${PDF_FILE}" | |
} | |
# Separar los archivos con más de una página | |
process_split() { | |
while read in; do | |
PDF_FILE=`echo "${in}" | cut -f 1 -d$'\t'` | |
PAGES=`echo "${in}" | cut -f 2 -d$'\t'` | |
if [[ ${PAGES} -gt 1 ]]; then | |
echo "${PDF_FILE} has ${PAGES} pages" | |
file_name="${PDF_FILE%.*}" | |
#ext="${PDF_FILE##*.}" | |
current_page=1 | |
for p in `seq 1 ${PAGES}`; do | |
output_file_name="${file_name}-${current_page}.pdf" | |
split_pages ${output_file_name} ${current_page} ${PDF_PATH} ${PDF_FILE} | |
let current_page++ | |
done | |
# Archivar los originales multi-página | |
mv "${PDF_PATH}/${PDF_FILE}" "${SPLITTED_PDF_PATH}/" | |
fi | |
done < "${PAGES_FILE}" | |
} | |
# Inserta el número en el PDF | |
numerate_pdf() { | |
echo "${number}" | enscript -B -f Courier-Bold14 -o- | ps2pdf - | pdftk "${PDF_PATH}/${PDF_FILE}" stamp - output "${OUTPUT_PDF_PATH}/${PDF_FILE}" | |
} | |
# Numerar los archivos | |
process_numerate() { | |
number=1 | |
for f in ${PDF_PATH}/*.pdf; do | |
PDF_FILE=$(basename "$f") | |
numerate_pdf $number $PDF_PATH $PDF_FILE $OUTPUT_PDF_PATH | |
let number++ | |
done | |
} | |
check_output_path() { | |
if [ ! -d "$OUTPUT_PDF_PATH" ]; then | |
mkdir "$OUTPUT_PDF_PATH" | |
fi | |
} | |
check_splitted_path() { | |
if [ ! -d "$SPLITTED_PDF_PATH" ]; then | |
mkdir "$SPLITTED_PDF_PATH" | |
fi | |
} | |
check_pdf_index() { | |
if [ ! -f "$PAGES_FILE" ]; then | |
create_pdfs_index | |
fi | |
} | |
# Comprobar las dependencias | |
for i in "${dependencies[@]}" | |
do | |
: | |
if [[ "$(which ${i})" = "" ]]; then | |
err_msg+=("No se ha encontrado el ejecutable ${i}") | |
fi | |
done | |
if [ ! -d "$PDF_PATH" ]; then | |
err_msg+=("El directorio indicado no existe o no es accesible") | |
fi | |
if [[ ${#err_msg[@]} -gt 1 ]]; then | |
dont_run | |
fi | |
while getopts ${optstring} arg; do | |
case ${arg} in | |
h) | |
usage | |
;; | |
a) | |
check_output_path | |
check_splitted_path | |
# Crear el índice con la cantidad de páginas por archivo | |
create_pdfs_index | |
# Separar las páginas | |
process_split | |
# Numerar | |
process_numerate | |
;; | |
i) | |
create_pdfs_index | |
;; | |
n) | |
check_output_path | |
process_numerate | |
;; | |
s) | |
check_splitted_path | |
process_split | |
;; | |
?) | |
echo "Opción no válida: -${OPTARG}." | |
echo | |
usage | |
;; | |
esac | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment