Automatisieren Sie das Entfernen der letzten Seite einer Reihe von PDFs

Ich habe einen Ordner mit Hunderten von PDFs und möchte die letzte Seite von jedem schnell entfernen. Wie kann ich meinen Mac diese Aufgabe automatisieren lassen? Benötige ich dafür zusätzliche Software?

Antworten (1)

Ich habe dies mit dem Coherent PDF Command Line Tools Community Release gemacht .

Sie können entweder die vorgefertigten Tools oder den Quellcode herunterladen , um letzteres selbst zu kompilieren, letzteres erfordert jedoch, dass OCaml beim Kompilieren installiert wird. Die vorgefertigten Tools sind also der einfachste Weg. Die heruntergeladene Distributionsdatei, z. B. cpdf-binaries-master.zip , enthält Binärdateien für Linux, OS X/macOS und Windows und ist ~5 MB groß.

Nach dem Herunterladen und Extrahieren (Doppelklick auf die .zip-Datei) kopieren Sie die Datei, z. B. ~/Downloads/cpdf-binaries-master/OSX-Intel/cpdf , an einen Speicherort, der in der PATH Umgebungsvariable definiert ist , z. B. /usr/local/bin/to machen Sie es global auf der Befehlszeile in Terminal verfügbar. Wenn es sich nicht in befindet, PATHmüssen Sie den vollständig qualifizierten Pfadnamen zur cpdfausführbaren Datei verwenden oder ./cpdfwenn es sich im aktuellen Arbeitsverzeichnis ( pwd) befindet. Geben Sie im Terminal echo $PATHso show the PATH.

Die Syntax zum Entfernen der letzten Seite, wenn die PDF-Datei 3 oder mehr Seiten hat, lautet:

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

Die Syntax zum Entfernen der letzten Seite, wenn die PDF-Datei 2 Seiten hat, lautet:

cpdf in.pdf 1 -o out.pdf

Da cpdfdie Originaldatei ( in.pdf ) gelesen und in eine neue Datei ( out.pdf ) geschrieben wird, muss der Dateiname out.pdf anders sein, wenn er am selben Speicherort wie die Datei in.pdf gespeichert wird , oder an einem anderen Speicherort gespeichert wird mit dem gleichen in.pdf- Dateinamen wie der out.pdf- Dateiname , oder wie auch immer Sie wollen.

Unten zeige ich zwei Beispiele für die Automatisierung, die verwendet wird, cpdfum die letzte Seite einer PDF-Datei zu entfernen, vorausgesetzt, sie hat zwei oder mehr Seiten. Einer verwendet einen Automator- Workflow als Dienst , der im Finder im Kontextmenü der Dienste verfügbar ist , und der andere als bash Skript zur Verwendung in Terminal.


Als Automator-Dienst-Workflow verfügbar im Finder im Dienste-Kontextmenü:


Erstellen Sie in Automator einen neuen Service-Workflow mit den Einstellungen wie im Bild unten gezeigt und kopieren Sie den Code unter dem Bild in die Aktion Shell-Skript ausführen und speichern Sie ihn als zB: Letzte Seite aus PDF entfernen

Um Letzte Seite aus PDF entfernen zu verwenden , wählen Sie im Finder die PDF-Dateien aus, aus denen Sie die letzte Seite entfernen möchten, und wählen Sie dann Letzte Seite aus PDF entfernen aus dem Kontextmenü per Rechtsklick oder Control-Klick oder aus Finder > Dienste > Entfernen Letzte Seite aus PDF

Automator-Dienst-Workflow


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

Beachten Sie, dass die PATHübergebene Aktion Shell-Skript ausführen in Automator . Der obige Code verwendet also den vollständig qualifizierten Pfadnamen zur ausführbaren Datei , da ich ihn dort platziert habe, damit er im Terminal nur über seinen Namen verfügbar ist ./usr/bin:/bin:/usr/sbin:/sbincpdf /usr/local/bin/cpdfcpdf

Beachten Sie auch, dass Sie, wenn Sie die Originaldateien nicht behalten möchten, den Befehl direkt über der letzten Codezeile auskommentieren# (das von davor entfernen) .# rm "${fn} (original).${ext}" done



Als bash Skript zur Verwendung in Terminal:


Erstellen Sie das bash Skript folgendermaßen:

Im Terminal:

touch rlpfpdf
open rlpfpdf

Kopieren Sie den Codeblock beginnend mit #!/bin/bashunten in das geöffnete rlpfpdfDokument und speichern Sie es anschließend.

Zurück im Terminal:

Machen Sie das Skript ausführbar:

chmod u+x rlpfpdf

Verschieben Sie nun das rlpfpdf Skript z. B. nach:/usr/local/bin/

sudo mv rlpfpdf /usr/local/bin/

Sie können dann das Verzeichnis cd ...in ein Verzeichnis ändern, das die PDF-Dateien enthält, aus denen Sie die letzte Seite entfernen möchten, und dann einfach eingeben rlpfpdfund drücken enter.

Die Originaldateien werden nach " Dateiname (Original).pdf " verschoben und die neu erstellte PDF-Datei ohne die letzte Seite, wenn 2 oder mehr Seiten vorhanden sind, wird den ursprünglichen filename.pdfNamen haben.


#!/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

Beachten Sie, dass der obige Code davon ausgeht, dass sich die cpdf ausführbare Datei in einem Verzeichnis befindet , das sich innerhalb der PATH Umgebungsvariablen befindet , z. B.:/usr/local/bin/

Beachten Sie auch, dass Sie, wenn Sie die Originaldateien nicht behalten möchten, den Befehl direkt über der letzten Codezeile auskommentieren# (das von davor entfernen) .# rm "${fn} (original).${ext}" done

Ich habe nur 1 einfache Anfrage. Wie kann ich den Codeblock ändern, um die erste Seite anstelle der letzten zu entfernen?
@InterestedLearner, In der heruntergeladenen Distributionsdatei, z. B. cpdf-binaries-master.zip , befindet sich die Datei cpdfmanual.pdf und unter "1.2 Input Ranges", beginnend auf Seite 2, wird dies besprochen. Die Syntax zum Entfernen der ersten Seite lautet: cpdf in.pdf 2-end out.pdfDer Code in meiner Antwort auf Ihr OP ist spezifisch für das Entfernen der letzten Seite und Sie können nicht einfach 2-endanstelle 1-~2oder 1innerhalb des Skripts verwenden , wie es geschrieben ist. Sie müssten es neu codieren, um den Bedingungen zu entsprechen. Wenn Sie eine neue Frage stellen, poste ich ein Skript , das den Bedingungen entspricht.
Hey, @user3439894, sehr nette Antwort. Die Syntax cpdf in.pdf 1-~2 -o out.pdffunktioniert jetzt auch für 2-seitige Dokumente. Es wäre großartig, wenn Sie Ihre Antwort entsprechend bearbeiten könnten. Dies vereinfacht das Skript erheblich.