Batch Mehrere PDFs umwandeln (Ghostscript)

PC295

Captain
Registriert
Apr. 2010
Beiträge
3.565
Hi,

ich möchte mit Ghostscript farbige PDFs in Graustufen-PDFs umwandeln und mit aktuellem Datum/Uhrzeit speichern.
Das sieht bisher so aus
Code:
"C:\Program Files (x86)\gs\gs9.26\bin\gswin32c.exe" ^
    -sDEVICE=pdfwrite ^
    -sProcessColorModel=DeviceGray ^
    -sColorConversionStrategy=Gray ^
    -dOverrideICC ^
    -o "C:\Users\Benutzer\Desktop\Test\Ausgang\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%.pdf" ^
    -f "C:\Users\Benutzer\Desktop\Test\Eingang\input.pdf"

Nun will ich aber, dass mehrere PDFs verschiedenster Dateinamen umgewandelt werden (letzte Zeile).
Wildcards (*.pdf) scheint Ghostscript nicht zu akzeptieren.

Filelist scheint auch nicht sinnvoll, weil die Dateinamen immer unterschiedlich sind und es umständlich wäre die PDFs vorher entsprechend umzubenennen oder das Skript anzupassen.

Wie kann ich das am besten lösen?

Grüße
 
Da GS anscheinend keine queues verwalten kann, bleibt wohl nur die Einbindung von GS in ein script. Das liest das Verzeichnis ein und startet dann mit dem jeweiligen pdf GS. Geht mit einem DOS-Powershell script oder via vbs.
 
Windows hat dank WSL jetzt auch bash / zsh -> die können auch ghostrxcript und kommen mit * klar
 
  • Gefällt mir
Reaktionen: Nase
Du könntest das mit einer For-Schleife lösen.
Liegen die umzuwandelnden PDFs alle im gleichen Verzeichnis bzw. ausschließlich die zu bearbeitenden?
for Schleife

For %%f In (c:\pdfs\*.pdf) Do $DeineCommandos

Innerhalb deines Commandos:
Bei -f musst du dann den Zielpfad und %%f nehmen, also bspw. C:\pdf_fertig\%%f
%%f
 
Ja, die PDFs kommen alle in ein Verzeichnis, in diesem Beispiel
Code:
C:\Users\Benutzer\Desktop\Test\Eingang\
bei -o steht jetzt der Ausgabepfad
bei -f ist der Eingabepfad
 
Krisenmanager schrieb:
Du könntest das mit einer For-Schleife lösen.
Da kommt nur kurz das cmd-Fenster und nichts passiert...
 
Krisenmanager schrieb:
Kannst du mal deinen kompletten Code posten?
Den habe jetzt nicht mehr, ist also erstmal wieder wie oben.

Hast du mir bitte dein Vorschlag in den Code von oben verpacken?
 
Hi, hab mir mein Geschreibsel von Gestern nochmal angesehen und glaube auch einen Fehler gemacht :(
Sollte jetzt eigentlich funktionieren, kann es aber mangels Zeit gerade nicht selbst ausführlich testen.
@echo off
for %%f in (C:\Users\Benutzer\Desktop\Test\Eingang\*.pdf) do ("C:\Program Files (x86)\gs\gs9.26\bin\gswin32c.exe" ^
-sDEVICE=pdfwrite ^
-sProcessColorModel=DeviceGray ^
-sColorConversionStrategy=Gray ^
-dOverrideICC ^
-o "C:\Users\Benutzer\Desktop\Test\Ausgang\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%.pdf" ^
-f "C:\Users\Benutzer\Desktop\Test\Eingang\%%f")
PAUSE
 
Da kommt eine Fehlermeldung:

Code:
Error: /undefinedfilename in (C:\\Users\\Benutzer\\Desktop\\Test\\Eingang\\C:\\Users\\Benutzer\\Desktop\\Test\\Eingang\\Test.pdf\))
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:977/1684(ro)(G)--   --dict:0/20(G)--   --dict:78/200(L)--
Current allocation mode is local
Last OS error: Invalid argument
GPL Ghostscript 9.26: Unrecoverable error, exit code 1
Drücken Sie eine beliebige Taste . . .
 
Heißt der Benutzer auch wirklich "Benutzer"?
Ergänzung ()

@Echo off
for %%f in ( C:\Users\Benutzer\Desktop\Test\Eingang\*.pdf) do ("C:\Program Files\gs\gs9.52\bin\gswin64c.exe" ^
-sDEVICE=pdfwrite ^
-sProcessColorModel=DeviceGray ^
-sColorConversionStrategy=Gray ^
-dOverrideICC ^
-o " C:\Users\Benutzer\Desktop\Test\Ausgang\%%~nf.pdf" ^
-f "%%f")
Ergänzung ()

So funktioniert das bei mir. Unterschied zu vorher: Ich habe die 64-Bit-Variante gewählt. Sollte keinen Unterschied machen, die habe ich aber installiert.
Am meisten Probleme hatte ich beim Testen mit deinem Output-Dateinamen.
Bei mir lief die Verarbeitung immer so schnell ab, dass die Zieldateien teilweise mehrfach überschrieben wurden, weil sich der Timestamp nicht geändert hatte. ;-)
Deshalb nehme ich als Ausgabe-Dateinamen nun den Input-Dateinamen.
 
Zuletzt bearbeitet:
Ja, da funktioniert jetzt, da hatte ich in den letzten Zeilen ein Fehler drin.
 
Zurück
Oben