[Automator] doc(x)2pdf via Dropdown

T

thetransformer

Aktives Mitglied
Thread Starter
Dabei seit
13.07.2008
Beiträge
523
Reaktionspunkte
43
Hi,

der Thread-Titel verrät das Wesentliche: Ich habe einige tausend Word-Dokumente, sowohl .doc als auch .docx, die ich gerne in .pdf-Dateien konvertieren würde. Wichtig: Die Originaldatei selbst möchte ich behalten, damit ich nicht später wieder eine .doc erzeugen muss.

Der einfache Weg über ,Speichern unter' oder ,Drucken' ist natürlich bei der Vielzahl an Dokumenten unmöglich.
Frage also: Wie kann ich das mit Automator bewerkstelligen?

Der Workflow sollte im Idealfall so aussehen, dass ich mehrere Dateien in einem Ordner oder Unterordner markiere, einen Rechtsklick ausführe und dann im Dropdown-Menu entsprechende Funktion ausführe.

Ich habe da (als Laie!) mal was gebastelt:

Bildschirmfoto 2011-04-29 um 14.27.34.jpg

Aber das funktioniert nicht (mehrfache Kopien und keine PDF bzw. keine funktionierende.)

Bildschirmfoto 2011-04-29 um 14.29.22.jpg

Jmd. eine Idee? Oder klappt das so einfach nicht?
 
Ich hab vor langer Zeit mal ein Applescript geschrieben, das genau das macht:

Code:
(*__________drop2pdf by Pill__________*)


tell application "Finder"
	activate
	set dropfiles to selection as alias list
end tell

my convert(dropfiles)

on open dropfiles
	my convert(dropfiles)
end open

on convert(dropfiles)
	try
		repeat with dropfile in dropfiles
			set dropfilePosix to POSIX path of file dropfile
			set AppleScript's text item delimiters to {"/"}
			set savepathList to every text item of dropfilePosix
			set savepath to items 1 thru ((number of items in savepathList) - 1) of savepathList
			set savepath to savepath as string
			set AppleScript's text item delimiters to {""}
			set pathList to every item of savepath
			
			set AppleScript's text item delimiters to {"."}
			set saveList to last text item of savepathList
			set savenameList to every text item of saveList
			set savename to (first text item of savenameList)
			set AppleScript's text item delimiters to {""}
			set nameList to every item of savename
			
			tell application "Microsoft Word"
				activate
				open dropfile
			end tell
			
			tell application "System Events"
				tell process "Microsoft Word"
					keystroke "s" using {command down, shift down}
					keystroke "a" using command down
					repeat with k in nameList
						keystroke k
					end repeat
					
					keystroke "g" using {command down, shift down}
					
					repeat with k in pathList
						keystroke k
					end repeat
					
					key code 76
					repeat 3 times
						key code 48
					end repeat
					
					if second text item of savenameList is "docx" then
						repeat 8 times
							key code 125
						end repeat
					else if second text item of savenameList is "doc" then
						repeat 7 times
							key code 125
						end repeat
					else if second text item of savenameList is "rtf" then
						repeat 4 times
							key code 125
						end repeat
					else if second text item of savenameList is "txt" then
						repeat 3 times
							key code 125
						end repeat
					else
						do shell script "killall -9 'Microsoft Word'"
						display dialog "Only files of type '.docx', '.doc', '.rtf' or '.txt' are allowed."
					end if
					key code 76
					key code 76
					
				end tell
			end tell
			
		end repeat
		delay 3
		do shell script "killall -9 'Microsoft Word'"
		
	on error
		do shell script "killall -9 'Microsoft Word'"
		display dialog "Unknown Error"
	end try
end convert

Das kannst du entweder als Dienst speichern oder die Dateien per Drag&Drop auf das Programm ziehen. Du brauchst dazu Microsoft Word (bei mir klappts mit der 2011, andere Versionen sollten aber auch gehen).

PS: Da du einige 1000 Dokumente hast, rate ich dir das Skript erstmal mit wenigen Dateien auszuprobieren. Es dauert wahrscheinlich so viele Dokumente zu konvertieren.
 
Zuletzt bearbeitet:
Heho,

das klingt doch schon mal gut! Leider funktioniert es bei mir nicht - liegt aber höchst wahrscheinlich an meinen nicht vorhandenen Script-Fähigkeiten.

Ich beschreibe mal mein Vorgehen:
  • Automator öffnen
  • Dienst auswählen
  • AppleScript ausführen auswählen
  • deinen ,Text' via c&p einfügen

Dann kommt aber leider beim testen (und auch beim ausprobieren ,in echt') die Fehlermeldung: Ein unbekannter Fehler ist aufgetreten. Hast du noch einen Hinweis?

LG
 
Öffne mal den Applescript Editor (in den Dienstprogrammen) und füg dann den Text dort ein. Dann sichern unter... und dort dann unter Dateiformat "Programm" auswählen. Dann kannst du die Dateien per Drag&Drop auf das Programmsymbol konvertieren.
 
Also es passiert jetzt schon was, aber leider immer noch ohne Ergebnis.

Wenn ich die .doc auf das Programm ziehe, dann öffnet sich Word (2011), er fügt dort den Text ein und geht dann auf Ablage ...
Was dann passiert, kann ich nicht genau sagen, da es zu schnell geht. Es ertönt jedenfalls mehrfach der "Geht nicht"-Ton und er fügt jede Menge Text in einem Feld "Gehe zu Ordner" ein. Dann sagt er, "Text nicht gefunden" und bricht den Vorgang ab.

Bei .docx geht gar nix. Er sagt, AppleScript könne das nicht lesen.
 
Welche Version von Applescript hast du denn?

Hast du in den Einstellungen unter Bedienungshilfen der Zugriff für Hilfsgeräte aktiviert?

Wenns trotzdem nicht geht, probier mal, ob das geht (nur mit einer Datei, da es so ziemlich lange dauert):

Code:
(*__________drop2pdf by Pill__________*)


tell application "Finder"
	activate
	set dropfiles to selection as alias list
end tell

my convert(dropfiles)

on open dropfiles
	my convert(dropfiles)
end open

on convert(dropfiles)
	try
		repeat with dropfile in dropfiles
			set dropfilePosix to POSIX path of file dropfile
			set AppleScript's text item delimiters to {"/"}
			set savepathList to every text item of dropfilePosix
			set savepath to items 1 thru ((number of items in savepathList) - 1) of savepathList
			set savepath to savepath as string
			set AppleScript's text item delimiters to {""}
			set pathList to every item of savepath
			
			set AppleScript's text item delimiters to {"."}
			set saveList to last text item of savepathList
			set savenameList to every text item of saveList
			set savename to (first text item of savenameList)
			set AppleScript's text item delimiters to {""}
			set nameList to every item of savename
			delay 1
			tell application "Microsoft Word"
				activate
				open dropfile
			end tell
			delay 1
			tell application "System Events"
				tell process "Microsoft Word"
					keystroke "s" using {command down, shift down}
                                        delay 1
					keystroke "a" using command down
                                        delay 1
					repeat with k in nameList
						keystroke k
					end repeat
					delay 1
					keystroke "g" using {command down, shift down}
					delay 1
					repeat with k in pathList
						keystroke k
					end repeat
					delay 1
					key code 76
					repeat 3 times
						key code 48
					end repeat
					delay 1
					if second text item of savenameList is "docx" then
						repeat 8 times
							key code 125
						end repeat
					else if second text item of savenameList is "doc" then
						repeat 7 times
							key code 125
						end repeat
					else if second text item of savenameList is "rtf" then
						repeat 4 times
							key code 125
						end repeat
					else if second text item of savenameList is "txt" then
						repeat 3 times
							key code 125
						end repeat
					else
						do shell script "killall -9 'Microsoft Word'"
						display dialog "Only files of type '.docx', '.doc', '.rtf' or '.txt' are allowed."
					end if
					key code 76
					key code 76
					
				end tell
			end tell
			
		end repeat
		delay 5
		do shell script "killall -9 'Microsoft Word'"
		
	on error
		do shell script "killall -9 'Microsoft Word'"
		display dialog "Unknown Error"
	end try
end convert
 
Welche Version von Applescript hast du denn?

AppleScript-Editor
Version 2.3 (118)
AppleScript 2.1.2

Hast du in den Einstellungen unter Bedienungshilfen der Zugriff für Hilfsgeräte aktiviert?

Ja.

Wenns trotzdem nicht geht, probier mal ...

Hier spuckt er zwar keine Fehlermeldung mehr aus. Dafür erzeugt er aber keine .pdf. Hab auch schon geschaut, ob er sie falsch abspeichert. Spotlight findet jedoch auch nichts.
 
Sind irgendwelche Sonderzeichen im Dateinamen oder im Dateipfad? Probier eventuell mal eine docx Datei, in Macintosh HD liegt und einen einfachen Namen hat.

Das Skript arbeitet mit User Interface Scripting und arbeitet folgende Schritte ab:

1. Word öffnen
2. Dokument öffnen
3. Shift+Command+s (speichern)
4. Command+a (alles markieren)
5. Name eingeben
6. Shift+Command+g (Speicherpfad eingeben)
7. Speicherpfad bestätigen
8. Dateiformat (PDF) auswählen
9. Bestätigen
10. Speichern
11. Schließen

Wie weit kommt das Skript denn bei dir?
 
Hallo!

Die Aktionen stammen noch aus Office 2008. Es war wohl geplant, dass sie wenigstens bis Version Word 14.0 funktionieren ... aber zumindest die Konvertierung zu PDF scheint nicht mehr zu funktionieren.
Da nutzt es auch nichts, einen alternativen Workflow mit der Aktion "Word-Dokument speichern" (sichern unter -> Format:pDF) zu erstellen.
Das wird wohl irgendwann mit einem Update gefixt werden.

Zum geposteten AppleScript: Es wurde von Pill "vor langer Zeit" erstellt. Mittlerweile kann Word ein wenig AppleScript und solch ein GUI-Script ist gar nicht mehr nötig :)
Im Anhang ein AppleScript Droplet.
Hier auch als Automator Code (Aktion "AppleScript ausführen")

Code:
property theList : {"doc", "docx"}

on run {input, parameters}
    set output to {}
    tell application "Microsoft Word" to set theOldDefaultPath to get default file path file path type documents path
    repeat with x in input
        try
            set theDoc to contents of x
            tell application "Finder"
                set theFilePath to container of theDoc as text
              
                set ext to name extension of theDoc
                if ext is in theList then
                    set theName to name of theDoc
                    copy length of theName to l
                    copy length of ext to exl
                  
                    set n to l - exl - 1
                    copy characters 1 through n of theName as string to theFilename
                  
                  
                  
                    set theFilename to theFilename & ".pdf"
                  
                    tell application "Microsoft Word"
                        set default file path file path type documents path path theFilePath
                        open theDoc
                        set theActiveDoc to the active document
                        save as theActiveDoc file format format PDF file name theFilename
                        copy (POSIX path of (theFilePath & theFilename as string)) to end of output
                        close theActiveDoc
                    end tell
                end if
            end tell
        end try
    end repeat
    tell application "Microsoft Word" to set default file path file path type documents path path theOldDefaultPath
  
  
    return output
end run

Gruß
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Pill
Also es tut mir ja wirklich leid, aber auch das funktioniert nicht.

Ich habe es auch mit deinem mitgelieferten Programm versucht. Dort erscheint zwar keine Fehlermeldung, aber er produziert einfach keine PDF.

Wenn ich es selbst versuche (egal ob Automator oder AppleScript), heisst es: Die Variable „theFiles“ ist nicht definiert.

Bin ich einfach nur zu blöd?!
 
Langsam hab ich den Verdacht, es liegt an deinen Dokumenten, an deinem Word oder an dir. Kannst du die Dokumente denn normal mit Word als PDF speichern?
 
:)

Also ich hab WordForMac 2011 drauf.
Version 14.1.0 (110310)

Damit arbeite ich ganz normal (neben Pages/iWork) und läuft alles problemlos. Ich erstelle meistens normale *.doc-Dateien, weil *docx ja noch nicht sonderlich weit verbreitet ist. Oder ich erstelle direkt *.pdf-Dateien. Je nachdem, ob ich an der Datei noch weiter arbeiten , oder ob ich sie jemandem zuschicken muss.

Es funktioniert auch ganz normal, wenn ich eine *.doc öffne und via Drucken>PDF manuell konvertiere. Aber das ist bei der Anzahl an Dateien so nahezu unmöglich.
 
geht denn das hier (Da musst du den Pfad zur Textdatei eintragen):

Code:
tell application "Microsoft Word" to set theOldDefaultPath to get default file path file path type documents path
set x to "Macintosh HD:Users:Benutzername:Desktop:test.docx" as alias -- !!! hier den richtigen Pfad eintragen !!!
set theDoc to contents of x
tell application "Finder"
	set theFilePath to container of theDoc as text
	
	set ext to name extension of theDoc
	set theName to name of theDoc
	copy length of theName to l
	copy length of ext to exl
	
	set n to l - exl - 1
	copy characters 1 through n of theName as string to theFilename
	
	
	
	set theFilename to theFilename & ".pdf"
end tell
tell application "Microsoft Word"
	set default file path file path type documents path path theFilePath
	open theDoc
	set theActiveDoc to the active document
	save as theActiveDoc file format format PDF file name theFilename
	close theActiveDoc
end tell
tell application "Microsoft Word" to set default file path file path type documents path path theOldDefaultPath
 
Upps.
Das Droplet sollte funktionieren und die PDF im gleichen Ordner ablegen, in dem die Originale liegen.
Das Automator Skript konnte nicht funktionieren, da ich den "falschen" Code eingefügt hatte. Sorry.

Ansonsten, wie in deinem Workflow:
• Finder Objekte auswählen/angeben
• Eventuell Finder-Objekte kopieren
• Aktion AppleScript ausführen (mit dem "richtigen" Code)

Du hast etwas von Dienst geschrieben.
Dienst: Ausgewählte Dateien oder Ordner in Finder
• Aktion Ordnerinhalt abfragen (dann kannst du auch den Ordner anwählen, in dem die Files liegen)
• Aktion AppleScript ausführen

Gruß
 
Also ich habe das Droplet eben ausprobiert. Funktioniert einwandfrei mit Word 2011.
@thetransformer Man könnte auch sein eigenes Droplet erstellen. Word fügt eigene Automatoraktionen dem Automator hinzu.
@varuna könntest du das Droplet so modifizieren, das man den Speicherort des erstellten PDF selbst auswählen kann und die PDF nicht im selben Ordner wie die doc Datei abgespeichert wird. Sollte das möglich sein, wenn du das neu erstellte Droplet noch mal als Download zur Verfügung stellen könntest...
 
EDIT:
Ich habe den Automator Ablauf erneut korrigiert, so dass die PDFs an eventuelle nachfolgende Aktionen übergeben werden
Auch die angehängten Droplets in #9 und #17 habe ich ausgetauscht.

Gruß
 
@ varuna: Droplet funktioniert wunderbar. Nur ein Problem für mich...
Wenn ich das erstellte PDF an eine Anwendung wie z.B. Devonthink Pro oder Abby Finereader per Ordneraktion übergebe um einen automatischen OCR Scan durchführen zu lassen wird das neue PDF File immer unter dem Namen z.B. (Originalname war Macuser.doc) Microsoft Word-Macuser.pdf abgespeichert.
Gehe ich auf das file und hole mir die Information steh im Titel immer der Zusatz Microsoft Word mit bei. Der Name ist richtig. Leider nimmt die OCR Anwendung zur Weiteren Verarbeitung immer den Titel des Dokumentes und nicht den Namen. Es ist (wäre) ziemlich mühselig die eben automatisch generierten Dateien einzeln wieder umzubenennen.
Ein Lösungsansatz könnte sein das PDF über das Droplet nicht über die "Speichern unter" sondern über die "Datei drucken" Funktion zu erstellen.
Könntest du das bitte nochmal abchecken ab das möglich ist.
Danke
 
Hallo!

Das entspricht ungefähr dem Ablauf des eingangs von Pill geposteten Skriptes. (#2 und #6)

Ansonsten:
Schau dir mal den Automator an. ;)
Damit kannst du deine PDFs "automatisiert" umbenennen und den Zusatz "Microsoft Word" im Namen entfernen.
Sogar im Titel des PDF wäre es möglich. Da aber leider nicht automatisiert (sondern "händisch")

Gruß
 
Zurück
Oben Unten