PDF-Dateien in vielen Unterordnern mit PDFTK zusammenfügen und umbenennen
Dokumenten/Schaltplan-Archivierung über Kopier/Scaneinheit legt automatisch PDF-Dateien an. Diese werden dann auf einen FTP-Server (derzeit ein Laptop) geladen und von Hand in entsprechende Ordner abgelegt. Dabei wird jede einzelne Seite als einzelne PDF-Datei gespeichert.
Hallo erstmal,
ich habe folgendes Problem:
PDF-Dateien liegen in vielen verschiedenen Unterverzeichnissen und sollen zusammengefügt werden, aber immer nur in der untersten Verzeichnisebene. Das sieht derzeit so aus:
FTP-ROOT -----> Hier werden die Daten vom Kopierer abgelegt und händisch in die Unterordner einsortiert
1983 -----> Maschinenbaujahr (von 1980-1998 evtl. kommen andere dazu, der Ordner "Andere" zählt separat)
5958 - Lenzen -----> Die Kom.-Nr. der Maschine und der Kundenname evtl. weitere Daten wie Maschinentyp durch Leerzeichen und "-" getrennt
124584252_1.pdf -----> Die Dateien im Ordner mit der Maschinen-Nr. - Die lange Nr. ist die Scan-Job-Nr. und bleibt je Ordner gleich, die einzelnen Seiten werden alle fortlaufend nummeriert mit "_Nr."
124584252_2.pdf
124584252_3.pdf
Habe leider kaum/keine Erfahrung mit Find, FindStr und For welche ich den anderen Batch-Dateien nach benutzen sollte.
Da die ganze Archivierungsgeschichte seit gestern angelaufen ist und ich noch einen Berg anderer Arbeiten habe kann ich mich leider zeitlich nicht ausführlich mit dem Thema beschäftigen und einarbeiten, und benötige innerhalb der nächsten 1-2Wochen eine brauchbare Lösung.
Hier noch ein Bild wie die derzeitige Ordnerstruktur ist:
Zusammensetzen der Dateien mit PDFTK sollte sich folgendermaßen ergeben, damit der Ordnername auf die Datei übertragen wird: PDFTK 124584252_1.pdf 124584252_2.pdf 124584252_3.pdf CAT "5958 - Lenzen.pdf"
Ich wäre über jeden praxisnahen Vorschlag und vor allen Dingen Beispielen dankbar.
freundliche Grüße
AlterSchuljunge
Hallo erstmal,
ich habe folgendes Problem:
PDF-Dateien liegen in vielen verschiedenen Unterverzeichnissen und sollen zusammengefügt werden, aber immer nur in der untersten Verzeichnisebene. Das sieht derzeit so aus:
FTP-ROOT -----> Hier werden die Daten vom Kopierer abgelegt und händisch in die Unterordner einsortiert
1983 -----> Maschinenbaujahr (von 1980-1998 evtl. kommen andere dazu, der Ordner "Andere" zählt separat)
5958 - Lenzen -----> Die Kom.-Nr. der Maschine und der Kundenname evtl. weitere Daten wie Maschinentyp durch Leerzeichen und "-" getrennt
124584252_1.pdf -----> Die Dateien im Ordner mit der Maschinen-Nr. - Die lange Nr. ist die Scan-Job-Nr. und bleibt je Ordner gleich, die einzelnen Seiten werden alle fortlaufend nummeriert mit "_Nr."
124584252_2.pdf
124584252_3.pdf
Habe leider kaum/keine Erfahrung mit Find, FindStr und For welche ich den anderen Batch-Dateien nach benutzen sollte.
Da die ganze Archivierungsgeschichte seit gestern angelaufen ist und ich noch einen Berg anderer Arbeiten habe kann ich mich leider zeitlich nicht ausführlich mit dem Thema beschäftigen und einarbeiten, und benötige innerhalb der nächsten 1-2Wochen eine brauchbare Lösung.
Hier noch ein Bild wie die derzeitige Ordnerstruktur ist:
Zusammensetzen der Dateien mit PDFTK sollte sich folgendermaßen ergeben, damit der Ordnername auf die Datei übertragen wird: PDFTK 124584252_1.pdf 124584252_2.pdf 124584252_3.pdf CAT "5958 - Lenzen.pdf"
Ich wäre über jeden praxisnahen Vorschlag und vor allen Dingen Beispielen dankbar.
freundliche Grüße
AlterSchuljunge
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 68527
Url: https://administrator.de/contentid/68527
Ausgedruckt am: 23.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo AlterSchuljunge und willkommen im Forum!
Der folgende Entwurf einer Batch-Lösung geht davon aus, dass sich die Reihenfolge der einzelnen .pdf-Dateien anhand des Dateidatums bestimmen lässt (da eine Sortierung nach Dateinamen durch die unterschiedliche Länge der angefügten Nummer dazu führen würde, dass nach "124584252_1.pdf" als nächstes "124584252_10.pdf", "124584252_11.pdf", ..., "124584252_19.pdf" und dann erst "124584252_2.pdf" verwendet würden).
Der Pfad in Zeile 2 ist natürlich an Deine Gegebenheiten anzupassen, und zum Testen habe ich nur das Jahr 1983 (Von = Bis) vorgeben - wenn der Batch wunschgemäß funktionieren sollte, einfach die beiden Jahreszahlen anpassen.
Kurz zum Ablauf:
Mit den ersten beiden "for"-Schleifen werden die einzelnen Jahre und innerhalb jeden Jahres die einzelnen Kundenverzeichnisse durchlaufen und zur Bearbeitung der vollständige Verzeichnispfad an das entsprechende Unterprogramm (":ProcessClient") weitergegeben.
In diesem Unterprogramm wird vorweg eine bereits existierende Sammeldatei gelöscht. (Alternativ könnte auch auf die Bearbeitung des Verzeichnisses verzichtet werden, wenn die Sammeldatei bereits vorhanden ist.)
Danach wird die erste (= älteste) .pdf-Datei des Verzeichnisses als Ausgangsdatei in eine temporäre Datei ("Temp1.tmp") kopiert.
Ab der zweiten Datei wird jeweils die Temporärdatei mit der aktuell zu bearbeitenden Datei verkettet und in eine zweite Temp-Datei ("Temp2.tmp") geschrieben (da - zumindest in der von mir zum Testen verwendeten Version 1.12 - PDFTK gleichnamige Quell- und Zieldateien nicht akzeptiert).
Durch Umbenennen der (verketteten) "Temp2.tmp" wieder auf "Temp1.tmp" kann dieser Vorgang für jede einzelne .pdf-Datei wiederholt werden, bis schließlich (durch Umbenennen der letzten Temp-Datei) die endgültige, nach dem Verzeichnisnamen benannte, Sammeldatei entsteht.
Grüße
bastla
P.S.: Nur zur Sicherheit: Es sollten zwar alle Originaldateien erhalten bleiben, dennoch empfiehlt es sich, zum Testen mit Kopien zu arbeiten ...
Der folgende Entwurf einer Batch-Lösung geht davon aus, dass sich die Reihenfolge der einzelnen .pdf-Dateien anhand des Dateidatums bestimmen lässt (da eine Sortierung nach Dateinamen durch die unterschiedliche Länge der angefügten Nummer dazu führen würde, dass nach "124584252_1.pdf" als nächstes "124584252_10.pdf", "124584252_11.pdf", ..., "124584252_19.pdf" und dann erst "124584252_2.pdf" verwendet würden).
@echo off & setlocal
set "root=D:\FTP-ROOT"
set Von=1983
set Bis=1983
for /l %%j in (%Von%,1,%Bis%) do (
for /d %%v in ("%root%\%%j\*.*") do call :ProcessClient "%%v"
)
goto :eof
:ProcessClient
set "PDFFile=%~1\%~n1.pdf"
if exist "%PDFFile%" del "%PDFFile%"
set "Temp1=%~1\Temp1.tmp"
set "Temp2=%~1\Temp2.tmp"
set First=True
for /f "delims=" %%d in ('dir %1 /b /od') do if not defined First (
pdftk "%Temp1%" "%~1\%%d" cat output "%Temp2%"
move "%Temp2%" "%Temp1%"
) else (
copy "%~1\%%d" "%Temp1%">nul
set First=
)
move "%Temp1%" "%PDFFile%"
goto :eof
Kurz zum Ablauf:
Mit den ersten beiden "for"-Schleifen werden die einzelnen Jahre und innerhalb jeden Jahres die einzelnen Kundenverzeichnisse durchlaufen und zur Bearbeitung der vollständige Verzeichnispfad an das entsprechende Unterprogramm (":ProcessClient") weitergegeben.
In diesem Unterprogramm wird vorweg eine bereits existierende Sammeldatei gelöscht. (Alternativ könnte auch auf die Bearbeitung des Verzeichnisses verzichtet werden, wenn die Sammeldatei bereits vorhanden ist.)
Danach wird die erste (= älteste) .pdf-Datei des Verzeichnisses als Ausgangsdatei in eine temporäre Datei ("Temp1.tmp") kopiert.
Ab der zweiten Datei wird jeweils die Temporärdatei mit der aktuell zu bearbeitenden Datei verkettet und in eine zweite Temp-Datei ("Temp2.tmp") geschrieben (da - zumindest in der von mir zum Testen verwendeten Version 1.12 - PDFTK gleichnamige Quell- und Zieldateien nicht akzeptiert).
Durch Umbenennen der (verketteten) "Temp2.tmp" wieder auf "Temp1.tmp" kann dieser Vorgang für jede einzelne .pdf-Datei wiederholt werden, bis schließlich (durch Umbenennen der letzten Temp-Datei) die endgültige, nach dem Verzeichnisnamen benannte, Sammeldatei entsteht.
Grüße
bastla
P.S.: Nur zur Sicherheit: Es sollten zwar alle Originaldateien erhalten bleiben, dennoch empfiehlt es sich, zum Testen mit Kopien zu arbeiten ...
Hallo,
ich habe eig genau das gleiche Problem wie oben beschrieben.
Jedoch funktioniert dieser Batch bei mir so nicht.
Ich möchte alle im Ordner Root befindlichen Unterordner einbeziehen (nicht wie hier die angegebenen Jahreszahlen).
In diesen Unterordnern befinden sich rund 20 PDFs, welche nach Dateiname sortiert zusammengefügt werden sollen. (01.pdf, 02.pdf, 03.pdf usw...)
Mit dem "Umarbeiten" habe ich aber gerade so meine Probleme.
Vielen Dank schonmal für die Hilfe ;)
ich habe eig genau das gleiche Problem wie oben beschrieben.
Jedoch funktioniert dieser Batch bei mir so nicht.
Ich möchte alle im Ordner Root befindlichen Unterordner einbeziehen (nicht wie hier die angegebenen Jahreszahlen).
In diesen Unterordnern befinden sich rund 20 PDFs, welche nach Dateiname sortiert zusammengefügt werden sollen. (01.pdf, 02.pdf, 03.pdf usw...)
Mit dem "Umarbeiten" habe ich aber gerade so meine Probleme.
Vielen Dank schonmal für die Hilfe ;)
Hallo Sternex!
Versuch es mal (nach dem Anpassen der Zeile 2 und dem Entfernen der für Dich überflüssigen Zeilen 3 und 4) mit folgendem Ersatz der Zeilen 6 bis 8:
Um die Sortierung nach Dateinamen durchzuführen, wäre in Zeile 17 anstelle von
die Schreibweise
zu verwenden.
Grüße
bastla
Versuch es mal (nach dem Anpassen der Zeile 2 und dem Entfernen der für Dich überflüssigen Zeilen 3 und 4) mit folgendem Ersatz der Zeilen 6 bis 8:
for /d %%v in ("%root%\*.*") do call :ProcessClient "%%v"
... dir %1 /b /od ...
... dir %1 /b /on ...
Grüße
bastla
Vielen Dank bastla!
Ein Problem noch. In dem Root Verz. befinden sich ja alle Unterordner.
Wenn ich den Root Pfad angebe verarbeitet er nix sondern legt in dem Pfad eine PDF Datei ohne Inhalt an.
Also irgendwie geht er nicht in die Ordner.
Ach und nochetwas. Kann man irgendwie die Fertigen PDFs dann eine Ebene höher legen?
Also in das Root Verz. und nicht in dem Unterordner belassen?
Und das man sieht was er gerade bearbeitet wäre auch toll. müsste ja irgendwo einfach nur ein echo rein oder?
Vielen Dank!
Ein Problem noch. In dem Root Verz. befinden sich ja alle Unterordner.
Wenn ich den Root Pfad angebe verarbeitet er nix sondern legt in dem Pfad eine PDF Datei ohne Inhalt an.
Also irgendwie geht er nicht in die Ordner.
Ach und nochetwas. Kann man irgendwie die Fertigen PDFs dann eine Ebene höher legen?
Also in das Root Verz. und nicht in dem Unterordner belassen?
Und das man sieht was er gerade bearbeitet wäre auch toll. müsste ja irgendwo einfach nur ein echo rein oder?
Vielen Dank!
Hallo Sternex!
Sorry - hatte vorhin nur kurz drübergeschaut ...
Zwar immer noch ungetestet, aber hoffentlich trotzdem mit einem passenden Ergebnis, könnte das so gehen:
Grüße
bastla
Sorry - hatte vorhin nur kurz drübergeschaut ...
Zwar immer noch ungetestet, aber hoffentlich trotzdem mit einem passenden Ergebnis, könnte das so gehen:
@echo off & setlocal
set "root=D:\FTP-ROOT"
for /d %%v in ("%root%\*.*") do call :ProcessClient "%%v"
goto :eof
:ProcessClient
set "PDFFile=%root%\%~n1.pdf"
if exist "%PDFFile%" del "%PDFFile%"
set "Temp1=%temp%\Temp1.tmp"
set "Temp2=%temp%\Temp2.tmp"
pushd %1
set First=True
for /f "delims=" %%d in ('dir /b /on *.pdf') do if not defined First (
echo Bearbeite "%~1\%%d"
pdftk "%Temp1%" "%%d" cat output "%Temp2%"
move "%Temp2%" "%Temp1%"
) else (
echo Bearbeite "%~1\%%d"
copy "%%d" "%Temp1%">nul
set First=
)
move "%Temp1%" "%PDFFile%">nul && echo "%~n1.pdf" erstellt & echo\
popd
goto :eof
bastla
Hallo bastla,
also das er es eine Ebene höher legt und das man sieht was passiert klappen Super!
Das er jedoch den Root Pfad annimmt geht immernoch nicht.
Also mein Aufbau nochmal:
also das er es eine Ebene höher legt und das man sieht was passiert klappen Super!
Das er jedoch den Root Pfad annimmt geht immernoch nicht.
Also mein Aufbau nochmal:
- Root
- Ordner1
- Unterordner von Ordner1
- PDF....
- Ordner2
- Unterordner von Ordner2
- PDF....
Außerdem muss ich noch (set "pdftk-bin=C:\Programme\pdftk.exe") setzen, da er sonst nur eine PDF statt aller nimmt.
Und kann man den Vorgang noch beschleunigen? Da er mit den 2 tmp Files arbeitet ist es verdammt langsam.
Dank für die Hilfe!
Hallo Sternex!
Auf diese Struktur wäre ich anhand von
Neuer Versuch:
Falls die erstellten PDF den Namen des Ordners (nicht des Unterordners) erhalten sollen, wäre als Zeile 8
zu verwenden.
Da nun mal zum Sicherstellen der richtigen Reihenfolge die PDF einzeln hinzugefügt werden müssen, sehe ich keine Möglichkeit, den Ablauf zu beschleunigen ...
Grüße
bastla
Auf diese Struktur wäre ich anhand von
In dem Root Verz. befinden sich ja alle Unterordner.
bzwKann man irgendwie die Fertigen PDFs dann eine Ebene höher legen?
Also in das Root Verz. und nicht in dem Unterordner belassen?
nicht gekommen ...Also in das Root Verz. und nicht in dem Unterordner belassen?
Neuer Versuch:
@echo off & setlocal
set "root=D:\FTP-ROOT"
for /d %%v in ("%root%\*.*") do for /d %%u in ("%%v\*.*") do call :ProcessClient "%%u" "%%v"
goto :eof
:ProcessClient
set "PDFFile=%root%\%~n1.pdf"
if exist "%PDFFile%" del "%PDFFile%"
set "Temp1=%temp%\Temp1.tmp"
set "Temp2=%temp%\Temp2.tmp"
pushd %1
set First=True
for /f "delims=" %%d in ('dir /b /on *.pdf') do if not defined First (
echo Bearbeite "%~1\%%d"
pdftk "%Temp1%" "%%d" cat output "%Temp2%"
move "%Temp2%" "%Temp1%"
) else (
echo Bearbeite "%~1\%%d"
copy "%%d" "%Temp1%">nul
set First=
)
move "%Temp1%" "%PDFFile%">nul && echo "%~n1.pdf" erstellt & echo\
popd
goto :eof
set "PDFFile=%root%\%~n2.pdf"
Und kann man den Vorgang noch beschleunigen? Da er mit den 2 tmp Files arbeitet ist es verdammt langsam.
Das "move
" kann eigentlich nicht so wahnsinnig viel Zeit kosten ...Da nun mal zum Sicherstellen der richtigen Reihenfolge die PDF einzeln hinzugefügt werden müssen, sehe ich keine Möglichkeit, den Ablauf zu beschleunigen ...
Grüße
bastla