Mehrere PDF zu PDF mit 1000 Seiten zusammenführen
Hallo!
Ich hab mit der Zusammenführung mehrer PDF – Dateien Probleme, vielleicht könnt ihr mir weiterhelfen.
Eine Applikation erstellt regelmäßig etwa 3000 PDF Dateien, mit jeweils 1 bis 5 Seiten.
Die Dateinamen beginnen immer entweder mit "A_" oder mit "J_", alle Dateien werden in einem bestimmten Ordner abgelegt.
Ich muss jetzt per Batch alle mit "A_" beginnenden PDF zu PDF- Dateien mit max. 1000 Seiten zusammenführen.
Danach sollen alle mit "J_" beginnenden PDF zu PDF- Dateien mit max. 1000 Seiten zusammengeführt werden.
Die zusammengeführten Dateien sollen dann wieder in einem bestimmten Ordner abgelegt werden, wobei der Dateiname wieder mit "A_" bzw. "J_" beginnen muss.
Mit Ghostscript können *.ps – Files zusammengefügt werden, aber kann man auch gleich direkt *.pdf - Dateien zusammenfügen? Bei rund 3000 Dateien dauert sonst die Umwandlung in *.ps schon einige Zeit.
Wichtiger ist aber wie ich die Seitenahmzahl prüfen kann.
Gibt es irgendeine Möglichkeit zu prüfen wie viele Seiten ein PDF schon hat und nur dann ein zusätzlich zuzufügen wenn es weniger als 1000 Seiten hat. Oder kann man sonst irgendwie dafür sorgen das die Dateien max. 1000 Seiten haben?
Wenn man die Anzahl der Seiten nicht feststellen kann, wie kann ich überhaupt per Batch dafür sorgen, dass nur die Dateien deren Name mit einem bestimmten Zeichen beginnt zusammengeführt werden?
Ich steh da im Moment ziemlich am Schlauch, hoffentlich könnt ihr mir ein paar Tipps geben!
Danke!!
lg
Ich hab mit der Zusammenführung mehrer PDF – Dateien Probleme, vielleicht könnt ihr mir weiterhelfen.
Eine Applikation erstellt regelmäßig etwa 3000 PDF Dateien, mit jeweils 1 bis 5 Seiten.
Die Dateinamen beginnen immer entweder mit "A_" oder mit "J_", alle Dateien werden in einem bestimmten Ordner abgelegt.
Ich muss jetzt per Batch alle mit "A_" beginnenden PDF zu PDF- Dateien mit max. 1000 Seiten zusammenführen.
Danach sollen alle mit "J_" beginnenden PDF zu PDF- Dateien mit max. 1000 Seiten zusammengeführt werden.
Die zusammengeführten Dateien sollen dann wieder in einem bestimmten Ordner abgelegt werden, wobei der Dateiname wieder mit "A_" bzw. "J_" beginnen muss.
Mit Ghostscript können *.ps – Files zusammengefügt werden, aber kann man auch gleich direkt *.pdf - Dateien zusammenfügen? Bei rund 3000 Dateien dauert sonst die Umwandlung in *.ps schon einige Zeit.
Wichtiger ist aber wie ich die Seitenahmzahl prüfen kann.
Gibt es irgendeine Möglichkeit zu prüfen wie viele Seiten ein PDF schon hat und nur dann ein zusätzlich zuzufügen wenn es weniger als 1000 Seiten hat. Oder kann man sonst irgendwie dafür sorgen das die Dateien max. 1000 Seiten haben?
Wenn man die Anzahl der Seiten nicht feststellen kann, wie kann ich überhaupt per Batch dafür sorgen, dass nur die Dateien deren Name mit einem bestimmten Zeichen beginnt zusammengeführt werden?
Ich steh da im Moment ziemlich am Schlauch, hoffentlich könnt ihr mir ein paar Tipps geben!
Danke!!
lg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 47300
Url: https://administrator.de/contentid/47300
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo lg,
ich kan nur Schnipselchen liefern ... habe gerade keine Zeit, ein funktionierendes Etwas zusammenzubasteln.
--- Zusammenfügen:
Suche nach einem Tool pdftk.
Zum Zusammenfügen gibt es:
pdftk *.pdf cat output combined.pdf
--- Seitenahnzahl
http://www.foolabs.com/xpdf/
Das dortige tool "pdfinfo" liefert Infos zu einem PDF ... u.a. auch die Seitenanzahl.
pdfinfo [Dateiname]
Viele Grüsse
-= Axel =-
Viele Grüsse
-= Axel =-
ich kan nur Schnipselchen liefern ... habe gerade keine Zeit, ein funktionierendes Etwas zusammenzubasteln.
--- Zusammenfügen:
Suche nach einem Tool pdftk.
Zum Zusammenfügen gibt es:
pdftk *.pdf cat output combined.pdf
--- Seitenahnzahl
http://www.foolabs.com/xpdf/
Das dortige tool "pdfinfo" liefert Infos zu einem PDF ... u.a. auch die Seitenanzahl.
pdfinfo [Dateiname]
Viele Grüsse
-= Axel =-
Viele Grüsse
-= Axel =-
Hallo Hatl!
Wurden die Einzeldateien vor der Bearbeitung gesichert und dürfen daher verschoben bzw auch gelöscht werden?
@AxelHahn
liefert auch die Seitenzahl - ein Tool weniger erforderlich.
Grüße
bastla
Ich muss jetzt per Batch alle mit "A_" beginnenden PDF zu PDF- Dateien mit max. 1000 Seiten zusammenführen.
In welcher Reihenfolge sollen die Dateien zusammengefügt werden - gibt es eine laufende Nummer, kann man chronologisch vorgehen, ist es egal?Die zusammengeführten Dateien sollen dann wieder in einem bestimmten Ordner abgelegt werden, wobei der Dateiname wieder mit "A_" bzw. "J_" beginnen muss.
Wie sollen die Ergebnis-pdf-Files genau heißen? Gibt es für die Ergebnisse einen immer gleich bleibenden Zielordner?Wurden die Einzeldateien vor der Bearbeitung gesichert und dürfen daher verschoben bzw auch gelöscht werden?
@AxelHahn
pdftk Test.pdf dump_data
Grüße
bastla
Hallo Hatl!
Ich habe einmal vorweg meine oben gestellten Fragen wie folgt selbst beantwortet :
Die pdf-Dateien werden in chronologischer Reihenfolge zunächst aus dem Quell-Ordner ("SourceDir") in temporäre Ordner "A_2007-01-09_#" bzw "J_2007-01-09_#" (im Pfad "TempDir") verschoben (# ist eine laufende Nummer, beginnend bei 1), wobei die Gesamtseitenzahl aller Dateien eines Ordners max 1000 beträgt (falls es keine Ausgangsdatei mit mehr als 1000 Seiten gibt ).
Vor der Verarbeitung der einzelnen Dateien wird der gesamte Temp-Ordner gelöscht (und damit die Einzel-pdf-Dateien des letzten Durchlaufes).
Da das verwendete pdf-Tool "pdftk-1.12" anscheinend keine unter Anführungszeichen stehenden Dateinamen mit Platzhalterzeichen ("*") verarbeiten kann, dürfen weder der "TempDir"-Pfad noch die Namen der einzelnen pdf-Dateien Leerstellen aufweisen!
Für die Erstellung des Datums wurde angenommen, dass ein echo %date% an der Kommandozeile eine Datumsanzeige der Form 09.01.2007 (also ohne Wochentag) ergibt - anderenfalls wäre eine Anpassung erforderlich.
In einem zweiten Arbeitsschritt werden alle Dateien jedes temporären Ordners zu einer einzigen pdf-Datei zusammengefasst. Der Name dieser Datei entspricht dem Namen des temporären Ordners. So entstehen also die Dateien "A_2007-01-09_1.pdf", "A_2007-01-09_2.pdf", ... (analog für "J_*").
Abgelegt werden diese Dateien in einem vorgegebenen Ziel-Ordner ("TargetDir").
Bis zum nächsten Lauf der Batchdatei bleiben die ursprünglichen pdf-Dateien in den temporären Ordnern gespeichert.
So wie für die oben besprochenen Verzeichnisse ist auch der Pfad des verwendeten Programmes "pdftk-1.12" (Download über die Projektseite; keine Installation, sondern nur Entpacken erforderlich) in der Batchdatei zu hinterlegen (Zeilen 2 bis 5).
Die Batchdatei sollte wie beschrieben funktionieren, ist aber nur oberflächlich getestet.
Grüße
bastla
Ich habe einmal vorweg meine oben gestellten Fragen wie folgt selbst beantwortet :
Die pdf-Dateien werden in chronologischer Reihenfolge zunächst aus dem Quell-Ordner ("SourceDir") in temporäre Ordner "A_2007-01-09_#" bzw "J_2007-01-09_#" (im Pfad "TempDir") verschoben (# ist eine laufende Nummer, beginnend bei 1), wobei die Gesamtseitenzahl aller Dateien eines Ordners max 1000 beträgt (falls es keine Ausgangsdatei mit mehr als 1000 Seiten gibt ).
Vor der Verarbeitung der einzelnen Dateien wird der gesamte Temp-Ordner gelöscht (und damit die Einzel-pdf-Dateien des letzten Durchlaufes).
Da das verwendete pdf-Tool "pdftk-1.12" anscheinend keine unter Anführungszeichen stehenden Dateinamen mit Platzhalterzeichen ("*") verarbeiten kann, dürfen weder der "TempDir"-Pfad noch die Namen der einzelnen pdf-Dateien Leerstellen aufweisen!
Für die Erstellung des Datums wurde angenommen, dass ein echo %date% an der Kommandozeile eine Datumsanzeige der Form 09.01.2007 (also ohne Wochentag) ergibt - anderenfalls wäre eine Anpassung erforderlich.
In einem zweiten Arbeitsschritt werden alle Dateien jedes temporären Ordners zu einer einzigen pdf-Datei zusammengefasst. Der Name dieser Datei entspricht dem Namen des temporären Ordners. So entstehen also die Dateien "A_2007-01-09_1.pdf", "A_2007-01-09_2.pdf", ... (analog für "J_*").
Abgelegt werden diese Dateien in einem vorgegebenen Ziel-Ordner ("TargetDir").
Bis zum nächsten Lauf der Batchdatei bleiben die ursprünglichen pdf-Dateien in den temporären Ordnern gespeichert.
So wie für die oben besprochenen Verzeichnisse ist auch der Pfad des verwendeten Programmes "pdftk-1.12" (Download über die Projektseite; keine Installation, sondern nur Entpacken erforderlich) in der Batchdatei zu hinterlegen (Zeilen 2 bis 5).
@echo off & setlocal
set SourceDir=D:\PDF
set TargetDir=D:\PDFertig
set TempDir=D:\PDFTemp
set Prog=C:\Programme\pdftk-1.12\pdftk.exe
::Download "the pdf toolkit" über: http://www.accesspdf.com/index.php?topic=pdftk
set NameNeu=%Date:~6,4%-%Date:~3,2%-%Date:~0,2%_
::Bei Bedarf auch Uhrzeit einfügen
::for /f "tokens=1-3 delims=:, " %%a in ('echo %time%') do set NameNeu=%NameNeu%%%a-%%b-%%c_
set MaxSeiten=1000
If exist %TempDir% rd /s /q %TempDir%
md %TempDir%
for %%a in (A_ J_) do call :ProcessFiles %%a
for %%a in (A_ J_) do call :ProcessFolders %%a
echo.
echo Bearbeitung abgeschlossen.
goto :eof
:ProcessFiles
If not exist "%SourceDir%\%1*.pdf" (echo Keine %1-Dateien vorhanden.) & goto :eof
set SammelDir=%1%NameNeu%
set /a Teil=1
set /a Seiten=0
md "%TempDir%\%SammelDir%%Teil%"
echo Bearbeite Sammelordner %SammelDir%%Teil%
for /f "delims=" %%f in ('dir "%SourceDir%\%1*.pdf" /b /od') do (for /f "tokens=2" %%i in ('%Prog% "%SourceDir%\%%f" dump_data ^| find "NumberOfPages"') do call :Check "%%f" %%i)
goto :eof
:Check
set /a Seiten=%Seiten%+%2
if %Seiten% leq %MaxSeiten% goto :MoveIt
set /a Teil+=1
md "%TempDir%\%SammelDir%%Teil%"
echo Bearbeite Sammelordner %SammelDir%%Teil%
set Seiten=%2
:MoveIt
move "%SourceDir%\%~1" "%TempDir%\%SammelDir%%Teil%"
goto :eof
:ProcessFolders
If not exist "%TempDir%\%1*" (echo Keine %1-Verzeichnisse vorhanden.) & goto :eof
for /f %%f in ('dir "%TempDir%\%1*" /b /ad') do %Prog% %TempDir%\%%f\*.pdf cat output "%TargetDir%\%%f.pdf"
Grüße
bastla
Hallo Hatl!
Villeicht vorweg ganz allgemein:
Die "for"-Zeile ist nur für die Steuerung des zweimaligen Durchlaufs (für "A_" und für "J_") der eigentlichen Verarbeitung in der Routine ab ":ProcessFiles" zuständig. Beim Aufruf dieses "Unterprogrammes" wird die Kennung mit übergeben ("call :ProcessFiles %%a", wobei %%a beim ersten Mal das "A_" aus der Klammer vorne und beim zweiten Mal das "J_" enthält.
Dir Routine ":ProcessFiles" übernimmt das beim Aufruf mitgegebene Argument (wie jede Batchdatei) als "%1" und arbeitet damit weiter (um zB den Namen des Sammel-Verzeichnisses aus %1 und der am Anfang definierten Variable %NameNeu% zusammenzusetzen -> so entsteht "A_2007-01-09_").
Analog die Vorgangsweise für ":Check" - hier werden beim Aufruf der Dateiname (%%f) und die Seitenanzahl (%%i) übergeben und in der Routine wiederum als %1 und %2 übernommen.
Allfällige Anführungszeichen dienen immer dazu, eventuelle Leerzeichen "einzuschließen", da in Batch eine Leerstelle generell als Trennzeichen gilt (und so zB aus einem Dateinamen mit 2 Leerstellen 3 Argumente würden).
wird beispielsweise beim ersten Durchlauf so ausgeführt:
und der Aufruf der einzelnen A_*.pdf erfolgt hier:
Noch eine Anmerkung: Wenn der Batch nur einmal an einem Tag läuft, sollte die Benennung mit dem Datum genügen, ansonsten kann ich bei Bedarf noch die Uhrzeit als Zusatzinformation in den Dateinamen einbauen.
Im Übrigen ist zu betonen, dass die eigentliche Arbeit ja durch das Tool "pdftk" erledigt wird - schön, dass es solche Software frei verfügbar gibt.
Grüße
bastla
Villeicht vorweg ganz allgemein:
Die "for"-Zeile ist nur für die Steuerung des zweimaligen Durchlaufs (für "A_" und für "J_") der eigentlichen Verarbeitung in der Routine ab ":ProcessFiles" zuständig. Beim Aufruf dieses "Unterprogrammes" wird die Kennung mit übergeben ("call :ProcessFiles %%a", wobei %%a beim ersten Mal das "A_" aus der Klammer vorne und beim zweiten Mal das "J_" enthält.
Dir Routine ":ProcessFiles" übernimmt das beim Aufruf mitgegebene Argument (wie jede Batchdatei) als "%1" und arbeitet damit weiter (um zB den Namen des Sammel-Verzeichnisses aus %1 und der am Anfang definierten Variable %NameNeu% zusammenzusetzen -> so entsteht "A_2007-01-09_").
Analog die Vorgangsweise für ":Check" - hier werden beim Aufruf der Dateiname (%%f) und die Seitenanzahl (%%i) übergeben und in der Routine wiederum als %1 und %2 übernommen.
Allfällige Anführungszeichen dienen immer dazu, eventuelle Leerzeichen "einzuschließen", da in Batch eine Leerstelle generell als Trennzeichen gilt (und so zB aus einem Dateinamen mit 2 Leerstellen 3 Argumente würden).
Woran kann ich hier erkennen, dass im definierten SourceDir nach PDF beginnend mit A_ u. J_ gesucht wird? Hier steht ja niergendes ein Pfad, bzw. das das A und J im Dateinamen zu finden sein sollen.
Die ZeileIf not exist "<b>%SourceDir%\%1*.pd</b>f" (echo Keine <b>%1</b>-Dateien vorhanden.) & goto :eof
If not exist "<b>D:\PDF\A_*.pdf</b>" (echo Keine <b>A_</b>-Dateien vorhanden.) & goto :eof
for /f "delims=" %%f in ('dir "<b>%SourceDir%\%1*.pdf</b>" /b /od') do ...
Noch eine Anmerkung: Wenn der Batch nur einmal an einem Tag läuft, sollte die Benennung mit dem Datum genügen, ansonsten kann ich bei Bedarf noch die Uhrzeit als Zusatzinformation in den Dateinamen einbauen.
Im Übrigen ist zu betonen, dass die eigentliche Arbeit ja durch das Tool "pdftk" erledigt wird - schön, dass es solche Software frei verfügbar gibt.
Grüße
bastla
Hallo Hatl!
Zumindest was die "zufälligen" 1000 Seiten angeht, hätte ich einen Vorschlag:
Füge die folgende Zeile zwischen dem Label ":MoveIt" und der "move ..."-Zeile ein:
Damit wird vor jedem Verschiebevorgang der TeileOrdner, die akkumulierte Seitenzahl (nach dem Hinzufügen der aktuellen Datei), der Dateiname und die Seitenanzahl protokolliert. Wenn Du ein ";" als Trennzeichen verwendest, könntest Du die Logdatei zB in Excel importieren und damit etwas übersichtlicher darstellen.
Leider bin ich momentan etwas unter Zeitdruck ...
Grüße
bastla
[Edit] Trennzeichen auf ";" geändert [/Edit]
Zumindest was die "zufälligen" 1000 Seiten angeht, hätte ich einen Vorschlag:
Füge die folgende Zeile zwischen dem Label ":MoveIt" und der "move ..."-Zeile ein:
echo %SammelDir%%Teil%;%Seiten%;%1;%2 >> D:\Log.txt
Leider bin ich momentan etwas unter Zeitdruck ...
Grüße
bastla
[Edit] Trennzeichen auf ";" geändert [/Edit]
Hallo Hatl!
Um zu klären, wo diese Rest-Dateien auf der Strecke bleiben, könntest Du eine weitere Logzeile gleich am Anfang des ":Check"-Teiles einbauen - so siehst Du wenigstens, ob sie bis dort hin gekommen sind.
Die heftigste Variante des Loggens wäre übrigens der Verzicht auf das "Echo off" in Zeile 1 und der Aufruf der Batch-Datei mit "Batch-Datei > LogFull.txt".
Ich gehe davon aus, dass Du die fraglichen Dateien schon auf Besonderheiten / Gemeinsamkeiten hin abgeklopft hast, und kann mir leider derzeit nicht vorstellen, was der Grund für die "Nichtbeachtung" sein könnte (noch nicht einmal eine falsch ermittelte Seitenzahl dürfte sich auswirken - wenn sie nicht mehr in den einen Ordner passen, kommen sie ja ohne weitere Prüfung in den nächsten).
Grüße
bastla
Um zu klären, wo diese Rest-Dateien auf der Strecke bleiben, könntest Du eine weitere Logzeile gleich am Anfang des ":Check"-Teiles einbauen - so siehst Du wenigstens, ob sie bis dort hin gekommen sind.
Die heftigste Variante des Loggens wäre übrigens der Verzicht auf das "Echo off" in Zeile 1 und der Aufruf der Batch-Datei mit "Batch-Datei > LogFull.txt".
Ich gehe davon aus, dass Du die fraglichen Dateien schon auf Besonderheiten / Gemeinsamkeiten hin abgeklopft hast, und kann mir leider derzeit nicht vorstellen, was der Grund für die "Nichtbeachtung" sein könnte (noch nicht einmal eine falsch ermittelte Seitenzahl dürfte sich auswirken - wenn sie nicht mehr in den einen Ordner passen, kommen sie ja ohne weitere Prüfung in den nächsten).
Grüße
bastla
Moin hatl,
dieser Seiteneffekt kann eigentlich nur deshalb auftreten, weil manchmal auch *.pdf's mit "Leerzeichen im Namen oder Pfad" dabei sind.
Denn zumindest in bastla's obiger Skizze ist es nicht durchgängig berücksichtigt, z.B. in der letzten Zeile:
Ergänze das fett gedruckte bei allen For/F-Anweisungen, dann sollte es auch reproduzierbar auf beliebigen Rechnern klappen.
Aber, wenn ich Dich richtig verstanden habe, könnte von Deiner Seite so oder so ein Haken dran?
Grüße
Biber
der offene Beiträge hasst, wenn sie in Rudeln auftreten...
dieser Seiteneffekt kann eigentlich nur deshalb auftreten, weil manchmal auch *.pdf's mit "Leerzeichen im Namen oder Pfad" dabei sind.
Denn zumindest in bastla's obiger Skizze ist es nicht durchgängig berücksichtigt, z.B. in der letzten Zeile:
...
If not exist "%TempDir%\%1*" (echo Keine %1-Verzeichnisse vorhanden.) & goto :eof
for /f <b>"delims="</b> %%f in ('dir "%TempDir%\%1*" /b /ad')
Ergänze das fett gedruckte bei allen For/F-Anweisungen, dann sollte es auch reproduzierbar auf beliebigen Rechnern klappen.
Aber, wenn ich Dich richtig verstanden habe, könnte von Deiner Seite so oder so ein Haken dran?
Grüße
Biber
der offene Beiträge hasst, wenn sie in Rudeln auftreten...
@Biber
Danke für die Nachbesserung (auch die %TempDir% weiter oben müssten noch Anführungszeichen bekommen), obwohl es nicht daran liegen sollte - die fragliche "for"-Schleife bearbeitet nur bereits fertig befüllte Verzeichnisse, während das Problem die nicht verschobenen Dateien (Routine ":ProcessFiles" zum Befüllen der Verzeichnisse) sind.
Aber da Hatl sich zu helfen wusste (und mir mangels näherer Kenntnis seiner Dateien die Ideen ausgegangen sind), schließe ich mich Deinem Vorschlag zum "Abhaken" des Themas an ...
Grüße
bastla
Danke für die Nachbesserung (auch die %TempDir% weiter oben müssten noch Anführungszeichen bekommen), obwohl es nicht daran liegen sollte - die fragliche "for"-Schleife bearbeitet nur bereits fertig befüllte Verzeichnisse, während das Problem die nicht verschobenen Dateien (Routine ":ProcessFiles" zum Befüllen der Verzeichnisse) sind.
Aber da Hatl sich zu helfen wusste (und mir mangels näherer Kenntnis seiner Dateien die Ideen ausgegangen sind), schließe ich mich Deinem Vorschlag zum "Abhaken" des Themas an ...
Grüße
bastla