43964
Goto Top

PDFs per Batch zusammenfügen

Hallo,

ich habe folgendes Szenario.
Unsere Kunden bekommen alle paar Tage Abrechnungen.
Diese Abrechnungen bestehen aus 4 PDF-Dateien.
Diese Dateien haben folgenden Aufbau:

1.) "Abrechnung_Rechnungen_KDNR_DATUM_LFDNR.PDF"
2.) "Abrechnung_Gesamt_ABCDE_KDNR_DATUM_LFDNR.PDF"
3.) "Abrechnung_Gesamt_FGHIJ_KDNR_DATUM_LFDNR.PDF"
4.) "Abrechnung_Buchungen_KDNR_DATUM_LFDNR.PDF"

KDNR: 4-Stellige (eindeutige) Kundennummer
DATUM: Erstellungsdatum. Format: 25012008
LFDNR: Laufende Abrechnungsnummer. Von 1 bis -theoretisch- unendlich.
ABCDE: Geschäftspartner 5stellig (möchte ich hier nicht nennen)
FGHIJ: Geschäftspartner 5stellig (möchte ich hier nicht nennen)

Diese Dokumente befinden sich in f:\outbox\aktuell\KDNR\ (also z.B. f:\outbox\aktuell\1234)
Jede Stunde werden diese Dokumente automatisch verschickt.
Der Ordner "aktuell" ist danach leer. Die Dokumente sind dann nach "f:\outbox\verarbeitet\DATUM\" verschoben.

Ziel ist es jetzt, diese 4 Dokumente per Batchbefehl (Also als stündlich geplanter Task) zu einem Dokument "Abrechnung_Gesamt_KDNR_DATUM_LFDNR.pdf" zusammenzufassen.

Die 4 Dokumente können dann anschließend gelöscht werden.

Adobe Professional 6.0 ist vorhanden.

Kann jemand mit einem Batch helfen?
Während der Testphase wäre es sinnvoll, wenn der Part des Löschens noch ausgeklammert wird.

Ich habe schon den Thread (PDF-Dateien in vielen Unterordnern mit PDFTK zusammenfügen und umbenennen (Windows)) gelesen, aber die Batch war für mich zu kompliziert, als dass ich diese einfach hätte umschreiben können.


Vielen Dank!

Content-ID: 79157

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

Ausgedruckt am: 14.11.2024 um 21:11 Uhr

Dynadrate
Dynadrate 25.01.2008 um 15:16:36 Uhr
Goto Top
Das lässt sich sogar kostenlos (=ohne Adobe) machen.
Ghostscript
Hier wird erklärt wie man mit Ghostscript merged (zusammenfügt): klick

Müsste man normalerweise alles per Batch erschlagen können.
bastla
bastla 25.01.2008 um 16:07:29 Uhr
Goto Top
Hallo Schwimmbutz und Dynadrate!

Das lässt sich sogar kostenlos (=ohne Adobe) machen.
Auch, wie im oben zitierten Beispiel, mit pdftk.

... Batch war für mich zu kompliziert, als dass ich diese einfach hätte umschreiben können.
Ich hoffe, dass es mir gelungen ist face-wink:
@echo off & setlocal

set "Base=f:\outbox\aktuell"  
set "PDFTK=C:\Tools\pdftk.exe"  
::Download von: http://www.pdfhacks.com/pdftk/

set "PDF1=Abrechnung_Rechnungen"  
set "PDF2=Abrechnung_Gesamt_?????"  
set "PDF3=Abrechnung_Buchungen"  

set "PDFGes=Abrechnung_Gesamt"  

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

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

for /f "tokens=2* delims=_" %%a in ('dir /b "%PDF1%_*.pdf"') do set "Suffix=%%b"  
"%PDFTK%"  %PDF1%_%Suffix% %PDF2%_%Suffix% %PDF3%_%Suffix% cat output "%PDFGes%_%Suffix%" dont_ask  

::Loeschsimulation
echo Zu loeschen in %cd%:
echo.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i  
echo =============================================
echo.
echo.

:EndSub
popd
Für jeden KDNR-Ordner wird vorweg geprüft, ob eine "Abrechnung_Rechnungen_KDNR_DATUM_LFDNR.PDF" vorhanden ist. Wird eine solche Datei gefunden, kann daraus der Teil "KDNR_DATUM_LFDNR.PDF" (Suffix) entnommen werden, um die weiteren 3 .pdf-Dateien damit zu identifizieren (aus der Beschreibung geht nicht eindeutig hervor, dass sich nur die angeführten 4 Dateien im jeweiligen Ordner befinden).

Die Sammeldatei wird im übergeordneten Ordner ("f:\outbox\aktuell") erstellt. Ist bereits eine gleichnamige Sammeldatei vorhanden, wird diese (durch Verwendung der Option "dont_ask") überschrieben.

Das Löschen wird durch die Ausgabe einer Liste der zu löschenden Dateien simuliert.

Grüße
bastla

[Edit] Sammeldatei wird im selben Ordner erstellt, daher muss diese vom Löschen ausgenommen werden - Code entsprechend angepasst. [/Edit]
43964
43964 25.01.2008 um 16:46:06 Uhr
Goto Top
HAllo.

Danke für die Lösung.
Ich bin noch nicht zu der Umsetzung gekommen, allerdings muss die fertige Datei im selben Ordner wie die 4 Dateien liegen (also z.B: im Ordner f:\outbox\aktuell\1234\). Sonst funktioniert das Versenden nicht.
Vielen Dank.
bastla
bastla 25.01.2008 um 16:53:43 Uhr
Goto Top
Hallo Schwimmbutz!

allerdings muss die fertige Datei im selben Ordner wie die 4 Dateien liegen
Dazu musst Du nur den Verzeichniswechsel (mit "..\") aus der entsprechenden Zeile nehmen - ich ändere das gleich oben.

Grüße
bastla
43964
43964 25.01.2008 um 17:07:20 Uhr
Goto Top
Hi,

also das zusammenfügen funktioniert. Wird auch in den richtigen Ordner gespeichert.
Problem ist jetzt aber noch, dass bei "Zu löschen" auch die Gesamt-Datei steht.

Evtl. kann auch die "neue" PDF-Datei in "Abrechnung_KDNR_DATUM_LFDNR.PDF" umbenannt werden. Falls es das einfacher macht?!

Aber ansonsten ein ABSOLUT PERFEKTER BATCH!
bastla
bastla 25.01.2008 um 17:11:10 Uhr
Goto Top
Hallo Schwimmbutz!

Problem ist jetzt aber noch, dass bei "Zu löschen" auch die Gesamt-Datei steht.
Sollte sie nicht mehr face-wink (siehe angepasste Version) ...

Grüße
bastla
43964
43964 25.01.2008 um 17:23:43 Uhr
Goto Top
OK.
Hat auch funktioniert.

Mir ist allerdings aufgefallen, dass es SEHR SELTEN, auch mal "Abrechnung_Zahlungen_KDNR_DATUM_LFDNR.pdf" sowie "Abrechnung_Umbuchungen_KDNR_DATUM_LFDNR.pdf" gibt.

Noch was:
Die Zeile "set "PDF2=Abrechnung_Gesamt_?????"" erfasst dann beide Dokumente (Also ABCDE und FGHIJ) ??

Dann müsstest du mir noch verraten, wie ich später die Löschsimulation entferne damit das Proggi dann lauffähig ist.

Dann wäre es perfekt face-smile
Vielen Dank.
bastla
bastla 25.01.2008 um 17:40:59 Uhr
Goto Top
Hallo Schwimmbutz!

Ist mit "Abrechnung_Zahlungen_KDNR_DATUM_LFDNR.pdf" sowie "Abrechnung_Umbuchungen_KDNR_DATUM_LFDNR.pdf" jetzt die Liste der (uU) zu verarbeitenden Dateien komplett? Da "pdftk" nicht ganz entspannt auf nicht gefundene Dateien reagiert face-wink, muss ich noch eine Prüfung bzw eine Zusammenstellung der tatsächlich im jeweiligen Ordner vorhandenen Dateien einbauen.

Und nur zur Sicherheit: Die "Abrechnung_Rechnungen_KDNR_DATUM_LFDNR.PDF", aus welcher ich den variablen Teil (Suffix) hole, ist aber immer vorhanden?

Die Zeile "set "PDF2=Abrechnung_Gesamt_?????"" erfasst dann beide Dokumente (Also ABCDE und FGHIJ) ??
Das ist der Plan - es sei denn, ABCDE und FGHIJ wären konstant; dann würde ich sie exakt festlegen.

Dann müsstest du mir noch verraten, wie ich später die Löschsimulation entferne damit das Proggi dann lauffähig ist.
Relativ einfach - die mit "echo" beginnenden Zeilen kannst Du ersatzlos streichen, und in der "for"-Zeile musst Du nur das "echo" durch ein "del" ersetzen.

Grüße
bastla
43964
43964 25.01.2008 um 17:44:30 Uhr
Goto Top
Hi bastla.

Die am Anfang beschriebenen 4 Dokumente sind IMMER vorhanden.
Es gibt halt manchmal diese beiden zusätzlichen. Aber eben leider nicht immer.

Den Teil mit dem Suffix kann ich auch bestätigen. IMMER konstant. (Also "Abrechnung_Rechnungen). Kd-Nr / Datum variiert (Von der Stellenzahl aber konstant). Lfd-Nr wie gesagt aufsteigend.

Ich weiß gar nicht, wie ich danken soll face-wink

Gruß,
Schwimmbutz
bastla
bastla 25.01.2008 um 18:37:06 Uhr
Goto Top
Hallo Schwimmbutz!

Es sollten jetzt die beiden genannten zusätzlichen .pdf-Files ebenfalls in die Sammeldatei geschrieben werden. Wenn noch weitere Dateien (nur nach dem Muster "Abrechnung_Bezeichnung_KDNR_DATUM_LFDNR.pdf") hinzukommen, kannst Du diese einfach, durch Leerzeichen getrennt, in die Zeile "set PDFWeitere=..." aufnehmen.
@echo off & setlocal

set "Base=f:\outbox\aktuell"  
set "PDFTK=C:\Tools\pdftk.exe"  
::Download von: http://www.pdfhacks.com/pdftk/

set "PDF1=Abrechnung_Rechnungen"  
set "PDF2=Abrechnung_Gesamt_?????"  
set "PDFWeitere=Abrechnung_Buchungen Abrechnung_Zahlungen Abrechnung_Umbuchungen"  

set "PDFGes=Abrechnung_Gesamt"  

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

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

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

set "PDFListe=%PDF1%_%Suffix%"  
for %%a in (%PDF2%_%Suffix%) do call :ProcessFile "%%a"  
for %%a in (%PDFWeitere%) do call :ProcessFile "%%a_%Suffix%"  

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

::Loeschsimulation
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo del "%%i"  

:EndSub
popd
goto :eof

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

Grüße
bastla
43964
43964 28.01.2008 um 10:10:45 Uhr
Goto Top
Hallo bastla,

vielen Dank für die Lösung.
Ich habe eifrig getestet. Dabei sind mir doch noch Sachen aufgefallen:

Das Dokument: Abrechnung_Rechnungen ist nicht immer überall vorhanden.
Aber: Abrechnung_Buchungen ist überall vorhanden!

Ist es auch möglich, die Reihenfolge der Dokumente zu beeinflussen?
Ich habe etwas von set PDF=1... gelesen.

Und zwar:
Abrechnung_Gesamt_ABCDE = 1
Abrechnung_Gesamt_FGHIJ = 2
Abrechnung_Buchungen = Letzte

Diese 3 Dokumente sind IMMER vorhanden. Alle anderen dazwischen einsortieren. Ist das möglich?

Sorry, dass ich noch nicht fertig bin face-sad
bastla
bastla 28.01.2008 um 13:46:57 Uhr
Goto Top
Hallo Schwimmbutz!

Sind eigentlich (wie bisher von mir angenommen) "ABCDE" und "FGHIJ" variabel? Falls nein, lässt sich natürlich die Reihenfolge entsprechend fixieren, falls doch, müsstest Du ein Kriterium für die Reihung angeben (= woran ist "ABCDE" zu erkennen?).
Abrechnung_Buchungen ... IMMER vorhanden
In der nächsten Version (erst, wenn obige Frage geklärt ist) werde ich dann das Auslesen des Suffix "KDNR_DATUM_LFDNR.PDF" auf Basis dieser Datei vornehmen.

Grüße
bastla
43964
43964 28.01.2008 um 13:49:26 Uhr
Goto Top
Hi,

ABCDE ist immer fest belegt.
FGHIJ auch.

Hier werden 5stellige Firmennamen angegeben. Diese möchte ich allerdings hier im Netz nicht hinschreiben. Deshalb die Synonyme ABCDE bzw FGHIJ.
bastla
bastla 28.01.2008 um 14:02:18 Uhr
Goto Top
Hallo Schwimmbutz!

Dann versuchen wir's mal so:
@echo off & setlocal

set "Base=f:\outbox\aktuell"  
set "PDFTK=C:\Tools\pdftk.exe"  
::Download von: http://www.pdfhacks.com/pdftk/

set "PDFCheck=Abrechnung_Buchungen"  
set "PDFAlle=Abrechnung_Gesamt_ABCDE Abrechnung_Gesamt_FGHIJ Abrechnung_Rechnungen Abrechnung_Zahlungen Abrechnung_Umbuchungen Abrechnung_Buchungen"  

set "PDFGes=Abrechnung_Gesamt"  

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 "%%a_%Suffix%"  

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

::Loeschsimulation
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i  

:EndSub
popd
goto :eof

:ProcessFile
if exist "%~1" set "PDFListe=%PDFListe% %~1"  
Die Reihenfolge der einzelnen Dateien kannst Du in der Zeile
set "PDFAlle=..."  
festlegen.

Grüße
bastla
43964
43964 28.01.2008 um 14:36:29 Uhr
Goto Top
Super!

Das funktioniert 100%ig!

Was muss ich nun entfernen, um die Dateien wirklich zu löschen, und nicht nur zu simulieren?
bastla
bastla 28.01.2008 um 15:18:36 Uhr
Goto Top
Hallo Schwimmbutz!

Die Zeile
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i  
ist zu ändern auf
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do del %%i  

Grüße
bastla
43964
43964 28.01.2008 um 15:22:21 Uhr
Goto Top
Hallo Bastla.

Super!! Ich danke dir ganz herzlich!