Automatice la eliminación de la última página de un montón de archivos PDF

Tengo una carpeta que contiene cientos de archivos PDF y me gustaría eliminar la última página de cada uno de forma rápida. ¿Cómo puedo dejar que mi Mac automatice esta tarea? ¿Necesito software adicional para hacer esto?

Respuestas (1)

He hecho esto usando la versión de la comunidad de herramientas de línea de comandos de Coherent PDF .

Puede descargar las herramientas preconstruidas o el código fuente para compilar el último por su cuenta, sin embargo, este último requiere que se instale OCaml al compilar. Entonces, las herramientas preconstruidas son la forma más fácil de hacerlo. El archivo de distribución descargado, por ejemplo, cpdf-binaries-master.zip , contiene binarios para Linux, OS X/macOS y Windows y tiene un tamaño de ~5 MB.

Una vez descargado y extraído (haciendo doble clic en el archivo .zip), copiaría el archivo, p. ej., ~/Downloads/cpdf-binaries-master/OSX-Intel/cpdf , en una ubicación definida en la PATH variable de entorno , p. ej. /usr/local/bin/, en haz que esté disponible globalmente en la línea de comando en la Terminal. Si no está en el PATHentonces tendrá que usar el nombre de ruta completo al cpdfejecutable o ./cpdfsi está en el directorio de trabajo actual ( pwd). En Terminal, escriba echo $PATHpara mostrar el archivo PATH.

La sintaxis para eliminar la última página cuando el archivo PDF tiene 3 o más páginas es:

cpdf in.pdf 1-~2 -o out.pdf

La sintaxis para eliminar la última página cuando el archivo PDF tiene 2 páginas es:

cpdf in.pdf 1 -o out.pdf

Debido a cpdfque lee el archivo original ( in.pdf ) y escribe en un archivo nuevo ( out.pdf ), el nombre del archivo out.pdf debe ser diferente si se guarda en la misma ubicación que el archivo in.pdf o si se guarda en una ubicación diferente. con el mismo nombre de archivo in.pdf que el nombre de archivo out.pdf , o cualquier nombre de archivo out.pdf que desee.

A continuación, mostraré dos ejemplos de automatización cpdfpara eliminar la última página de un archivo PDF, suponiendo que tenga dos o más páginas. Uno que usa un flujo de trabajo de Automator como un servicio disponible en Finder en el menú contextual de servicios y el otro como un script , para usar en Terminal.bash


Como flujo de trabajo de servicio de Automator disponible en Finder en el menú contextual de servicios:


En Automator, cree un nuevo flujo de trabajo de servicio utilizando la configuración que se muestra en la imagen a continuación y copie y pegue el código debajo de la imagen en la acción Ejecutar script de Shell y guárdelo como, por ejemplo: Eliminar la última página de PDF

Para usar Eliminar última página de PDF , en Finder, seleccione los archivos PDF de los que desea eliminar la última página y luego seleccione Eliminar última página de PDF desde el menú contextual haciendo clic con el botón derecho o control-clic , o desde Finder > Servicios > Eliminar Última página de PDF

Flujo de trabajo de servicio de Automator


for f in "$@"; do
        # Get Page Count.
    p="$(/usr/local/bin/cpdf -info "$f" | awk '/Pages:/{print $2}')"
        # Get file extension.
    ext="${f##*.}"
        # Get filename without extension.
    fn="${f%.*}"
        # Rename original file to "filename (original).pdf".
        # Use '-n' to not overwrite an existing file.
    mv -n "$f" "${fn} (original).${ext}"
        # If page count is greater than 2, set 'p' to '3' as any
        # PDF with more than 2 pages the command will be the same.
    if [[ $p -gt 2 ]]; then
        p="3"
    fi
    case "$p" in
        3)
                # PDF file has 3 or more pages.
            /usr/local/bin/cpdf "${fn} (original).${ext}" 1-~2 -o "$f" 
            ;;
        2)
                # PDF file has 2 pages.
            /usr/local/bin/cpdf "${fn} (original).${ext}" 1 -o "$f"
            ;;
        1)
                # PDF file has 1 page. Make a copy to the
                # original name for consistency of output.
                # Use '-n' to not overwrite an existing file.
            cp -n "${fn} (original).${ext}" "$f"
            ;;      
    esac
        # If you don't want to keep the original
        # file, remove '#' from the next line.
    # rm "${fn} (original).${ext}"
done

Tenga en cuenta que la acción Ejecutar script de ShellPATH pasada en Automator es . Entonces, el código anterior está usando el nombre de ruta completamente calificado para el ejecutable , ya que es donde lo coloqué para que esté disponible en la Terminal mediante el uso de su nombre , únicamente. /usr/bin:/bin:/usr/sbin:/sbincpdf /usr/local/bin/cpdfcpdf

También tenga en cuenta que si no desea conservar los archivos originales, elimine el comentario (elimine el #del frente) del # rm "${fn} (original).${ext}" comando , justo encima de la última línea de código done .



Como bash script para usar en Terminal:


Cree el bash script de la siguiente manera:

En terminal:

touch rlpfpdf
open rlpfpdf

Copie el bloque de código , comenzando con #!/bin/bash, a continuación en el rlpfpdfdocumento abierto y luego guárdelo.

De vuelta en la Terminal:

Haga que el script sea ejecutable:

chmod u+x rlpfpdf

Ahora mueva el rlpfpdf script a, por ejemplo:/usr/local/bin/

sudo mv rlpfpdf /usr/local/bin/

Luego puede cambiar el directorio cd ...a un directorio que tenga los archivos PDF de los que desea eliminar la última página y luego simplemente escribir rlpfpdfy presionar enter.

Los archivos originales se moverán a " nombre de archivo (original).pdf " y el archivo PDF recién creado sin la última página, si tiene 2 o más páginas, tendrá el filename.pdfnombre original.


#!/bin/bash

for f in *.pdf *.PDF; do
    if [[ -f $f ]]; then
            # Get Page Count.
        p="$(cpdf -info "$f" | awk '/Pages:/{print $2}')"
            # Get file extension.
        ext="${f##*.}"
            # Get filename without extension.
        fn="${f%.*}"
            # Rename original file to "filename (original).pdf".
            # Use '-n' to not overwrite an existing file.
        mv -n "$f" "${fn} (original).${ext}"
            # If page count is greater than 2, set 'p' to '3' as any
            # PDF with more than 2 pages the command will be the same.
        if [[ $p -gt 2 ]]; then
            p="3"
        fi
        case "$p" in
            3)
                    # PDF file has 3 or more pages.
                cpdf "${fn} (original).${ext}" 1-~2 -o "$f" 
                ;;
            2)
                    # PDF file has 2 pages.
                cpdf "${fn} (original).${ext}" 1 -o "$f"
                ;;
            1)
                    # PDF file has 1 page. Make a copy to the
                    # original name for consistency of output.
                    # Use '-n' to not overwrite an existing file.
                cp -n "${fn} (original).${ext}" "$f"
                ;;      
        esac
            # If you don't want to keep the original
            #  file, remove '#' from the next line.
        # rm "${fn} (original).${ext}"
    fi
done

Tenga en cuenta que el código anterior asume que el cpdf ejecutable está en un directorio que está dentro de la PATH variable de entorno , por ejemplo:/usr/local/bin/

También tenga en cuenta que si no desea conservar los archivos originales, elimine el comentario (elimine el #del frente) del # rm "${fn} (original).${ext}" comando , justo encima de la última línea de código done .

Solo tengo 1 consulta simple. ¿Cómo puedo modificar el bloque de código para eliminar la primera página en lugar de la última?
@InterestedLearner, dentro del archivo de distribución descargado, por ejemplo, cpdf-binaries-master.zip , está el archivo cpdfmanual.pdf y en "1.2 Rangos de entrada", a partir de la página 2, se analiza esto. La sintaxis para eliminar la primera página es cpdf in.pdf 2-end out.pdfEl código proporcionado en mi respuesta a su OP es específico para eliminar la última página y no puede simplemente usarlo 2-enden lugar de 1-~2o 1dentro del script tal como está escrito. Tendrías que recodificarlo para que coincida con las condiciones. Si publica una nueva pregunta, publicaré un guión que sea propicio para las condiciones.
Hola, @user3439894, muy buena respuesta. La sintaxis cpdf in.pdf 1-~2 -o out.pdfahora también funciona para documentos de 2 páginas. Sería genial si pudieras editar tu respuesta en consecuencia. Esto simplificará mucho el guión.