alterschuljunge
Goto Top

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:
64d837097feb5aa08ea21bf909a3d720-ordner


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

Content-ID: 68527

Url: https://administrator.de/contentid/68527

Ausgedruckt am: 08.11.2024 um 21:11 Uhr

bastla
bastla 13.09.2007 um 01:42:13 Uhr
Goto Top
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).
@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
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 ...
AlterSchuljunge
AlterSchuljunge 13.09.2007 um 08:15:07 Uhr
Goto Top
Habe es mal für 1983 getestet und später für alle anderen Dateien auch (natürlich mit Backup!).
Es hat auf Anhieb alles gleich perfekt funktioniert!

Vielen Dank an Dich BASTLA !!!
Du hast mir jede Menge Zeit/Arbeit und dementsprechend auch Ärger erspart!

Gruß

AlterSchuljunge
Sternex
Sternex 21.09.2010 um 10:54:32 Uhr
Goto Top
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 ;)
bastla
bastla 21.09.2010 um 11:45:07 Uhr
Goto Top
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:
for /d %%v in ("%root%\*.*") do call :ProcessClient "%%v"
Um die Sortierung nach Dateinamen durchzuführen, wäre in Zeile 17 anstelle von
... dir %1 /b /od ...
die Schreibweise
... dir %1 /b /on ...
zu verwenden.

Grüße
bastla
Sternex
Sternex 21.09.2010 um 13:18:24 Uhr
Goto Top
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!
bastla
bastla 21.09.2010 um 17:33:15 Uhr
Goto Top
Hallo Sternex!

Sorry - hatte vorhin nur kurz drübergeschaut face-sad ...

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
Grüße
bastla
Sternex
Sternex 22.09.2010 um 14:17:03 Uhr
Goto Top
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:
  1. Root
    • Ordner1
      • Unterordner von Ordner1
        1. PDF
        2. PDF....
    • Ordner2
      • Unterordner von Ordner2
        1. PDF
        2. 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!
bastla
bastla 22.09.2010 um 16:28:10 Uhr
Goto Top
Hallo Sternex!

Auf diese Struktur wäre ich anhand von
In dem Root Verz. befinden sich ja alle Unterordner.
bzw
Kann man irgendwie die Fertigen PDFs dann eine Ebene höher legen?
Also in das Root Verz. und nicht in dem Unterordner belassen?
nicht gekommen ...

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
Falls die erstellten PDF den Namen des Ordners (nicht des Unterordners) erhalten sollen, wäre als Zeile 8
set "PDFFile=%root%\%~n2.pdf"
zu verwenden.
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 face-wink ...
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
Sternex
Sternex 22.09.2010 um 16:47:25 Uhr
Goto Top
Klasse jetzt passt alles! Danke!

mit der Geschwindigkeit ist mir nur aufgefallen da es manuell mit pdftk schneller geht.
Daher dachte ich es liegt am erstellen der tmp's...

Aber dann dauert es eben etwas länger. Hauptsache es geht!

Danke nochmal face-smile