Hallo zusammen,
ich möchte via VBA Schleifen-Script aus einer zu öffnenden PDF-Datei einzelne PDF-Datei erstellen.
Ausgangslage ist, dass die jeweils zu druckenden Seiten und die Dateinamen immer fix sind und im Script selbst stehen sollen.
Ort & Name der zu druckenden PDF-Datei: C:\AVS32\access\Tiergarten.pdf
Seiten Dateiname
----------------- ---------------------
9,30,31 BAB Hund.pdf
10,32,33,11,34,35 BAB Katze.pdf
12,36,37 BAB Maus.pdf
Speicher-Pfad für PDF's: C:\AVS32\access
Wie kann man das per VBA machen ?
Als PDF-Drucker nutze ich i.Ü. PDF24.
Danke für Deine Antwort im Voraus.
Tom
Hallo Tom,
VBA unterstützt das nicht direkt, aber mit Commandline-Tools wie PDFtk (https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/) oder CPdf (https://community.coherentpdf.com/) sollte das machbar sein.
Gruß
Knobbi38
Unser Admin ist von dem Command-Line-Tool CPdf nicht sonderlich begeistert und gestattet mir auch nicht einen weiteren PDF-Drucker zu installieren.
Was wäre denn der indirekte Weg das in Access mit VBA vielleicht doch gelöst zu bekommen ?
Hallo Tom,
habt Ihr denn auf den Rechner den Adobe Acrobat (nicht nur den Reader)? Weil dann könnte man die Bibliothek von Adobe benutzen
Holger
Warum möchtest du einen neuen PDF-Drucker installieren? Wenn cpdf deinem Admin nicht gefällt, bleibt dir immer noch das Tool PDFtk. Ansonsten kann dir dein Admin ja für das Produkt Acrobat von Adobe ein Abo schenken, damit du deine Aufgabe erfüllen kannst. "Wasch mich, aber mach mich nicht nass" gibt es nicht!
Tools ohne VBA Anbindung zum Splitten von PDF-Dateien gibt es viele, sowohl ONLINE als auch OFFLINE. Die OFFLINE Varianten müssen aber auch installiert werden, z.B. PDFSam Basic (https://pdfsam.org/pdfsam-basic/). Automatisierung ist dabei aber nicht möglich.
Leider steht mir neben PDF24 nur noch der Adobe Reader und Microsoft Print to Pdf zur Verfügung.
Das mit PDFtk hatte ich schon vor einiger Zeit mal probiert, bin aber leider aus nicht mehr bekannten Hindernissen gescheitert.
Na ich muss wohl noch mal mit unserem Admin sprechen, ob da vielleicht doch was mit cpdf wird.
Liesse sich dann damit eine Art Batch-Datei erstellen, die dann nach dem folgenden Schema funktioniert ?
cpdf Tiergarten.pdf 9,30,31 -o Hund.pdf
cpdf Tiergarten.pdf 12,36,37 -o Maus.pdf
.
.
.
Frag mal ansonsten den Admin ob eventuell eine Bibliothek wie PDFsharp oder iTextSharp damit geht das auch.
Holger
Zitat von: Tom75 am Oktober 29, 2024, 21:37:22Na ich muss wohl noch mal mit unserem Admin sprechen, ob da vielleicht doch was mit cpdf wird.
Warum glaubst du, dass es damit besser wird?
PDF24 bietet eine genaue Dokumentation und ein Forum - alles kostenlos.
Das mindeste was du investieren musst ist deine Zeit.
Professionelle PDF Software mit entsprechenden COM Schnittstellen geht gleich mal in > 1000 Euro pro Entwicklerlizenz und auch damit geht nichts ohne Zeit Investition. ;)
Hey soweit ich weiß kannst du aber pdf24 nicht direkt über Vba ansprechen nur über z.B. ShellExecute.
Holger
Zitat von: Debus am Oktober 29, 2024, 22:17:04pdf24 nicht direkt über Vba ansprechen
Commandline Befehle gehen per VBA gehen z.B. via Shell Funktion.
Da muss man weder API noch sonstige Windows COM Klassen bemühen, die aber deutlich mehr können.
@markusxy Dann kann man auch gleich PDFtk verwenden.
Hallo Tom,
z.B. so
pdftk my.pdf cat 1-5 13-21 24-end output my_edited.pdfSiehe auch:
https://charlieharvey.org.uk/page/howto_breaking_pdfs_up_into_mutiple_pages (https://charlieharvey.org.uk/page/howto_breaking_pdfs_up_into_mutiple_pages)
Mit der folgenden Zeile öffnet sich zumindest der PDF24 Assistant, doch soll der eigentlich gar nicht erscheinen, aber dafür noch nur festgelegte Seiten gedruckt/gespeichert werden.
Wie kann man das noch ergänzen ?
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & "C:\Exporte\Tiergarten.pdf" & " -outputFile " & "C:\Exporte\test2.pdf"
Also ich hab mir jetzt mal das Manual angesehen (https://creator.pdf24.org/manual/11/#111-command-line), jedoch nichts passendes gefunden.
Kann von Euch Profis bitte noch mal jemand helfen ?
Zitat von: Tom75 am Oktober 30, 2024, 10:35:33Also ich hab mir jetzt mal das Manual angesehen (https://creator.pdf24.org/manual/11/#111-command-line), jedoch nichts passendes gefunden.
Schau dir mal das Argument -join an. - Etwa zu Beginn des letzten Drittels der Seite zu finden:
Zitatpdf24-DocTool.exe -join [-sort] [-bookmarks bookmarksCmd] [-profile profileId] [-outputDir dir] [-outputFile file] file1 [file2] ...
Joins input files to one output file.
-join
Tells the DocTool to join the input files.
...
Wenn ich das als Fachlaie jetzt nicht falsch verstehe, werden damit alle Seiten eines Dokuments in jeweils 1 Dokument mit 1 Seite erstellt ... oder ?
Was ich möchte ist aber, dass aus 1 PDF-Dokument die Seiten 2,4,9,36 in ein eigenes PDF-Dokument gedruckt werden.
Zitat von: Tom75 am Oktober 30, 2024, 10:59:41Was ich möchte ist aber, das aus 1 PDF-Dokument die Seiten 2,4,9,36 in ein eigenes PDF-Dokument gedruckt werden.
OK. Das habe ich missverstanden.
Dann zuerst
-splitByPage und im Anschluss
-join.
Ich habe nun die nach folgende Zeile zusammengetragen. Jedoch wird mir mit diesem im Ordner Exporte ein Ordner namens "test2.pdf" erstellt und in diesen ALLE einzelne Seiten als eigene PDF-Datei erstellt. Das ist es leider auch nicht wie ich es benötige.
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & " -splitByPage 2,4,9,36 " & "C:\Exporte\Tiergarten.pdf" & " -outputFile " & "C:\Exporte\test2.pdf"
Ich benötige aus dem aufgerufenen PDF-Dokument "C:\Exporte\Tiergarten.pdf" ausschliesslich die Seiten 2,4,9,36 ... die dann in der Datei namens test2.pdf im Ordner "C:\Exporte\" abgespeichert werden soll.
Zitat von: Tom75 am Oktober 30, 2024, 11:16:08Ich benötige aus dem aufgerufenen PDF-Dokument "C:\Exporte\Tiergarten.pdf" ausschliesslich die Seiten 2,4,9,36 ... die dann in der Datei namens test2.pdf im Ordner "C:\Exporte\" abgespeichert werden soll.
Schon verstanden.
Ich schrieb:
ZitatDann zuerst -splitByPage und im Anschluss -join.
Mit
-splitByPage teilst du das bestehende Dokument in (alle) einzelnen Seiten auf. - Das hast du jetzt gemacht.
Im nächsten Schritt fügst du dann die gewünschten Seiten mit
-join zu einem neuen PDF zusammen.
Hallo Tom,
vergiss PDF24, weil die -splitByPage Option ein Dokument nach jeder Seite aufteilt. Das Tool kann eine Menge, aber eben genau das nicht, was du vor hast, zumindest nur sehr umständlich:
Du müsstest alle Seiten-Dateien in ein Temp-Verzeichnis ausgeben, dir dann die Dateien wieder zusammen suchen und die Dateinamen in ein Textfile schreiben und anschließend PDF24 mit join und auf diese Textdatei mit der Profile-Option (glaube ich zumindest) verweisen. Anschließend das Temp-Verzeichnis samt Inhalt wieder löschen, nicht vergessen!
Gruß
Knobbi38
Hallo zusammen, danke für Eure Tipps.
Ich hab jetzt mal folgende 2 Zeilen erstellt und meine Kommtare darunter geschrieben.
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & "C:\Exporte\Tiergarten.pdf" & " -splitByPage " & " -outputFile " & "C:\Exporte\Seite"
' komisch das hier ein Ordner namens "Seite.pdf" erstellt wird
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & Chr(34) & " -join -profile " & Chr(34) & "default/good" & "-outputFile " & Chr(34) & "C:\Exporte\Hund.pdf" & Chr(34) & "C:\Exporte\Seite.pdf\Seite-0013.pdf C:\Exporte\Seite.pdf\Seite-0014.pdf"
' Fazit des 2. Codes ... es passiert nichts, wobei die beiden zu druckenden Seiten im erstellten Ordner vorhanden sind.
Hallo Tom,
du kannst doch nicht einfach eine neue Syntax erfinden. Was bitte schön sollen den die Dateiangaben hinter -outfile bewirken?
Lese die im Manual nochmal genau durch, wie das mit der Option -profile gehandhabt wird.
Ich habe das mit -Profil jetzt mal weggelassen.
Die Pfadangaben hinter -outputFile sind doch Angaben für die zu erstellende Datei und die Dateien aus denen diese besteht. Die Syntax dafür hatte ich mir aus dem Forum gezogen:
https://help.pdf24.org/de/fragen/frage/pdf24-doctool-join-stdout/
https://help.pdf24.org/de/fragen/frage/profil-uebergabe-funktioniert-nicht/
pdf24-DocTool.exe -join [-sort] [-bookmarks bookmarksCmd] [-profile profileId] [-outputDir dir] [-outputFile file] file1 [file2] ...
Quelle: https://creator.pdf24.org/manual/11/#111-command-line
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & Chr(34) & " -join " & "-outputFile " & Chr(34) & "C:\Exporte\Hund.pdf" & Chr(34) & "C:\Exporte\Seite.pdf\Seite-0013.pdf C:\Exporte\Seite.pdf\Seite-0014.pdf"
Mit dem folgenden Code klappt nun die Zusammenstellung der Seite 13 und 14 in die separate PDF-Datei.
Allerdings wird die Datei nur als "Hund.pdf" und nicht als "Hund gross.pdf" gespeichert.
Wie muss man das noch im Code ergänzen ?
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe -join -profile default/good -outputFile C:\Exporte\Hund gross.pdf C:\Exporte\Seite.pdf\Seite-0013.pdf C:\Exporte\Seite.pdf\Seite-0014.pdf"
Hallo,
probiere mal mit Hochkomma um "Hund gross.pdf".
Es wäre aber wahrscheinlich sinnvoller auf das Leerzeichen zu verzichten oder wenigstens den Unterstrich zu verwenden. Ggf. funktioniert auch ein Bindestrich.
Hallo Klaus,
mir ist bekannt das Leerzeichen in Pfaden und Dateinamen zu Problemen führen können, daher habe ich in der Zwischenzeit bereits einige Versuche unternommen, jedoch führte nichts zum gewünschten Ergebnis auch nicht mit nur Hochkommas. :(
u.a. auch wie folgt
... C:\Exporte\" & "'Hund gross.pdf'" & " C:\Exporte\ ...
... C:\Exporte\" & "'Hund & Chr(34) & gross.pdf'" & "C:\Exporte\ ...
Zitat von: Tom75 am Oktober 30, 2024, 15:08:34u.a. auch wie folgt
... C:\Exporte\BABs\" & "'Hund gross.pdf'" & " C:\Exporte ...
Hochkommas sind hier eher nicht die richtige Wahl, nimm normale Anführungszeichen, wie du es für den Pfad zu der .exe-Datei mit Chr(34) bereits getan hast.
Außerdem muss der komplette Pfad in Anführungszeichen eingeschlossen werden und nicht nur der Dateiname für sich.
Auch damit scheint's nicht so wirklich zu klappen ... es wird nur als "Hund.pdf" gespeichert
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe & Chr(34) & -join -profile default/good & Chr(34) & -outputFile C:\Exporte\" & "Hund gross.pdf" & "C:\Exporte\Seite.pdf\Seite-0013.pdf C:\Exporte\Seite.pdf\Seite-0014.pdf"
Zitat von: Tom75 am Oktober 30, 2024, 15:28:47Auch damit scheint's nicht so wirklich zu klappen ... es wird nur als "Hund.pdf" gespeichert
Du hast nicht gemacht, was ich empfohlen hatte:
Zitat... muss der komplette Pfad in Anführungszeichen eingeschlossen werden...
Außerdem fehlt da ein Leerzeichen zwischen der Ausgabedatei und der ersten Input-Datei.
Also:
.... -outputFile " & Chr(34) & "C:\Exporte\Hund gross.pdf" & Chr(34) & " C:\Exporte\Seite.pdf\....
PS:
Bei solchen Problem ist es hilfreich erstmal nur die Befehlszeile in einem Texteditor zu schreiben und dann manuell auszuführen.
Erst wenn das funktioniert, baust du dieselbe Befehlszeile in VBA auf und vergleichst das Ergebnis (siehe Debug.Print) mit deiner manuell erstellten, funktionieren Befehlszeile .
Ich werd' nicht schlau draus und finde den Fehler nicht und seh den Wald vpr lauter Bäumen nicht mehr. :(
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe & Chr(34) & -join -profile default/good & Chr(34) & -outputFile C:\Exporte\Hund gross.pdf & Chr(34) & C:\Exporte\Seite.pdf\Seite-0013.pdf & Chr(34) & C:\Exporte\Seite.pdf\Seite-0014.pdf"
Zitat von: Tom75 am Oktober 30, 2024, 15:43:08... finde den Fehler nicht ...
Für den Teil den ich dir vorgegeben hatte, ist der Unterschied doch recht offensichtlich.
Probier doch erstmal diese Befehlszeile manuell, d.h. z.B. in cmd.exe:
"C:\Program Files\PDF24\pdf24-DocTool.exe" -join -profile "default/good" -outputFile "C:\Exporte\Hund gross.pdf" "C:\Exporte\Seite.pdf\Seite-0013.pdf" "C:\Exporte\Seite.pdf\Seite-0014.pdf"Wenn die funktioniert, bau dasselbe in VBA auf.
Also DAS hat via CMD.exe geklappt.
"C:\Program Files\PDF24\pdf24-DocTool.exe" -join -profile "default/good" -outputFile "C:\Exporte\Hund gross.pdf" "C:\Exporte\Seite.pdf\Seite-0013.pdf" "C:\Exporte\Seite.pdf\Seite-0014.pdf"
Ich bin Am verzweifeln ... irgendwwas klappt immer nicht ich gebs wohl aufweil ich nicht weiss wann wo welches Zeichen hin muss, wann ein echtes Leerzeichen, ein & oder ein & Chr(34) &, wann ein Gänsefüßchen :(
Zitat von: PhilS am Oktober 30, 2024, 15:55:18Zitat von: Tom75 am Oktober 30, 2024, 15:43:08... finde den Fehler nicht ...
Für den Teil den ich dir vorgegeben hatte, ist der Unterschied doch recht offensichtlich.
Aber ich habe doch gar keine Hochkommas mehr drin und stattdessen Anführungszeichen.
Jetzt wo ich hoffe den Code richtig angepasst zu haben, wird gar keine Datei mehr erstellt.
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & Chr(34) & "-join -profile & Chr(34) default/good" & "-outputFile C:\Exporte\" & "Hund gross.pdf" & "C:\Exporte\Seite.pdf\Seite-0013.pdf & C:\Exporte\Seite.pdf\Seite-0014.pdf"
Zitat von: Tom75 am Oktober 30, 2024, 17:02:40Aber ich habe doch gar keine Hochkommas mehr drin und stattdessen Anführungszeichen.
Ich bezog mich da auf meinen Beitrag #27 (https://www.access-o-mania.de/forum/index.php?msg=164780).
Zitat von: Tom75 am Oktober 30, 2024, 17:15:38Jetzt wo ich hoffe den Code richtig angepasst zu haben, wird gar keine Datei mehr erstellt.
Geh doch mal vor, wie ich in dem PS in #27 geschrieben hatte.
Dim CommandLine as String
CommandLine = "C:\Program Files\PDF24\pdf24-DocTool.exe " & Chr(34) & "-join -profile & Chr(34) default/good" & "-outputFile C:\Exporte\" & "Hund gross.pdf" & "C:\Exporte\Seite.pdf\Seite-0013.pdf & C:\Exporte\Seite.pdf\Seite-0014.pdf"
Debug.Print CommandLine
Shell CommandLine Damit bekommst du den zusammengesetzten String im VBA Direktfenster ausgegeben (Direktfenster ggfs. mit [STRG]+[G] einblenden).
Dann vergleichst du das was dort ausgegeben ist mit der Befehlszeile, die in CMD.exe funktioniert hat.
So solltest du relativ einfach Fehler erkennen und zu einem funktionierenden Ergebnis kommen.
Hallo,
es könnte sinnvoll sein, den String einer Variablen zuzuweisen und die mal mit Debug.Print im Direktbereich zu prüfen. Besonders ob an der richtigen Stelle auch Leerzeichen vorhanden sind.
Das letzte & ist auch nicht richtig. Das steht im String und das kann/darf nicht sein.
Dim strTest As String
strtest = "C:\Program Files\PDF24\pdf24-............
Debug.Print strTest
Zu langsam .... :)
Im Command-Fenster wird nun folgendes ausgegeben.
Das da wohl ein Leerzeichen fehlt sehe ich nun auch, aber womit bekomme ich des rein ?
Mit " " oder & Chr(32) & geht es nicht
C:\Program Files\PDF24\pdf24-DocTool.exe "-join -profile & Chr(34) default/good-outputFile C:\Exporte\Hund gross NEU.pdfC:\Exporte\Seite.pdf\Seite-0013.pdf & C:\Exporte\Seite.pdf\Seite-0014.pdf
Ich verstehe einfach nicht wo da genau was falsch ist :(
Phil, könntest Du mir bitte die Zeile nicht mal so zusenden wie sie richtig wäre ?
Denn so kann ich dann nachvollziehen zumindest genau nachvollziehen an welcher Stelle genau was falsch war.
Danke dafür im Voraus.
Zitat von: Tom75 am Oktober 30, 2024, 18:26:16Phil, könntest Du mir bitte die Zeile nicht mal so zusenden wie sie richtig wäre ?
Denn so kann ich dann nachvollziehen zumindest genau nachvollziehen an welcher Stelle genau was falsch war.
Genau das wollte ich eigentlich bewusst nicht, damit du selbst den Fehler findest und hoffentlich dabei die Zusammenhänge verstehst. - Ich muss allerdings eingestehen, dass es mir schwerfällt hier zielführende und nachvollziehbare Hinweise zu geben.
Dein aktuelles Problem ist im wesentlichen, dass du den Überblick verloren hast, wo in dem VBA-Code ein String-Literal ist und wo ausführbarer Code. - Zum besseren Verständnis empfehle ich den ersten Absatz in meinem
VBA String Tutorial (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=vba-sql-string-tutorial) zu lesen.
Die Crux bei deiner aktuellen Aufgabe ist, dass die Anführungszeichen in VBA einen String begrenzen. Wenn du nun Anführungszeichen innerhalb des Strings selbst haben willst, kannst du entweder Anführungszeichen doppelt in den VBA-Code schreiben, oder du verwendest Chr(34). - Beides finde ich sehr schlecht lesbar; u.a. auch weil der VBA-Editor im Syntax-Highlighting nicht zwischen Literalen und Anweisungen unterscheidet.
Nachfolgend ein Beispiel, das beide Varianten zeigt.
Variante 1: Anführungszeichen sind innerhalb des Strings im VBA-Code verdoppelt.
Variante 2: Anführungszeichen werden durch Chr(34) erzeugt und mit dem String verkettet.
Das Ergebnis ist bei beiden Varianten am Ende dasselbe.
Public Sub BuildCommandLine()
Dim outputFile As String
outputFile = "C:\Exporte\Hund gross.pdf"
Dim inputFile1 As String
inputFile1 = "C:\Exporte\Seite.pdf\Seite-0013.pdf"
Dim inputFile2 As String
inputFile2 = "C:\Exporte\Seite.pdf\Seite-0014.pdf"
Dim CommandLine As String
CommandLine = """C:\Program Files\PDF24\pdf24-DocTool.exe"" -join -profile ""default/good"" -outputFile """ & outputFile & """ """ & inputFile1 & """ """ & inputFile2 & """"
Debug.Print "Variante1: " & CommandLine
CommandLine = Chr(34) & "C:\Program Files\PDF24\pdf24-DocTool.exe" & Chr(34) & " -join -profile " & Chr(34) & "default/good" & Chr(34) & " -outputFile " & Chr(34) & outputFile & Chr(34) & " " & Chr(34) & inputFile1 & Chr(34) & " " & Chr(34) & inputFile2 & Chr(34)
Debug.Print "Variante2: " & CommandLine
' Shell CommandLine
End Sub
Lieber Phil,
Du hast mir den Feiertag gerettet, denn mit dieser Darstellung hab ich's nun verstanden und umgesetzt bekommen ... DANKE dafür ! :)
Was ich jedoch nicht verstanden habe ist, warum beim Splitten der Ursprungsdate ein Ordner namens Seite.pdf erstellt wird. Kommt das durch die Verwendung der pdf24-DocTool.exe ?
Shell "C:\Program Files\PDF24\pdf24-DocTool.exe " & "C:\Exporte\Tiergarten.pdf" & " -splitByPage " & " -outputFile " & "C:\Exporte\Seite"
Zitat von: Tom75 am Oktober 30, 2024, 20:22:18Was ich jedoch nicht verstanden habe ist, warum beim Splitten der Ursprungsdate ein Ordner namens Seite.pdf erstellt wird. Kommt das durch die Verwendung der pdf24-DocTool.exe ?
Das Verzeichnis wird von pdf24-DocTool.exe erstellt.
Du verwendest in der
-splitByPage-Befehlszeile das Argument
-outputFile obwohl hier eigentlich zwingend ein Verzeichnis und keine einzelne Datei angegeben werden muss. Evtl. ist das Grund warum ein .pdf an den Ordnernamen angehängt wird. Versuch doch stattdessen mal:
-outputDir