knolli
Goto Top

PDFs zusammenführen mit PDFtk und Befehl Suffix

Hallo zusammen,

vorab muss ich gestehen ich bin zwar IT-Techniker, auf diesem Gebiet jedoch ein ziemlicher Laie. (was sich hoffentlich bald ändern wird ;)

Was will ich erreichen?
Ich möchte 3 PDFs zu einem zusammenführen und 2 "Parameter" aus dem Titel des ursprünglichen PDF Files in den Titel des zusammengeführten übernehmen.

Ursprüngliche Files:
STx_AutoAbrAllg_20130923.PDF
STx_AutoAbrEinzelKredit_20130923.PDF
STx_AutoAbrRabattkarten_20130923.PDF

Als Dateiname sollten die 3 PDFs dann
"Stx_Report_jjjjmmtt.pdf" haben.

Sowohl x (Stationsnummer) als auch das Datum ändern sich laufend!

--> Zum Zusammenführen habe ich folgenden tollen Beitrag gefunden: PDFs per Batch zusammenfügen

Was ist mein Problem?
Wie Ihr im Script am Ende meines Beitrags seht habe ich es aus oben angeführtem Link und bereits soweit ich konnte für meine Bedürfnisse angepasst. Jedoch funktioniert das Ganze noch nicht so richtig. Vor allem weil ich nicht verstehe (auch nicht mit unsrem Freund Google) wie ich Festlege aus welchem Teil des Titels der/die/das Suffix herausgeholt wird.


Wäre sehr dankbar für eure Hilfe!
MfG, Fabian

Es folgt mein Script: (bzw. das von bastla)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

@echo off & setlocal

set "Base=\\Server1\UserData\Daten\Benutzer\Desktop\ABLAGE\Abrechnung_Station\TEST"
::Pfad an dem die Dateien abgelegt sind.
set "PDFTK=C:\Program Files\PDFtk\pdftk.exe"
::Download von: http://www.pdfhacks.com/pdftk/

set "PDFCheck=*AutoAbr*"
set "PDFAlle=*_AutoAbrAllg_* *_AutoAbrEinzelKredit_* *_AutoAbrRabattkarten_*"

set "PDFGes=Report"

for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i"
goto :eof

:ProcessCust
pushd "%~f1"
if not exist "%PDFCheck%_*.pdf" goto :EndSub

for /f "tokens=2* delims=_" %%a in ('dir /b "%PDFCheck%_*.pdf"') do set "Suffix=%%b"

set PDFListe=
for %%a in (%PDFAlle%) do call :ProcessFile "Abrechnung_Report"
:: for %%a in (%PDFAlle%) do call :ProcessFile "%%a_%Suffix%"

"%PDFTK%" %PDFListe% cat output "ST%Suffix%_%PDFGes%_%Suffix2%" dont_ask

::Loeschsimulation
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "ST%Suffix%_%PDFGes%_%Suffix2%"') do echo %%i
:: Um das Loeschen zu aktivieren echo durch del ersetzen.

:EndSub
popd
goto :eof

:ProcessFile
if exist "%~1" set "PDFListe=%PDFListe% %~1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Anmerkung: Hätte das ganze gerne als Code-Tag (mit Zeilenbezeichnung) gepostet weiß jedoch leider nicht wie. :/

Content-ID: 217840

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

Ausgedruckt am: 25.11.2024 um 19:11 Uhr

Endoro
Endoro 25.09.2013 um 16:47:51 Uhr
Goto Top
Hi, der entsprechende Token ist der dritte, nicht der zweite; Delimiter sind Unterstrich und Punkt:
for /f "tokens=3 delims=_." %%a in ('dir /b /a-d "%PDFCheck%_*.pdf"') do set "Suffix=%%a"   
Die Formatierung findest du hier.
lg.
Knolli
Knolli 26.09.2013 aktualisiert um 10:44:53 Uhr
Goto Top
Hallo,

ermal danke für deine schnelle Antwort!
Das mit der formatierung hab ich jetzt kapiert face-smile

Hab den Befehlt "for" bis jetzt leider noch nicht gekannt. Hab mir daher folgende Anleitung durchgelesen:
Tutorial zur FOR-Schleife
Brauche aber bitte trotzdem nochmal deine/eure Hilfe um das ganze umzusetzen.

Ich bin mir nicht sicher ob ich die Variable %%a und Suffix richtig gesetzt habe.
--> Zweile 27 - Vermutlich der Grund warum das Script nicht durch läuft?
Bzw. wie ich eine zweite Variable (%%b für "Suffix2"?) setze?
--> Wofür ist das von dir eingefügte /a-d ?
--> Zeile 20,30

Sry tu mir noch schwer!
Lg, Fabian


@echo off & setlocal 
 
set "Base=\\Server1\UserData\Daten\Benutzer\Desktop\ABLAGE\Abrechnung_Kreuzmayr\TEST"   
::Pfad an dem die Dateien abgelegt sind!
set "PDFTK=C:\Program Files\PDFtk\pdftk.exe"   
::Download von: http://www.pdfhacks.com/pdftk/ 
 
set "PDFCheck=*AutoAbr*"   
set "PDFAlle=*_AutoAbrAllg_* *_AutoAbrEinzelKredit_* *_AutoAbrRabattkarten_*"   
 
set "PDFGes=Report"   
 
for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i"   
goto :eof 

:ProcessCust 
pushd "%~f1"  
if not exist "%PDFCheck%_*.pdf" goto :EndSub   
 
for /f "tokens=3 delims=_." %%a in ('dir /b /a-d "%PDFCheck%_*.pdf"') do set "Suffix=%%a"  
:: /f "tokens=2* delims=_" %%a in ('dir /b "%PDFCheck%_*.pdf"') do set "Suffix=%%b"   
 
set PDFListe=
for %%a in (%PDFAlle%) do call :ProcessFile "Abrechnung_Report"   
:: for %%a in (%PDFAlle%) do call :ProcessFile "%%a_%Suffix%"   
 
"%PDFTK%" %PDFListe% cat output "ST%Suffix%_%PDFGes%_%Suffix2%" dont_ask   

::Loeschsimulation 
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "ST%Suffix%_%PDFGes%_%Suffix2%"') do echo %%i   
 
:EndSub 
popd 
goto :eof 
 
:ProcessFile 
if exist "%~1" set "PDFListe=%PDFListe% %~1"  
bastla
bastla 27.09.2013 aktualisiert um 15:30:17 Uhr
Goto Top
Hallo Knolli und ein (verspätetes) Willkommen im Forum!

Für "%Suffix2%" kannst Du die Zeile 20 ergäzen (ungetestet):
for /f "tokens=1,3 delims=_." %%a in ('dir /b /a-d "%PDFCheck%_*.pdf"') do set "Suffix=%%a" & set "Suffix2=%%b"
Zu beachten wäre noch, dass "ST" bereits in "%Suffix%" enthalten ist und daher nicht in der Zeile 27 hinzugefügt werden muss.

Nicht klar ist mir, was Du mit Zeile 24 erreichen willst ...
Wofür ist das von dir eingefügte /a-d ?
Sicherheitsmaßnahme - damit liefert der "dir"-Befehl nur Dateien, keine Ordner.

Grüße
bastla

[Edit] "%Suffix2%"-Ermittlung korrigiert [/Edit]
Knolli
Knolli 30.09.2013 um 09:33:53 Uhr
Goto Top
Hallo bastla face-smile

Erstmal danke für deine Hilfe! Durch das aktivieren von "echo on" habe ich gerade festgestellt, dass es bereits am PDFCheck scheitert.

C:\>if not exist "*AutoAbr*.pdf" goto :EndSub
C:\>popd
C:\>goto :eof

Kurioserweise sogar wenn ich ein Pdf in AutoAbr.PDF umbenenne und das dann angebe. --> Siehe überarbeitetes Script unten.
Muss ich hier noch einen Pfad angeben oder woran kann das liegen?
Batch liegt im Ordner (Synonym) KUNDE und PDFs im Ordner TEST (Habs aber auch getestet mit dem Batch im Ordner TEST).

Zitat von @bastla:
Hallo Knolli und ein (verspätetes) Willkommen im Forum!
DANKE face-smile

Nicht klar ist mir, was Du mit Zeile 24 erreichen willst ...
Konnte zum ":ProcessFile" leider nichts finden und bin davon ausgegangen dass das nur die Bezeichnung des Prozesses unter Windows ist? :S

@echo on & setlocal 
 
set "Base=D:\KUNDE\TEST"   
::Pfad an dem die Dateien abgelegt sind!!!!!!!!!!
set "PDFTK=C:\Program Files\PDFtk\bin\PdftkXp.exe"   
::Download von: http://www.pdfhacks.com/pdftk/ 

set "PDFCheck=AutoAbr.PDF"  
::set "PDFCheck=*_AutoAbr*_*.PDF"  
set "PDFAlle=*_AutoAbrAllg_* *_AutoAbrEinzelKredit_* *_AutoAbrRabattkarten_*"   
 
set "PDFGes=Report"   
 
for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i"   
:: goto :eof 

:ProcessCust 
pushd "%~f1"  
if not exist "%PDFCheck%" goto :EndSub   
 
for /f "tokens=1,3 delims=_." %%a in ('dir /b /a-d "%PDFCheck%_*.pdf"') do set "Suffix=%%a" & set "Suffix2=%%b"  
:: for /f "tokens=3 delims=_." %%b in ('dir /b /a-d "ST*_%PDFCheck%_%%a.pdf"') do set "Suffix2=%%b"  
:: /f "tokens=2* delims=_" %%a in ('dir /b "%PDFCheck%_*.pdf"') do set "Suffix=%%b"   
 
set PDFListe=
for %%a in (%PDFAlle%) do call :ProcessFile "Abrechnung_Report"   
:: for %%a in (%PDFAlle%) do call :ProcessFile "%%a_%Suffix%"   
 
"%PDFTK%" %PDFListe% cat output "%Suffix%_%PDFGes%_%Suffix2%" dont_ask   

::Loeschsimulation 
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%Suffix%_%PDFGes%_%Suffix2%"') do echo %%i   
 
:EndSub 
popd 
goto :eof 
 
:ProcessFile 
if exist "%~1" set "PDFListe=%PDFListe% %~1"  

MfG, Knolli
bastla
bastla 30.09.2013 aktualisiert um 22:24:50 Uhr
Goto Top
Hallo Knolli!
habe ich gerade festgestellt, dass es bereits am PDFCheck scheitert.
Abgesehen davon, dass die Zeile 15 nicht auskommentiert werden darf, müsste Zeile 3 eher
set "Base=D:\KUNDE"
lauten, da in der Schleife (Zeile 14) alle Unterordner (= Kundenordner) des "%Base%"-Pfades abgearbeitet werden; wenn es daher unter "D:\KUNDE\TEST" keine Ordner mehr gibt, wird das Unterprogramm ":ProcessCust" nie (aus der Schleife heraus) erreicht, sondern (wegen des fehlenden "goto :eof") nur direkt im Ablauf, wobei dann in "%1" aber kein Pfad enthalten ist.
Konnte zum ":ProcessFile" leider nichts finden und bin davon ausgegangen dass das nur die Bezeichnung des Prozesses unter Windows ist? :S
":ProcessFile" ist die Sprungmarke am Beginn des Unterprogrammes, in dem alle Dokumentarten aus "%PDFAlle%" in die Reihe der zu verarbeitenden Dokumente einzuordnen sind - insofern braucht es zumindest "%%a" im Aufrufparameter.
"echo on" war übrigens genau der richtige Ansatz - so kannst Du nicht nur den Ablauf nachvollziehen, sondern auch, zu welchen Werten die Variablen (wie etwa "%%i" oder "%Suffix%") aufgelöst werden ...

Grüße
bastla