sprantaler
Goto Top

Einfaches PDF-Batch gesucht

Ich suche zum Zusammenfügen von mehreren .pdf-Dateien eine Batchdatei

Die PDFs sind alle in diesem Format:

1234_01.pdf
1234_02.pdf
1234_03.pdf
1235_01.pdf
1235_02.pdf
1236_01.pdf
1237_01.pdf
1237_01.pdf
usw.

Die Dokumentennummer ist also nicht zwangsläufig fortlaufend, machmal gibts es auch einseitige Dokumente, allerdings haben auch die den zusatz _01 am Ende.
Ich hätte nun gerne, dass PDFTK alle PDFs mit der gleichen Hauptnummer zusammenfasst und unter derselben Nummer abspeichert. Eigentlich ganz simpel, aber ich steig beim batchen auf die schnelle nicht durch, müsste aber knapp 120.000 Dateien auf diese Weise zusammenfassen. Mit dem PDFTKBulider dauert das etwas lange....

Daher hoffe ich, dass mir ein erfahrener User vielleicht schnell was zaubern kann ;)

Vielen Dank im Vorraus!

Content-ID: 137862

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

Ausgedruckt am: 20.11.2024 um 08:11 Uhr

Bert001
Bert001 10.03.2010 um 10:54:11 Uhr
Goto Top
Hallo,

Eventuell mittels einer kleinen Vorbereitung.
Du kannst die Dateien nach dem "Hauptnummernkriterium" in Unterverzeichnisse einsortieren (mittels cmd File)
Also
md C:\1234
copy *1234_*.pdf C:\1234
usw.

Danach solltest du einfach alle PDFs pro Verzeichnis zusammenfassen können.

Anderer Weg fällt mir momentan nicht ein.

LG
Sprantaler
Sprantaler 10.03.2010 um 11:27:03 Uhr
Goto Top
Wäre ja aber trotzdem ziemlich umfangreich bei schätzungsweise 3000 Hauptnummern face-sad

Kleine Zwischenfrage: ist es normal, dass PDFTK sich gleich noch dem anklicken der .exe-Datei wieder schließt? Muss ichs wohl nochmal downloaden face-sad
dave114
dave114 10.03.2010 um 11:41:46 Uhr
Goto Top
morgen,

ohne das Programm jetzt zu kennen würde ich spontan sagen das es eine Consolen-Anwendung ist. face-wink

dh. du musst das Programm über die CMD aufrufen.

mfg
David
Sprantaler
Sprantaler 10.03.2010 um 11:49:29 Uhr
Goto Top
tatata.....

Wenn ich die cmd starte und die .exe datei per drag+drop reinziehe, gehts ;)

Danke schonmal dafür. nun muss ich PDFTK nur noch sagen, was es tun soll. hat jemand eine idee?
dave114
dave114 10.03.2010 um 11:54:56 Uhr
Goto Top
morgen,

was hälst du von googlen?

Hier eine kleine Einführung.

Wenn du konkrete Probleme hast kannst du ja nochmal schreiben - aber google vorher! face-wink

mfg
David
Sprantaler
Sprantaler 10.03.2010 um 12:00:35 Uhr
Goto Top
Bin schon seit ca. zwei Stunden am "znouten" (Ist umweltfreundlicher als googlen: http://de.znout.org/ )

Und die Anleitung kenne ich schon, allerdings brauche ich ja eine Routine, die das alles automatisch löst, da ich sonst ein paar tage mit PDFs konvertieren verbringen kann face-sad

€:Bin auch parallel noch am znouten, komme aber wohl auf die Schnelle auf keinen grünen Zweig.
dave114
dave114 10.03.2010 um 12:21:31 Uhr
Goto Top
Wenn du noch nen bisschen Geduld hast dann bastel ich noch nen bisschen weiter und vllt geht es ja so wie ist es mir vorstelle.
noodyn
noodyn 10.03.2010 um 12:24:31 Uhr
Goto Top
Du hast doch eine Antwort auf deine Frage bereits bekommen. Bau eine Schleife, sortiere die Dateien nach Namen in das Verzeichnis, lass pdftk alle pdfs in dem Verzeichnis zusammenfassen, steck die zusammengefasste Datei in einen anderen Ordner und lösche den aktuellen, dann fährst du mit der nächsten Nummer fort.
bastla
bastla 10.03.2010 um 12:49:13 Uhr
Goto Top
Hallo Sprantaler und willkommen im Forum!

Falls Du es eilig hast, könntest Du es mit folgendem Batch versuchen:
@echo off & setlocal
set "Quelle=D:\QuellVerzeichnis"  
set "Ziel=D:\ZielVerzeichnis"  
set "pdftk=C:\Programme\pdftk-1.12\pdftk.exe"  

set "t1=%temp%\1.pdf"  
set "t2=%temp%\2.pdf"  
md "%Ziel%" 2>nul  
pushd "%Quelle%"  
for %%i in (*.pdf) do for /f "tokens=1-2 delims=_" %%a in ("%%~ni") do if "%%b"=="01" call :ProcessFile "%%i" %%a  
popd
goto :eof

:ProcessFile
copy %1 %t1% >nul
for /f "skip=1 delims=" %%i in ('dir /b /on "%2_*.pdf"') do (  
    if exist "%t1%" (  
        "%pdftk%" "%t1%" "%%~nxi" cat output "%t2%"  
        del "%t1%"  
    ) else (
        "%pdftk%" "%t2%" "%%~nxi" cat output "%t1%"  
        del "%t2%"  
    )
)
if exist "%t1%" move "%t1%" "%Ziel%\%2.pdf"  
if exist "%t2%" move "%t2%" "%Ziel%\%2.pdf"  
goto :eof
Grüße
bastla
miniversum
miniversum 10.03.2010 um 12:55:58 Uhr
Goto Top
Versuch mal ob es ungefär so geht (kleinere Anpassungen könnten notwendig sein, weil ungetestet):
@echo off

set "filter=1234"  

set "sourcelist="  
FOR /F "delims=" %%i in ('dir /b "%filter%_*.pdf"') do call set "sourcelist=%%sourcelist%% %%%%i"  

pdftk %sourcelist% cat output "%filter%_gesamt.pdf"  

Oh da war Bastla mal wieder schneller ...
dave114
dave114 10.03.2010 um 13:04:26 Uhr
Goto Top
So ich habe mein Script jetzt auch fertig und es funktioniert soweit:

set nummer=0

:anfang

md ordner
move %nummer%_*.pdf ordner

cd C:\pdfs\ordner

pdftk C:\pdfs\ordner\%nummer%_*.pdf cat output C:\pdfs\ordner\%nummer%.pdf

copy %nummer%.pdf C:\pdfs\

cd..

rmdir C:\pdfs\ordner /s /q

set /a nummer+=1

pause

goto anfang

nicht schön aber selten face-wink

edit: Ich geh hier davon aus das die ersten Dateien 0_*.pdf heißen. Dannach wird jedweils eins hochgezählt das heißt danach wären dann die Datei 2_*.pdf dran.

mfg
David
Sprantaler
Sprantaler 10.03.2010 um 13:56:04 Uhr
Goto Top
Ich verstehe die Befehle der Datei zwar nur ansatzweise, aber es funktioniert ! Danke an Bastla und die anderen, die sich dem Problem angenommen haben.

Werde mich mit dem Thema mal noch weiter befassen, schaut zwar anspruchsvoll aus, aber hat mein Interesse geweckt face-smile
bastla
bastla 10.03.2010 um 14:05:21 Uhr
Goto Top
Hallo Sprantaler!

Freut mich, wenn's passt face-smile - und ansonsten: bei Fragen einfach fragen ... face-wink

Grüße
bastla
dave114
dave114 10.03.2010 um 14:12:42 Uhr
Goto Top
@Sprantaler

Verrätst du uns noch welche Scripte du getestet hast, welche davon funktionieren und welches du jetzt einsetzt?

mfg
David
Biber
Biber 10.03.2010 um 22:04:30 Uhr
Goto Top
[OT]
Moin Sprantaler,

willkommen im Forum.
Zwei Anmerkungen:
Zitat von @Sprantaler:
Danke an Bastla und die anderen, die sich dem Problem angenommen haben.
a) Bitte danke in diesem Zweigarm des Forums nicht denen, die sich "dem Problem angenommen haben", sondern denen, die sich "des Problems angenommen haben".
b) "Probleme" gibt es eigentlich nicht im Bereich "Batch & Shell", nur "Anforderungen". Hättest du gleich "Anforderungen" als Vokabel verwendet, dann wäre dir das mit dem Dativ gar nicht passiert (oder zumindest nicht zu lesen gewesen).

Grüße
Biber
[/OT]
FGHoyer
FGHoyer 21.05.2013 um 10:48:13 Uhr
Goto Top
Hallo Bastla,
ich habe ein ähnliches Prob wie Sprantaler. Auch bei mir werden PDF-Dateien erzeugt, die dem Schema "Hauptnummer"_"LFDNR".pdf entsprechen. Wobei auch hier die LFDNR von 01 - XX hochgezählt wird oder auch mal nur als Einzeldatei erscheint.
Ich habe jetzt versucht Dein Script anzupassen und es läuft bei mir auch bis zum ersten Kopierbefehl, der 1. PDF in das temporäre Verzeichnis....und dann stirbt es. Und ich weiß nicht wieso, da auch meine Scriptkenntnisse in diesem Bereich zu wünschen übrig lassen. Eine nähere Erklärung wie dieses Script arbeitet wäre hilfreich.
Ich habe Dein Script genommen, weil Du anscheind keine festen Filter wie z.B. miniversum setzt. Oder kann ich bei den Filtern auch mit Platzhaltern, sprich Fragezeichen, arbeiten???


Greetz
bastla
bastla 21.05.2013 um 11:13:47 Uhr
Goto Top
Hallo FGHoyer!

Um den Ablauf besser nachvollziehen zu können, ändere Zeile 1 auf
@echo on & setlocal
und starte den Batch aus einer CMD-Shell - es werden so alle Befehle vor ihrer Ausführung zunächst einmal angezeigt.

Wenn Du eine "Ausgabeumleitung" hinzufügst - unter der Annahme, dass der Batch als "C:\Batches und Scripte\PDF_kombinieren.cmd" gespeichert wäre, müsstest Du dann etwa so starten:
"C:\Batches und Scripte\PDF_kombinieren.cmd" > "D:\PDF-kombinieren_Log.txt"
- kannst Du die Ausgaben auch in eine Datei umleiten und dann in aller Ruhe analysieren (bzw relevante Zeilen posten) ...
Ich habe Dein Script genommen, weil Du anscheind keine festen Filter wie z.B. miniversum setzt. Oder kann ich bei den Filtern auch mit Platzhaltern, sprich Fragezeichen, arbeiten???
In Zeile 10
for %%i in (*.pdf) do for /f "tokens=1-2 delims=_" %%a in ("%%~ni") do if "%%b"=="01" call :ProcessFile "%%i" %%a
könntest Du
for %%i in (*.pdf) do
entsprechend anpassen - also etwa
for %%i in (201304*.pdf) do
verwenden.

Für die weitere Verarbeitung wird übrigens voausgesetzt, dass sich im Dateinamen vor dem "_" keine Leerzeichen und nach dem "_" zweistellige Laufnummern befinden - und nur, wenn es die Laufnummer "01" gibt, erfolgt eine Verarbeitung.

Grüße
bastla
FGHoyer
FGHoyer 04.06.2013 um 12:20:09 Uhr
Goto Top
Hallo bastla, vielen Dank für Deine Antwort... ja, ja wer lesen kann ist klar im Vorteil. Ich hätte vielleicht alle Steuerzeichen direkt mitnehmen sollen, dann hätte es von Anfang an geklappt..Anyway, jetzt hat sich noch eine kleine Frage aufgetan. Wie kann ich an die erzeugte PDF noch eine feste PDF anhängen in einem Aufwasch??? Die feste PDF kann ich nennen wie ich will.
Greetz FGHoyer
bastla
bastla 04.06.2013 um 17:38:04 Uhr
Goto Top
Hallo FGHoyer!
Wie kann ich an die erzeugte PDF noch eine feste PDF anhängen in einem Aufwasch?
Dazu die Zeilen 25 und 26 ändern:
if exist "%t1%" (  
    "%pdftk%" "%t1%" "D:\Feste.pdf" cat output "%2.pdf"  
     move "%2.pdf" "%Ziel%\"  
)
if exist "%t2%" (  
    "%pdftk%" "%t2%" "D:\Feste.pdf" cat output "%2.pdf"  
     move "%2.pdf" "%Ziel%\"  
)
Grüße
bastla
FGHoyer
FGHoyer 18.06.2013 um 09:17:39 Uhr
Goto Top
Guten Morgen Bastla,
danke für Deine Hilfe. Die Batch läuft soweit ganz gut, aber...bei manchen erstellten PDF's stimmt der Inhalt nicht. Es wird der Inhalt der vorhergehenden PDF auf die neue Datei übertragen. So als ob der Inhalt eines temporären Speichers noch nicht leer ist. Leider, und das macht die Sache undurchsichtig, nicht immer. Mal alle 3 Dateien mal jede 2. Datei, auch mal jede...Absolut regellos, oder zumindest für mich nicht erkennbar. Log-file sagt auch nicht viel, außer das die Dateien erzeugt und in den Zielordner verschoben wurden..
Greetz FGHoyer
bastla
bastla 18.06.2013 um 11:14:49 Uhr
Goto Top
Hallo FGHoyer!
So als ob der Inhalt eines temporären Speichers noch nicht leer ist.
Durch Zeile 15 wird jeweils die Datei als "%temp%\1.pdf" neu erstellt und (siehe Zeile 17) auch zuerst verwendet - insofern sollte der Ablauf eigentlich passen ...

Grüße
bastla
FGHoyer
FGHoyer 19.06.2013 um 09:27:57 Uhr
Goto Top
Hallo Bastla,
stimmt und das passiert auch, aber anscheinend muß auch die 2.pdf in den Müll. Zumindest lässt der erste Test das vermuten, denn mit einer Zeile 16 mit copy %1 %t2% >nul scheint es zu klappen.... Danke
FGHoyer
FGHoyer 01.07.2013 um 08:50:49 Uhr
Goto Top
Hallo Bastla,
ich stehe vor einem Rätsel. Das Script läuft 1-2 Tage ohne Probleme um dann plötzlich nur noch Müll zu produzieren. Ich habe z.B. den Inhalt einer Datei unter 20 verschiedenen Dateinamen gefunden, so als ob es mit der Menge der Dateien ein Problem hat. Ich überlege jetzt, ob es nicht vielleicht sinnvoll wäre, nach jedem Durchlauf die zugehörigen Orginaldateien direkt zu löschen. Welche Zeilen müsste ich dafür einfügen???
Thx
FGHoyer
bastla
bastla 01.07.2013 um 13:49:54 Uhr
Goto Top
Hallo FGHoyer!

Das Löschen könntest Du ganz am Ende des Unterprogramms per
del "%2_*.pdf"
erledigen ...

Grüße
bastla
FGHoyer
FGHoyer 02.07.2013 um 08:00:49 Uhr
Goto Top
Guten Morgen! Ich werd noch bekloppt. Ich habe gestern immer wieder den Output meines/bastla's Scripts überprüft und alles sah super aus, so wie es eben sein sollte. Heute morgen komme ich an meinen Arbeitsplatz und stelle fest, dass es am letzten Lauf des gestrigen Tages in alle Dateien den Inhalt ein und der selben PDF geschrieben hat. Dieser Inhalt ist auch in den 2 temporären Zwischendateien 1.pdf und 2.pdf enthalten. Es sieht so aus als ob diese Zwischenspeicher irgendwann nicht mehr mit den aktuelle Dateiinhalten überschrieben werden und so alle Dateien den selben Inhalt haben. HAT IRGENDJEMAND EINE IDEE!!!
bastla
bastla 02.07.2013 um 08:30:37 Uhr
Goto Top
Hallo FGHoyer!

Nicht nachvollziehbar und vor allem aufgrund des Codes nicht erklärbar - mit den Zeilen
if exist "%t1%" move "%t1%" "%Ziel%\%2.pdf"  
if exist "%t2%" move "%t2%" "%Ziel%\%2.pdf"  
werden ja beide Temporärdateien nach dem Zusammenfügen entfernt. Du könntest das "move" noch durch Kopieren und Löschen ersetzen - das sähe dann so aus:
copy "%t1%" "%Ziel%\%2.pdf" >nul 2>&1  
copy "%t2%" "%Ziel%\%2.pdf" >nul 2>&1  
del "%t1%" 2>nul  
del "%t2%" 2>nul  
Poste zur Sicherheit mal Dein aktuelles Script (als "Code" formatiert) ...

Grüße
bastla