DT und PDF Squeezer

Hallo zusammen,

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.

Jemand eine Idee?

  • öffne den Script Editor
  • File / Open Dictionary…

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.

Das nennt man „lernen“, aber ich versuche im Laufe des Abends eine etwas hilfreichere Antwort zu präsentieren :roll_eyes:

1 Like

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.

Ja, das kann ich einstellen. Ich kann es beibehalten, oder geändert am mit dem aktuellen Time-Stamp versehen.

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.

Blanc, keine Eile… Das Skript hat keine Eile

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

Guten Morgen,

leider funktioniert es nicht. Nach der Bestätigung erscheint folgende Meldung:

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?

Und bei genau derselben Datei funktioniert alles wenn du in DT die Datei mit „Öffnen mit“ an Autokomprimierung.app schickst?

Ja genau.

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

Ja, das klappt besser. Jetzt ist nur eines.

Test mit 3 Dokumenten.

Dokument 1 - erfolgreich
Dokument 2 - läuft auf Time-Out ohne aktivität
Dokument 3 - erfolgreich

getestet mit kleinen Dateien.

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.

Hi Blanc,

sorry dass ich mich gerade nicht melde. Ich komme gerade nicht dazu es zu testen. Muss die Tage mal schauen wann ich Luft habe.

@Blanc

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 :wink: