Skip to content

Instantly share code, notes, and snippets.

@bolorino
Created May 19, 2021 05:47
Show Gist options
  • Save bolorino/842f4eee023f47e31ba86cc374f38615 to your computer and use it in GitHub Desktop.
Save bolorino/842f4eee023f47e31ba86cc374f38615 to your computer and use it in GitHub Desktop.
#!/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