Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

PDF Dateien mit pdftk zusammenführen

Forumthread: PDF Dateien mit pdftk zusammenführen

PDF Dateien mit pdftk zusammenführen
06.05.2021 19:29:48
Dominik
Hallo zusammen,
ich habe folgendes Problem.
Um ein Kostenantragsformular zu erstellen möchte ich verschiedene pdf Dateien zusammenführen.
Die Antragsseite wird in Excel erstellt. Anschließend sollen die einzelnen Angebote mit dem Antrag zusammengeführt werden.
Die Angebote hole ich mir über den Dateipfad in mein Excel. Hier sollen sie ausgelesen und über pdftk zusammengestellt und als Mail verschickt werden.
Jetzt klappt aber leider das zusammenführen nicht richtig. Ich bekomme immer nur die Antragsdatei ohne Anhang ausgegeben.
Hier mein Code:
Option Explicit

Sub drucken()
' Antragsnummer +1
Tabelle1.Range("D12") = Tabelle1.Range("D12") + 1
' Dokument drucken
'Tabelle1.Range("B2:J39").PrintOut
'Als Pdf speichern
Tabelle1.Range("B2:J39").ExportAsFixedFormat xlTypePDF, Filename:="P:\Einkauf\Kostenantragsformulare\Kostenantragsformular HL\Kostenantragsformular HL" & Cells(12, 4) & ".pdf", Openafterpublish:=False
Call DateiZusammenführen
'Dokument leeren
Tabelle1.Range("C17:J30") = ""
End Sub

Sub DateiZusammenführen()
Const Kostenstelle As String = "HL"
Const Quellordner As String = "P:\Einkauf\Kostenantragsformulare\Kostenantragsformular " & Kostenstelle & "\"
Dim Zieldatei As String
Dim PfadGesamt As String
Dim PfadAngebot() As String
Dim i As Integer
Dim a As Integer
Dim objOutlook As Object, objMail As Object
Dim Antrag As String
Antrag = Quellordner & Zieldatei
Zieldatei = "Kostenantragsformular " & Kostenstelle & Cells(12, 4) & ".pdf"
'Anzahl der Pfade speichern
For a = 1 To Cells(Rows.Count, 11).End(xlUp).Row - 17
Next a
'Anzahl Pfade
ReDim PfadAngebot(a - 1)
'Anzahl Pfade Speichern
For i = 0 To UBound(PfadAngebot)
If Cells(i + 17, 11) = "" Then
GoTo Weiterspringen
Else
PfadAngebot(i) = Cells(i + 17, 11).Value
End If
'Pfad(i).PrintOut
Next i
Weiterspringen:
'Pfade Verbinden
PfadGesamt = join(PfadAngebot, " ") 'Antrag & " " &
'    Range("A1") = PfadGesamt
If PfadGesamt = " " Then
Call MsgBox("Keine Dateien gefunden.", vbExclamation, "Hinweis")
Else
'Dateien zusammenführen
'PDFtk
Call Shell(PathName:="C:\Program Files (x86)\PDFtk\bin\pdftk.exe " & _
PfadGesamt & "cat output" & Chr$(34) & Quellordner & Zieldatei & Chr$(34), WindowStyle:=vbNormalFocus)
Call Application.Wait(Time:=Now + TimeSerial(0, 0, 3))
'An Email Anhängen
Set objOutlook = CreateObject(Class:="Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
.To = "info@info.de"
.cc = ""
.Subject = "Kostenantrag " & Kostenstelle & Cells(12, 4)
.Body = "Hallo," & vbLf & vbLf & "im Anhang der Kostenantrag " & Kostenstelle & Cells(12, 4) & "." & _
vbLf & vbLf & "Gruß" & vbLf & Cells(35, 4)
Call .Attachments.Add(Quellordner & Zieldatei)
Call .Display
End With
Set objMail = Nothing
Set objOutlook = Nothing
End If
End Sub
Hier auch die Datei:
https://www.herber.de/bbs/user/146041.xlsm
Ich vermute mal, dass im Shell der Fehler liegt. Komm aber grad nicht drauf.
Ich wäre sehr über eure Hilfe dankbar! Wenn ihr noch mehr Infos braucht, immer gerne melden.
Viele Grüße
Dominik
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
06.05.2021 20:14:25
Nepumuk
Hallo Dominik,
da fehlen die Leerzeichen. Also:
" cat output "
Gruß
Nepumuk
AW: PDF Dateien mit pdftk zusammenführen
06.05.2021 21:06:23
Dominik
Hallo Nepumuk,
das hatte ich am Anfang auch schon probiert, klappt aber leider nicht. (hab ich mit dem Code eh teilweise bei dir bedient)
Kann es sein, dass er in die PfadGesamt Variable irgendwas falsch einliest? Im Lokalfenster sieht aber alles gut aus.
Die Variable hatte ich auch erst noch so definiert:
PfadGesamt = Antrag & " " & join(PfadAngebot, " ")
War eigentlich das Ziel, die Excel Datei als pdf mitzunemen. Aber irgendwie nimmt er eh nur die.
Viele Grüße
Dominik
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
07.05.2021 07:44:15
Nepumuk
Hallo Dominik,
kann ich leider nicht nachvollziehen.
Gruß
Nepumuk
AW: PDF Dateien mit pdftk zusammenführen
07.05.2021 08:05:10
Dominik
mmhh...
Gibt es eine Möglichkeit, die Anzeige vom Shell pdftk länger anzeigen zu lassen?
Mit vbNormalFocus blinkt es nur kurz auf. Ich konnte aber ein Error erkennen. Vielleicht gibt's auch da das Problem.
Per Screenshot hab ich den Moment leider nicht getroffen. Ich probiere es aber noch ein paar mal.
Viele Grüße
Dominik
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
07.05.2021 08:22:48
Dominik
Ich habe doch noch einen Screenshot erwischt.
Da steht:
Error: Unable to find file.
Error: Failed to open PDF file:
P:\Einkauf\Kostenantragsformulare\Kostenantragsformular
Error: Unable to find file.
Error: Failed to open PDF file:
HL\Kostenantragsformular
Error: Unable to find file.
Error: Failed to open PDF file:
HL7.pdf
Also anscheinend zerlegt er die Pfade irgendwie Falsch.
Gruß
Dominik
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
07.05.2021 09:38:01
Nepumuk
Hallo Dominik,
teste mal so:

Call Shell(PathName:="C:\Program Files (x86)\PDFtk\bin\pdftk.exe " & _
PfadGesamt & " cat output " & Quellordner & Zieldatei, WindowStyle:=vbNormalFocus)
Gruß
Nepumuk
AW: PDF Dateien mit pdftk zusammenführen
10.05.2021 14:25:08
Dominik
Hallo Nepumuk,
das klapp leider auch nicht.
Nochmal zum Verständnis,
ich gebe zuerst alle Pfade mit Dateien an, die zusammen geführt werden sollen und dann den Zielpfad mit der endgültigen Datei oder?
Kann es sein, dass im pdftk noch eine Einstellung verändert werden muss oder vorher noch eine Einstellung im Excel freigeschaltet werden muss?
Viele Grüße
Dominik
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
10.05.2021 14:30:36
Nepumuk
Hallo Dominik,
was steht in Spalte 11 (K), der gesamte Pfad oder nur die Dateinamen?
Gruß
Nepumuk
AW: PDF Dateien mit pdftk zusammenführen
10.05.2021 16:07:46
Dominik
Hallo Nepumuk,
da steht der ganze Pfad.
z.b.
P:\Einkauf\Angebote\02_Logistik\Hochhubwagen\STILLshop_Angebot_2021-04-16_08-20.pdf
Den Pfad hole ich mir über Doppelklick und folgenden Code:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim varCol: varCol = ""
varCol = "K"
On Error GoTo Fehlerbearbeitung
Dim strOrdner As String
With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = "P:\Einkauf\Angebote\"
.Title = "Angebot Auswählen"
.AllowMultiSelect = True
.ButtonName = "Auswahl..."
.Filters.Add "Dokumente", "*.pdf", 1
.InitialView = msoFileDialogViewList
If .Show = -1 Then
strOrdner = .SelectedItems(1)
'            If Right(strOrdner, 1)  "\" Then strOrdner = strOrdner & "\"
'          Else
'            strOrdner = ""
End If
End With
If Target.Cells.Count = 1 Then
If varCol = "" Then varCol = Target.Column
If Not Intersect(Target, Columns(varCol)) Is Nothing Then
Cancel = True
Target.Value = strOrdner
Target.HorizontalAlignment = xlLeft
End If
End If
If strOrdner = "" Then
MsgBox ("Keine Datei gewählt!")
End If
Fehlerbearbeitung:
Exit Sub
End Sub
Viele Grüße
Dominik
Anzeige
PDF Dateien mit pdftk zusammenführen
10.05.2021 16:01:43
Anton
Hallo Dominik,
du hast Leerzeichen in den Pfaden zu den pdf-Dateien, die werden aber als Trennzeichen zwischen den Dateien erkannt,
deswegen bekommst du die Fehler in der Ausgabe von pdftk.exe.
Um das zu verhindern musst du IMHO die Pfade in Anführungszeichen setzen:

PfadAngebot(i) = CHR(34) & Cells(i + 17, 11).Value & CHR(34)
mfg Anton
Anzeige
AW: PDF Dateien mit pdftk zusammenführen
10.05.2021 16:48:36
Dominik
Hallo zusammen,
jetzt klappt es!
hier nochmal der komplette Code:

Sub DateiZusammenführen()
Const Kostenstelle As String = "HL"
Const Quellordner As String = "P:\Einkauf\Kostenantragsformulare\Kostenantragsformular_" & Kostenstelle & "\"
Dim Zieldatei As String
Dim PfadGesamt As String
Dim PfadAngebot() As String
Dim i As Integer
Dim a As Integer
Dim objOutlook As Object, objMail As Object
Dim Antrag As String
Zieldatei = "Kostenantragsformular_" & Kostenstelle & Cells(12, 4) & ".pdf"
Antrag = Quellordner & Zieldatei
'Anzahl der Pfade speichern
For a = 1 To Cells(Rows.Count, 11).End(xlUp).Row - 17
Next a
'Anzahl Pfade
ReDim PfadAngebot(a - 1)
'Anzahl Pfade Speichern
For i = 0 To UBound(PfadAngebot)
If Cells(i + 17, 11) = "" Then
GoTo Weiterspringen
Else
PfadAngebot(i) = Chr(34) & Cells(i + 17, 11) & Chr(34)
End If
'Pfad(i).PrintOut
Next i
Weiterspringen:
'Pfade Verbinden
PfadGesamt = Chr(34) & Antrag & Chr(34) & " " & join(PfadAngebot, " ")
'    Range("A1") = PfadGesamt
If PfadGesamt = " " Then
Call MsgBox("Keine Dateien gefunden.", vbExclamation, "Hinweis")
Else
'Dateien zusammenführen
'PDFtk
Call Shell(PathName:="C:\Program Files (x86)\PDFtk\bin\pdftk.exe " & _
PfadGesamt & " cat output " & Quellordner & "Zusammenfassung_" & Zieldatei, WindowStyle:=vbMaximizedFocus)
Call Application.Wait(Time:=Now + TimeSerial(0, 0, 3))
'An Email Anhängen
Set objOutlook = CreateObject(Class:="Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
.To = ""
.cc = ""
.Subject = "Kostenantrag " & Kostenstelle & Cells(12, 4)
.Body = "Hallo," & vbLf & vbLf & "im Anhang der Kostenantrag " & Kostenstelle & Cells(12, 4) & "." & _
vbLf & vbLf & "Gruß" & vbLf & Cells(35, 4)
Call .Attachments.Add(Quellordner & Zieldatei)
Call .Display
End With
Set objMail = Nothing
Set objOutlook = Nothing
End If
End Sub
Es gab auch noch ein Problem mit der Variable "Zieldatei". Eigentlich ist das die Exceldatei, die ich am Anfang in ein Pdf umwandle und dann mit den entsprechenden Pfaden verbinden will. Allerdings kann er das pdf im Shell dann nicht einfach überschreiben. Deshalb hab ich da einfach noch das "Zusammenfassung_" eingefügt. So funktioniert es auf jeden Fall!
Vielen Dank für eure Mühen.
Liebe Grüße
Dominik
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

PDF Dateien mit pdftk zusammenführen


Schritt-für-Schritt-Anleitung

  1. Erstelle das Kostenantragsformular in Excel:

    • Stelle sicher, dass alle notwendigen Daten in den Zellen bereitstehen.
  2. VBA-Code einfügen:

    • Öffne die VBA-Umgebung (Alt + F11) und füge den folgenden Code ein:
      Sub drucken()
      Tabelle1.Range("D12") = Tabelle1.Range("D12") + 1
      Tabelle1.Range("B2:J39").ExportAsFixedFormat xlTypePDF, Filename:="P:\Einkauf\Kostenantragsformulare\Kostenantragsformular HL" & Cells(12, 4) & ".pdf", Openafterpublish:=False
      Call DateiZusammenführen
      Tabelle1.Range("C17:J30") = ""
      End Sub
  3. Dateien zusammenführen:

    • Verwende den folgenden VBA-Code, um die PDF-Dateien zusammenzuführen:

      Sub DateiZusammenführen()
      Const Kostenstelle As String = "HL"
      Const Quellordner As String = "P:\Einkauf\Kostenantragsformulare\Kostenantragsformular " & Kostenstelle & "\"
      Dim Zieldatei As String
      Dim PfadGesamt As String
      Dim PfadAngebot() As String
      Dim i As Integer
      Dim a As Integer
      Dim objOutlook As Object, objMail As Object
      Dim Antrag As String
      
      Zieldatei = "Kostenantragsformular " & Kostenstelle & Cells(12, 4) & ".pdf"
      Antrag = Quellordner & Zieldatei
      
      ' Anzahl der Pfade speichern
      For a = 1 To Cells(Rows.Count, 11).End(xlUp).Row - 17
      Next a
      
      ReDim PfadAngebot(a - 1)
      
      ' Pfade speichern
      For i = 0 To UBound(PfadAngebot)
         If Cells(i + 17, 11) = "" Then
             GoTo Weiterspringen
         Else
             PfadAngebot(i) = Chr(34) & Cells(i + 17, 11) & Chr(34)
         End If
      Next i
      
      Weiterspringen:
      
      ' Pfade verbinden
      PfadGesamt = Chr(34) & Antrag & Chr(34) & " " & Join(PfadAngebot, " ")
      
      If PfadGesamt = " " Then
         MsgBox "Keine Dateien gefunden.", vbExclamation, "Hinweis"
      Else
         ' Dateien zusammenführen
         Call Shell(PathName:="C:\Program Files (x86)\PDFtk\bin\pdftk.exe " & PfadGesamt & " cat output " & Quellordner & "Zusammenfassung_" & Zieldatei, WindowStyle:=vbNormalFocus)
         Call Application.Wait(Time:=Now + TimeSerial(0, 0, 3))
         ' Email anfügen
         Set objOutlook = CreateObject("Outlook.Application")
         Set objMail = objOutlook.CreateItem(0)
         With objMail
             .To = "info@info.de"
             .Subject = "Kostenantrag " & Kostenstelle & Cells(12, 4)
             .Body = "Hallo," & vbLf & "im Anhang der Kostenantrag " & Kostenstelle & Cells(12, 4) & "."
             .Attachments.Add Quellordner & Zieldatei
             .Display
         End With
         Set objMail = Nothing
         Set objOutlook = Nothing
      End If
      End Sub
  4. Führe den Code aus:

    • Stelle sicher, dass alle Pfade korrekt sind und führe den Code aus.

Häufige Fehler und Lösungen

  • Error: Unable to find file:

    • Dieser Fehler tritt auf, wenn die Pfade zu den PDF-Dateien nicht korrekt sind oder Leerzeichen im Pfad nicht beachtet werden. Stelle sicher, dass die Pfade in Anführungszeichen gesetzt sind.
  • Nur Antragsdatei wird ausgegeben:

    • Überprüfe, ob die Variable PfadGesamt korrekt gefüllt ist und alle Dateien aufgelistet sind.

Alternative Methoden

  • Verwendung von pdftk Server:
    • Wenn Du regelmäßig große Mengen an PDF-Dateien zusammenführen musst, könnte der Einsatz von pdftk server sinnvoll sein. Dies ermöglicht das Verarbeiten von PDFs über eine Serverumgebung.

Praktische Beispiele

  • Erstellen eines PDF/A: Um ein PDF/A-Dokument zu erstellen, kannst Du den pdftk pdf/a Befehl verwenden, um sicherzustellen, dass das PDF die entsprechenden Vorgaben erfüllt.

    Call Shell(PathName:="C:\Program Files (x86)\PDFtk\bin\pdftk.exe " & PfadGesamt & " cat output " & Quellordner & "Zusammenfassung_" & Zieldatei & " pdf/a", WindowStyle:=vbNormalFocus)

Tipps für Profis

  • Wartezeiten anpassen:

    • Die Application.Wait Funktion kann je nach Größe der Dateien angepasst werden. Teste verschiedene Werte, um die optimale Wartezeit zu finden.
  • Fehlerüberprüfung implementieren:

    • Füge zusätzliche Überprüfungen ein, um sicherzustellen, dass alle erforderlichen Dateien vorhanden sind, bevor Du den Merge-Vorgang startest.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass die PDF-Dateien korrekt zusammengeführt werden? Stelle sicher, dass alle Pfade in Anführungszeichen gesetzt sind und dass keine Leerzeichen ohne Anführungszeichen in den Pfaden vorhanden sind.

2. Was kann ich tun, wenn pdftk.exe nicht gefunden wird? Überprüfe den Installationspfad von pdftk und stelle sicher, dass er korrekt in Deinem Shell-Befehl angegeben ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige