Skript erstellen, um PDFs mittig zu teilen (Sejda)

Fidefux

Fidefux

Aktives Mitglied
Thread Starter
Dabei seit
17.08.2010
Beiträge
6.043
Reaktionspunkte
2.004
Hallo Leute,

nach einigen Recherchen habe ich für macOS ein Programm gefunden, mithilfe dessen ich alle Seiten einer PDF-Datei vertikal halbieren kann (zum Beispiel A3 > 2x A4). Dafür nutze ich Sejda: https://github.com/torakiki/sejda (Version 2.13, da man mit der neuen Version 3.0 nicht mehr kostenlos PDF-Dokumente teilen kann).

Nun suche ich nach einem Weg, das Ganze irgendwie zu automatisieren, sei es mit Automator oder AppleScript. Vielleicht kann mir jemand helfen, eine Lösung zu finden.

Folgende Befehle führe ich im Terminal aus, die ich so automatisieren möchte, dass ich jegliche PDF-Datei halbieren kann:

1. Ich starte im Terminal das notwendige Programm aus dem jeweiligen Verzeichnis heraus:

Code:
chmod +x bin/sejda-console
./bin/sejda-console

2. Anschließend führe ich den notwendigen Befehl aus, um das Dokument zu halbieren:

Code:
./bin/sejda-console splitdownthemiddle -f PFAD-ZUM-ORIGINALDOKUMENT.pdf -o PFAD-ZUM-ZIELORDNER

3. Anschließend lösche ich das Originaldokument per Hand.

Wie kann ich das automatisieren? Und wie kann ich es umgehen, immer den Pfadnamen manuell einzutippen?
 
  • Gefällt mir
Reaktionen: MacMac512
Interessantes Thema, ich benutze bisher immer PS zum Teilen durch Aktionen. Optimal ist das aber nicht.

Bin gespannt und hoffe auf Ideen. :)
 
Das war mir auch immer zu umständlich, insbesondere, wenn das Dokument über 100 Seiten hat!

Version 2.13 kannst du hier downloaden: https://github.com/torakiki/sejda/releases/tag/v2.13

Es ist lediglich das Installieren des Java SE Development Kits notwendig und dann kann man die PDFs ganz leicht im Terminal halbieren. Man muss eben immer die notwendigen Befehle eingeben, das ist nervig und hier hoffe ich, dass man das mit Apple Script oder Automator vereinfachen kann.
 
du könntest dir mit applescript ein droplet zum draufwerfen der pdfs bauen.
 
Das versuche ich. Zumindest habe ich es geschafft, bzw. eine passende Lösung im Internet gefunden:

Code:
property type_list : {"PDF"}
property extension_list : {"PDF"}
property post_alert : "Yes"
property passphrase : ""

on run
    display alert "PROCESSING ALERT" message "Bitte lege eine Datei auf diesem Icon ab." buttons {"Continue"}
    return "done"
end run

on open these_items
    repeat with i from 1 to the count of these_items
        set this_item to item i of these_items
        set the item_info to info for this_item
        set this_name to the name of the item_info
        set this_file to POSIX path of this_item
        try
            set this_extension to the name extension of item_info
        on error
            set this_extension to ""
        end try
        try
            set this_filetype to the file type of item_info
        on error
            set this_filetype to ""
        end try
        if (folder of the item_info is false) and (alias of the item_info is false) and ((this_filetype is in the type_list) or (this_extension is in the extension_list)) then
            process_item(this_file)
        else if post_alert is "Yes" then
            display alert "PROCESSING ALERT" message "Die Datei “" & this_name & "” kann von diesem Droplet nicht verarbeitet werden." buttons {"Continue"} default button 1 cancel button "Continue" as warning
        end if
    end repeat
end open

on process_item(this_item)
    do shell script
end process_item

#Quelle: http://bitmuncher.subnetworx.de/2014/02/04/ein-droplet-fuer-macosx-erstellen/

Jetzt kommt allerdings der knifflige Teil:

Wie bekomme ich die Terminalbefehle aus meinem Post #1 in den markierten Teil des Skripts?

Das Programm, das im Terminal aufgerufen werden soll, liegt im Home-Verzeichnis. In dieses Verzeichnis müsste das PDF-Dokument (this_item) kopiert werden, da nur hier Schreibrechte vorliegen. Grob:

1. Ausgewählte Datei muss ins Programm-Verzeichnis kopiert werden (~/sejda/)
2. Sejda müsste in diesem Verzeichnis gestartet werden
(chmod +x bin/sejda-console
./bin/sejda-console)
3. Der Halbierungsbefehl müsste aufgerufen werden
(./bin/sejda-console splitdownthemiddle -f PFAD-ZUM-ORIGINALDOKUMENT.pdf -o PFAD-ZUM-ZIELORDNER
4. Die ausgewählte Datei müsste wieder an den Ursprungsort kopiert werden und das alte Dokument gelöscht werden.
 
So langsam funktionierts, auch wenn ich vorher noch nie irgendetwas mit AppleScript zu tun hatte:

Code:
on process_item(this_item)
    set myDocumentFolder to POSIX path of (path to home folder as string)
    do shell script ("chmod +x " & myDocumentFolder & "/sejda/bin/sejda-console")
    do shell script (myDocumentFolder & "/sejda/bin/sejda-console")
    do shell script (myDocumentFolder & "/sejda/bin/sejda-console splitdownthemiddle -f " & this_item & " -o " & myDocumentFolder)
end process_item

… führt dazu, dass PDF-Dokumente (A3) automatisch halbiert werden, sobald man ein Dokument auf das Skript zieht.
 
die ersten beiden do shell scripts kannst du löschen. chmod +x muss ja nur einmalig gemacht werden (dein home ist ausserdem schon +x) und der zweite befehl macht gar nichts.
 
  • Gefällt mir
Reaktionen: Fidefux
So langsam ist das Skript, um PDF-Dokumente schnell halbieren zu können (wenn sie beispielsweise gescannt wurden), fertig. Gibt aber noch viele Baustellen – allerdings kann man jetzt die Pfade zum Speicherort und zum Programm „Sejda“ einstellen! Das mit den Loops funktioniert teilweise noch nicht richtig, sodass man zur Ersteinstellung das Skript mehrmals starten muss.

Code:
property type_list : {"PDF"}
property extension_list : {"PDF"}
property post_alert : "Anzeigen"
property pfad_sejda : {"Noch nicht festgelegt"}
property pfad_ziel : {"Noch nicht festgelegt"}

on run
   
    set loop_dialog to true
   
    repeat while loop_dialog is true
       
        display dialog "Bitte legen Sie eines oder mehrere PDF-Dokumente, die halbiert werden sollen, auf dem Symbol dieses Skripts ab." & linefeed & linefeed & "Benachrichtungen: " & (post_alert as text) & linefeed & "Pfad zu Sejda: " & (pfad_sejda as text) & linefeed & "Pfad für bearbeitete PDF-Dateien: " & (pfad_ziel as text) buttons {"Pfad-Einstellungen", "Benachrichtigungen", "Beenden"} default button 3 with title "PDF-Halbieren-Skript" with icon stop
       
        if the button returned of the result is "Pfad-Einstellungen" then
           
            set loop_einstellungen to true
           
            repeat while loop_einstellungen is true
               
                display dialog "Wählen Sie die zu ändernden Einstellung aus." & linefeed & linefeed & "Pfad zu Sejda: " & (pfad_sejda as text) & linefeed & "Pfad für bearbeitete PDF-Dateien: " & (pfad_ziel as text) buttons {"Pfad zu Sejda", "Pfad für bearbeitete PDF-Dateien", "Zurück"} default button 3 with title "Einstellungen"
               
                if the button returned of the result is "Pfad für bearbeitete PDF-Dateien" then
                   
                    set loop to true
                   
                    repeat while loop is true
                       
                        display dialog "Wo sollen die geteilten PDF-Dokumente gespeichert werden? Geben Sie den kompletten Pfad an oder wählen Sie ein Verzeichnis aus." & linefeed & linefeed & "Im Pfadnamen darf kein Leerzeichen enthalten sein." & linefeed & linefeed & "Aktueller Pfad:" & linefeed & linefeed & pfad_ziel default answer pfad_ziel buttons {"Verzeichnis wählen", "Speichern"} default button 2
                       
                        if the button returned of the result is "Verzeichnis wählen" then
                            set pfad_ziel to POSIX path of (choose folder with prompt "Speicherordner wählen")
                        else
                            set pfad_ziel to the text returned of the result
                            set loop to false
                        end if
                    end repeat
                    return pfad_ziel
                else if the button returned of the result is "Pfad zu Sejda" then
                   
                    set loop2 to true
                   
                    repeat while loop2 is true
                       
                        display dialog "Wo ist das Programm Sejda gespeichert? Geben Sie den kompletten Pfad an oder wählen Sie ein Verzeichnis aus." & linefeed & linefeed & "Im Pfadnamen darf kein Leerzeichen enthalten sein." & linefeed & linefeed & "Aktueller Pfad:" & linefeed & linefeed & pfad_sejda default answer pfad_sejda buttons {"Verzeichnis wählen", "Speichern"} default button 2
                        if the button returned of the result is "Verzeichnis wählen" then
                            set pfad_sejda to POSIX path of (choose folder with prompt "Ordner zu Sejda wählen")
                            return pfad_sejda
                           
                        else
                            set pfad_sejda to the text returned of the result
                            set loop2 to false
                        end if
                       
                    end repeat
                    return pfad_sejda
                   
                else
                    set loop_einstellungen to false
                   
                   
                end if
            end repeat
           
           
        else if the button returned of the result is "Benachrichtigungen" then
            display dialog "Soll eine Meldung angezeigt werden, wenn das zu verarbeitende Dokument kein PDF-Dokument ist?" & return & return & "Benachrichtungen: " & (post_alert as text) buttons {"Nicht anzeigen", "Anzeigen"} default button 2
            if the button returned of the result is "Anzeigen" then
                set post_alert to "Anzeigen"
            else
                set post_alert to "Nicht anzeigen"
            end if
           
           
        else if the button returned of the result is "Beenden" then
            set loop_dialog to false
           
        else
            set loop_dialog to true
            return "done"
        end if
       
    end repeat
    return "beenden"
   
end run


on open these_items
    repeat with i from 1 to the count of these_items
        set this_item to item i of these_items
        set the item_info to info for this_item
        set this_name to the name of the item_info
        set this_file to POSIX path of this_item
        try
            set this_extension to the name extension of item_info
        on error
            set this_extension to "falsch"
        end try
        try
            set this_filetype to the file type of item_info
        on error
            set this_filetype to "falsch"
        end try
       
        if ((this_filetype is in the type_list) or (this_extension is in the extension_list)) then
            process_item(this_file)
        else if post_alert is "Anzeigen" then
            display dialog "Die Datei" & linefeed & linefeed & this_name & linefeed & linefeed & "kann nicht verarbeitet werden, da es sich um kein PDF-Dokument handelt." & linefeed & linefeed & "Benachrichtungen: " & (post_alert as text) buttons {"Benachrichtigungseinstellung", "Überspringen"} default button 2 with title "PDF-Halbieren-Skript" with icon caution
            if the button returned of the result is "Benachrichtigungseinstellung" then
                display dialog "Soll eine Meldung angezeigt werden, wenn das zu verarbeitende Dokument kein PDF-Dokument ist?" & return & return & "Benachrichtungen: " & (post_alert as text) buttons {"Nicht anzeigen", "Anzeigen"} default button 2
                if the button returned of the result is "Anzeigen" then
                    set post_alert to "Anzeigen"
                else
                    set post_alert to "Nicht anzeigen"
                end if
            else
                return "done"
            end if
        end if
    end repeat
end open

on process_item(this_item)
    do shell script (pfad_sejda & "bin/sejda-console splitdownthemiddle -f " & this_item & " -o " & pfad_ziel)
end process_item
 
AppleScript ist so eine furchtbare Sprache. :) Wenn ich an die Schmerzen denke, die ich mit meinem Fernbedienungsscript von um 600 Zeilen hatte…
 
Aus diesem Grund habe ich mich nun mal mithilfe etlicher Tutorials und Internetrecherchen daran versucht, eine macOS-App zu programmieren (meine erste). Ist zwar noch nicht ganz fertig, aber funktioniert schon einmal so weit!

244.jpeg
 
Sehr cool! :)

Ich bin auf das Endprodukt gespannt und vielleicht magst du es ja dann verbreiten?
Hier wäre auf jeden Fall jemand mit starkem Interesse daran. :jaja:
 
Würde es gerne als OpenSource verfügbar machen, da auch das hinter dem Programm laufende Sejda OpenSource ist. Aber mal schauen, ist halt momentan sehr auf meine Bedürfnisse angepasst und da ich keine Ahnung habe, ob ich die Symbole (z. B.) einfach so verwenden darf und wie das mit den ganzen Lizenzen abläuft, muss ich mich erst noch in Zukunft schlau machen! Zumindest ist die App nun funktionsfähig und nächstes Wochenende wird weiter dran gearbeitet.

Kann sie dir gerne mal schicken zum Ausprobieren. Auf einem anderen Rechner konnte ich die Lauffähigkeit noch nicht überprüfen. Müsstest allerdings das Java Runtime Environment auf deinem Rechner haben, da darauf zugegriffen wird!
 
Hallo Fidefux,

Kann sie dir gerne mal schicken zum Ausprobieren.

bist du mit der App weitergekommen, dürfte ich sie auch mal ausprobieren? Das wäre genau das, wonach ich verzweifelt gesucht habe!
 
Zurück
Oben Unten