Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PDFs per Batch zusammenfügen

Frage Entwicklung Batch & Shell

Mitglied: 43964

43964 (Level 1)

25.01.2008, aktualisiert 17.10.2012, 18215 Aufrufe, 17 Kommentare

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 (http://www.administrator.de/frage/pdf-dateien-in-vielen-unterordnern-mi ...) gelesen, aber die Batch war für mich zu kompliziert, als dass ich diese einfach hätte umschreiben können.


Vielen Dank!
Mitglied: Dynadrate
25.01.2008 um 15:16 Uhr
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.
Bitte warten ..
Mitglied: bastla
25.01.2008 um 16:07 Uhr
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 :
01.
@echo off & setlocal 
02.
 
03.
set "Base=f:\outbox\aktuell" 
04.
set "PDFTK=C:\Tools\pdftk.exe" 
05.
::Download von: http://www.pdfhacks.com/pdftk/ 
06.
 
07.
set "PDF1=Abrechnung_Rechnungen" 
08.
set "PDF2=Abrechnung_Gesamt_?????" 
09.
set "PDF3=Abrechnung_Buchungen" 
10.
 
11.
set "PDFGes=Abrechnung_Gesamt" 
12.
 
13.
for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i" 
14.
goto :eof 
15.
 
16.
:ProcessCust 
17.
pushd "%~f1" 
18.
if not exist "%PDF1%_*.pdf" goto :EndSub 
19.
 
20.
for /f "tokens=2* delims=_" %%a in ('dir /b "%PDF1%_*.pdf"') do set "Suffix=%%b" 
21.
"%PDFTK%"  %PDF1%_%Suffix% %PDF2%_%Suffix% %PDF3%_%Suffix% cat output "%PDFGes%_%Suffix%" dont_ask 
22.
 
23.
::Loeschsimulation 
24.
echo Zu loeschen in %cd%: 
25.
echo. 
26.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i 
27.
echo ============================================= 
28.
echo. 
29.
echo. 
30.
 
31.
:EndSub 
32.
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]
Bitte warten ..
Mitglied: 43964
25.01.2008 um 16:46 Uhr
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.
Bitte warten ..
Mitglied: bastla
25.01.2008 um 16:53 Uhr
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
Bitte warten ..
Mitglied: 43964
25.01.2008 um 17:07 Uhr
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!
Bitte warten ..
Mitglied: bastla
25.01.2008 um 17:11 Uhr
Hallo Schwimmbutz!

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

Grüße
bastla
Bitte warten ..
Mitglied: 43964
25.01.2008 um 17:23 Uhr
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
Vielen Dank.
Bitte warten ..
Mitglied: bastla
25.01.2008 um 17:40 Uhr
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 , 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
Bitte warten ..
Mitglied: 43964
25.01.2008 um 17:44 Uhr
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

Gruß,
Schwimmbutz
Bitte warten ..
Mitglied: bastla
25.01.2008 um 18:37 Uhr
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.
01.
@echo off & setlocal 
02.
 
03.
set "Base=f:\outbox\aktuell" 
04.
set "PDFTK=C:\Tools\pdftk.exe" 
05.
::Download von: http://www.pdfhacks.com/pdftk/ 
06.
 
07.
set "PDF1=Abrechnung_Rechnungen" 
08.
set "PDF2=Abrechnung_Gesamt_?????" 
09.
set "PDFWeitere=Abrechnung_Buchungen Abrechnung_Zahlungen Abrechnung_Umbuchungen" 
10.
 
11.
set "PDFGes=Abrechnung_Gesamt" 
12.
 
13.
for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i" 
14.
goto :eof 
15.
 
16.
:ProcessCust 
17.
pushd "%~f1" 
18.
if not exist "%PDF1%_*.pdf" goto :EndSub 
19.
 
20.
for /f "tokens=2* delims=_" %%a in ('dir /b "%PDF1%_*.pdf"') do set "Suffix=%%b" 
21.
 
22.
set "PDFListe=%PDF1%_%Suffix%" 
23.
for %%a in (%PDF2%_%Suffix%) do call :ProcessFile "%%a" 
24.
for %%a in (%PDFWeitere%) do call :ProcessFile "%%a_%Suffix%" 
25.
 
26.
"%PDFTK%" %PDFListe% cat output "%PDFGes%_%Suffix%" dont_ask 
27.
 
28.
::Loeschsimulation 
29.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo del "%%i" 
30.
 
31.
:EndSub 
32.
popd 
33.
goto :eof 
34.
 
35.
:ProcessFile 
36.
if exist "%~1" set "PDFListe=%PDFListe% %~1"
Grüße
bastla
Bitte warten ..
Mitglied: 43964
28.01.2008 um 10:10 Uhr
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
Bitte warten ..
Mitglied: bastla
28.01.2008 um 13:46 Uhr
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
Bitte warten ..
Mitglied: 43964
28.01.2008 um 13:49 Uhr
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.
Bitte warten ..
Mitglied: bastla
28.01.2008 um 14:02 Uhr
Hallo Schwimmbutz!

Dann versuchen wir's mal so:
01.
@echo off & setlocal 
02.
 
03.
set "Base=f:\outbox\aktuell" 
04.
set "PDFTK=C:\Tools\pdftk.exe" 
05.
::Download von: http://www.pdfhacks.com/pdftk/ 
06.
 
07.
set "PDFCheck=Abrechnung_Buchungen" 
08.
set "PDFAlle=Abrechnung_Gesamt_ABCDE Abrechnung_Gesamt_FGHIJ Abrechnung_Rechnungen Abrechnung_Zahlungen Abrechnung_Umbuchungen Abrechnung_Buchungen" 
09.
 
10.
set "PDFGes=Abrechnung_Gesamt" 
11.
 
12.
for /d %%i in ("%Base%\*.*") do call :ProcessCust "%%i" 
13.
goto :eof 
14.
 
15.
:ProcessCust 
16.
pushd "%~f1" 
17.
if not exist "%PDFCheck%_*.pdf" goto :EndSub 
18.
 
19.
for /f "tokens=2* delims=_" %%a in ('dir /b "%PDFCheck%_*.pdf"') do set "Suffix=%%b" 
20.
 
21.
set PDFListe= 
22.
for %%a in (%PDFAlle%) do call :ProcessFile "%%a_%Suffix%" 
23.
 
24.
"%PDFTK%" %PDFListe% cat output "%PDFGes%_%Suffix%" dont_ask 
25.
 
26.
::Loeschsimulation 
27.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i 
28.
 
29.
:EndSub 
30.
popd 
31.
goto :eof 
32.
 
33.
:ProcessFile 
34.
if exist "%~1" set "PDFListe=%PDFListe% %~1"
Die Reihenfolge der einzelnen Dateien kannst Du in der Zeile
01.
set "PDFAlle=..."
festlegen.

Grüße
bastla
Bitte warten ..
Mitglied: 43964
28.01.2008 um 14:36 Uhr
Super!

Das funktioniert 100%ig!

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

Die Zeile
01.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do echo %%i
ist zu ändern auf
01.
for /f "delims=" %%i in ('dir /b "*_%Suffix%"^|findstr /v "%PDFGes%_%Suffix%"') do del %%i
Grüße
bastla
Bitte warten ..
Mitglied: 43964
28.01.2008 um 15:22 Uhr
Hallo Bastla.

Super!! Ich danke dir ganz herzlich!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Mehrere PDF-Dateien per Batch zusammenfügen (1)

Frage von Grimmli zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...