kennt jemand dieses App PDF Squeezer, mit dem man seine PDF’s easy komprimieren kann. Falls ja, würde es mich interessieren ob man hierzu ggf. ein Applescript machen kann.
Jetzt ist es so, dass ich die Dateien mit rechts anklicke - öffnen mit PDF Squeezer - er komprimiert bei mir dann automatisch mit dem mittleren Profil (also das 1. selektierte in der Reihenfolge) - danach muss ich auf Speichern klicken, und in DT ist dann das große PDF durch das komprimierte ersetzt.
Funktioniert wunderbar. Dieses würde ich aber gerne auf alle meine älteren PDF’s machen, daher die Frage ob man das mittels Skript machen könnte. Dazu habe ich einen intelligenten Ordner angelegt mit “Art ist PDF/PS” und “Tag ist nicht -komprimiert-”.
Das skript sollte dann diese Dokumente der Reihe nach einzeln komprimieren, nach dem Komprimierungsvorgang mit dem Tag -komprimiert- versehen, damit das File nicht ein zweites mal versucht wird zu komprimieren.
Schau, ob es im Dictionary einen Eintrag für die (bei dir installierte) App “PDF Squeezer” gibt. Wenn nicht, ist die App nicht scriptfähig. Das ist aber Voraussetzung für einen sauberen Ablauf.
Ist die App nicht scriptfähig kannst du im Prinzip mit einem Skript DT mitteilen, dass die Datei mit der externen App “PDF Squeezer” geöffnet werden soll, die Interaktion mit der App müsstest du dann aber z.B. über Tastenkombinationen (mittels System Events) durchführen. Das ist zumindest für Batchprocessing m.E. nicht ausreichend zuverlässig.
Bei beiden Verfahren würdest du eine Schleife einbauen die im Wesentlichen sagt “warte solange die Datei noch das ursprüngliche Modifikationsdatum hat”. Es ist sicher sinnvoll den Stepper, den Cancel button und die Cancel action in dein Skript mit einzuarbeiten.
D.h.
Befehl an DT: öffne die Datei in PDF Squeezer
Befehl an DT: bleibe in Warteschleife bis sich Datei ändert oder Abbruch
Befehl an PS: komprimiere
Befehl an PS: speichere
Befehl an DT: Tag setzen
Befehl an DT: Wiederhole
Nachtrag: “Nutzer mit Basteldrang können auch die neue Automator-Aktion in ihre bestehenden oder neuen Automatisierungen einbauen oder PDF Squeezer über das umfangreiche Kommandozeilenprogramm ansprechen.” (Quelle); wenn das Program über Shell angesprochen werden kann, wäre das auch ein weg - entsprechende Shell-Befehle kannst du über AS auslösen. Das wäre dann im Prinzip:
Befehl an DT: Bearbeite Datei mit Shell (Befehl an Shell bearbeite Datei mit PS)
Befehl an DT: bleibe in Warteschleife bis sich Datei ändert oder Abbruch
Befehl an DT: Tag setzen
Befehl an DT: Wiederhole
Und es versteht sich von selbst, dass dein Skript dann erstmal auf eine Testdatenbank angewandt werden sollte.
Das App ist nicht Skriptfähig, aber Automator-Fähig.
Ich habe jetzt ein Automator-App (mein name der App → Autokomprimierung.app) erstellt, welches mit der gewünschten Komprimierung komprimiert. Dieses Automator-App ist in der Open Dictionary skriptfähig.
Öffne ich eine Datei mit rechtklick - anderes Programm - Autokomprimierung.app, dann komprimiert er die Datei wie gewünscht ohne weitere Interaktionen vollautomatisch.
jetzt müsste ich nur das Skript machen.
Befeht an DT: Öffne Datei mit Autokomprimierung.app
Befehl an DT: Bleibe in Warteschleife bis sich Datei ändert oder Abbruch
Befehl an DT: Tag setzen
Befehl an DT: Wiederhole
Und wie mache ich das? Bin kein Programmierer, brauche immer Starthilfe oder ich muss stunden- bzw. tagelang googeln bis ich die Skripte fertig habe.
Wenn du das mit einer Datei aus DT raus mit Öffnen mit Autokomprimierung.app probierst, ändert sich dann das Modifikationsdatum der Datei in DT? Nur, dass ich weiß welche Warteschleife wir brauchen.
Vielleicht einen Timeout von 60 Sekunden einbauen, denn ich habe gerade gesehen, wenn ich ein PDF mittels Autokomprimierung.app starte, welches er mit den Komprimierungseinstellungen nicht stärker komprimieren kann, dann macht er nichts und beendet sich erwartungsgemäß.
Der Timeout sollte dazu dienen, dass er dann einfach mit dem nächsten Dokument weiter macht, und das übersprungene Dokument nicht mit dem Tag versehen soll.
Mit der Annahme, dass Autokomprimierung als App erkannt wird (und ich nehme an das wird es wenn es im Ordner liegt, wo sonst alle anderen Apps liegen), müsste das folgende funktionieren. Ich habe es mit Acrobat ausprobiert, dort händisch eine Datei komprimiert und gespeichert, und das ganze hat funktioniert. Ich kann das Script aber so wie es hier steht nicht testen.
Nochmal: bitte unbedingt mit einer Testdatenbank ausprobieren. Deine Smart Rule entscheidet darüber, welche Dateien dem Skript geschickt werden - ist deine Smart Rule falsch, werden auch die falschen Dateien bearbeitet.
on performSmartRule(theRecords)
tell application id "DNtp"
try
set theName to name of first item in theRecords
set theResponse to display dialog "Autokomprimierung von '" & theName & "' und " & ((count of theRecords) - 1) & " weiteren Dokumenten. Diese Manipulation kann nicht rückgängig gemacht werden!" with title "PDF Autokomprimierung" buttons {"Fortfahren", "Abbrechen"} default button "Abbrechen"
if button returned of theResponse is "Abbrechen" then
error number -128
else
show progress indicator "Komprimiere PDFs" cancel button 1 steps count of theRecords
repeat with theRecord in theRecords
if cancelled progress then error number -128
step progress indicator (name of theRecord) as string
set c to 0
set theTags to tags of theRecord
set referenceSize to size of theRecord
set currentSize to size of theRecord
set thePath to path of theRecord as string
tell application "Autokomprimierung"
open (thePath as POSIX file)
end tell
repeat while currentSize is equal to referenceSize
if cancelled progress then error number -128
delay 0.5
set c to c + 0.5
if c > 60 then exit repeat
set currentSize to size of theRecord
end repeat
if c < 60.5 then
set theTags to theTags & "-komprimiert-"
set tags of theRecord to theTags
end if
end repeat
end if
on error error_message number error_number
hide progress indicator
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
end try
hide progress indicator
end tell
end performSmartRule
In der Aktivitätsanzeige sehe ich das die App gestartet wurde. Jedoch mit einer CPU Auslastung von 90-98%, was auf eine aktuell laufende Komprimierung (einer recht großen PDF Datei) hinweist. Die Komprimierung wird jedoch nicht durchgeführt und die App wird auch nicht beendet und muss in der Aktivitätsanzeige “hart” beendet werden.
PS: Ich verwende für den Test mit Absicht ein paar größere Dateien, sonst geht alles viel zu schnell und kann nicht vernünftig nachgeprüft werden.
Tags werden auch nicht vergeben.
Meine Laienhafte Vermutung liegt daran, der App zu sagen dass diese einen Pfad öffnen soll welches es nicht kann. Die Automator Action sagt nämlich folgendes:
Bedeutet das, dass die App eine Datei erwartet und keinen Pfad um diese bearbeiten zu können? Oder muss ich hier die Automation ändern welche dann irgendwie einen POSIX Path öffnet?
Probiers mal hiermit (so erhält die Autokomprimierung.app kein Scriptbefehl mehr):
on performSmartRule(theRecords)
tell application id "DNtp"
try
set theApp to "Autokomprimierung"
set theName to name of first item in theRecords
set theResponse to display dialog "Autokomprimierung von '" & theName & "' und " & ((count of theRecords) - 1) & " weiteren Dokumenten. Diese Manipulation kann nicht rückgängig gemacht werden!" with title "PDF Autokomprimierung" buttons {"Fortfahren", "Abbrechen"} default button "Abbrechen"
if button returned of theResponse is "Abbrechen" then
error number -128
else
show progress indicator "Komprimiere PDFs" cancel button 1 steps count of theRecords
repeat with theRecord in theRecords
if cancelled progress then error number -128
step progress indicator (name of theRecord) as string
set c to 0
set theTags to tags of theRecord
set referenceSize to size of theRecord
set currentSize to size of theRecord
set thePath to path of theRecord as string
do shell script "open " & quoted form of thePath & " -a " & quoted form of theApp
repeat while currentSize is equal to referenceSize
if cancelled progress then error number -128
delay 0.5
set c to c + 0.5
if c > 60 then exit repeat
set currentSize to size of theRecord
end repeat
if c < 60.5 then
set theTags to theTags & "-komprimiert-"
set tags of theRecord to theTags
end if
end repeat
end if
on error error_message number error_number
hide progress indicator
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
end try
hide progress indicator
end tell
end performSmartRule
Ich nehme an, dass die App “Autokomprimierung” sich noch nicht geschlossen hat bevor die nächste Schleife versucht sie das nächste mal zu initiieren. Daher folgender Versuch:
on performSmartRule(theRecords)
tell application id "DNtp"
try
set theApp to "Autokomprimierung"
set theName to name of first item in theRecords
set theResponse to display dialog "Autokomprimierung von '" & theName & "' und " & ((count of theRecords) - 1) & " weiteren Dokumenten. Diese Manipulation kann nicht rückgängig gemacht werden!" with title "PDF Autokomprimierung" buttons {"Fortfahren", "Abbrechen"} default button "Abbrechen"
if button returned of theResponse is "Abbrechen" then
error number -128
else
show progress indicator "Komprimiere PDFs" cancel button 1 steps count of theRecords
repeat with theRecord in theRecords
if cancelled progress then error number -128
step progress indicator (name of theRecord) as string
set c to 0
set theTags to tags of theRecord
set referenceSize to size of theRecord
set thePath to path of theRecord as string
do shell script "open " & quoted form of thePath & " -a " & quoted form of theApp
delay 2
set appRunning to true
repeat while appRunning is true
delay 0.5
if application "Autokomprimierung" is not running then set appRunning to false
end repeat
set currentSize to size of theRecord
if currentSize is not equal to referenceSize then
set theTags to theTags & "-komprimiert-"
set tags of theRecord to theTags
end if
end repeat
end if
on error error_message number error_number
hide progress indicator
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
end try
hide progress indicator
end tell
end performSmartRule
Falls das nicht funktioniert, geh zurück zu dem was wir bisher hatten und ändere versuchsweise diese Schleife
if c < 60.5 then
set theTags to theTags & "-komprimiert-"
set tags of theRecord to theTags
end if
in
if c < 60.5 then
set theTags to theTags & "-komprimiert-"
set tags of theRecord to theTags
delay 5
end if
Falls es dann geht kannst du mit der Zahl 5 nach unten experimentieren.
Also das Skript läuft, ich habe nur noch ein delay 5 eingebaut, und zwar zwischen
end repeat
und
set currentSize to size of theRecord
Das Problem war/ist, dass er zu schnell den Entry überprüft, und noch keine Änderung der Dateigröße erkennt und somit das Tag nicht setzt. Mit dem Delay gebe ich dem Speicher- und Aktualisierungsvorgang in DT etwas Zeit, dann passen die Tags.
Vielleicht hast Du noch eine andere Idee dazu, aber soweit funktioniert das Skript aktuell für mich
ich bin der Entwickler von PDF Squeezer und gerade auf diesen Thread gestoßen.
PDF Squeezer bietet eine Automator-Aktion, ein Kommandozeilenprogramm und Kurzbefehle-Aktionen. Damit sollte es wesentlich einfacher sein das gewünschte Ergebnis zu bekommen, ohne es umständlich über die App selbst zu skripten.