Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

PDF Objekt referenzieren


Betrifft: PDF Objekt referenzieren von: Eric
Geschrieben am: 20.09.2019 07:42:12

Hallo Forum,

vieles habe ich zu diesem Thema im Internet gefunden, aber meine Fragen konnte das nicht beantworten.

1. Was muss wie auf dem Rechner vorhanden oder in den Verweisen referenziert werden, damit "CreateObject("pdfforge.pdf.pdf")" keinen Fehler erzeugt?

Auf meinem Firmenrechner funktioniert es. Auf einem zweiten Firmenrechner nicht. Bei mir zu Hause auf dem Notebook auch nicht. Die Fehlermeldungen sind unterschiedlich. Auf dem zweiten Firmenrechner ist es ein unbekannter Fehler, auf meinem Notebook ist es Laufzeitfehler 429 ("Objekterstellung durch Activex-komponente nicht möglich").

Im Internet wird in diesem Zusammenhang oft auf die Datei CDO.dll verwiesen. Sowohl auf dem zweiten Firmenrechner als auch auf meinem Notebook gibt es die Datei cdosys.dll an mindestens zwei Speicherorten. Ist das die gesuchte Datei? Wenn ja, soll ich diese an jedem Speicherort über "Ausführen" neu registrieren?

2. Gibt es eine Early Binding Variante zu "CreateObject("pdfforge.pdf.pdf")" und wenn ja, wie lautet sie? Welcher Verweis muss aktiviert sein?

3. Kennt jemand eine Quelle wo man alle Late Binding Objekte und idealerweise mit Early Binding Entsprechung, einem Anwendungsbeispiel und einer Erklärung dazu finden kann?

Scripting.Dictionary, WScript.Shell, Scripting.FileSystemObject, alles äußerst hilfreich, aber ein tiefergehendes Verständnis über den jeweiligen Zweck hinaus konnte ich noch nicht erlangen.

Vorab vielen Dank für Eure Antworten.

Gruß Eric

  

Betrifft: AW: PDF Objekt referenzieren von: 1714120.html
Geschrieben am: 20.09.2019 15:54:41

Hallo Eric,

versuchst Du mit pdfforge.pdf.pdf den PDF-Creator zu instanzieren? Der hat nämlich eine COM Schnittstelle und die Beschreibung dazu findest Du hier:
https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/

Ansonsten kenne ich die Anwendung, die Du versuchst zum Laufen zu bringen nicht.

Viele Grüße,

Zwenn

  

Betrifft: AW: PDF Objekt referenzieren von: 1714139.html
Geschrieben am: 20.09.2019 17:03:00

Hat niemand eine Idee?

  

Betrifft: AW: PDF Objekt referenzieren von: 1714143.html
Geschrieben am: 20.09.2019 17:16:22

RE: Zwenn

Hallo Zwenn,

genau für den PDF Merge möchte ich das Objekt verwenden. Ich habe Deine benannte Webseite aufgerufen. Vielen Dank für den Link, aber daraus werde ich nicht schlau.

Gibt es keine konkreten Hinweise, was genau zu tun ist?

Nochmals vielen Dank!

Gruß Eric

  

Betrifft: AW: PDF Objekt referenzieren von: 1714156.html
Geschrieben am: 20.09.2019 18:18:14

Hallo Eric,

wenn ich jetzt davon ausgehe, dass Du den PDFCreator verwendest, dann würde ich gerne mal sehen, was Du denn da hast, was auf einem Rechner funktioniert und auf zwei anderen zwei unterschiedliche Fehlermeldungen erzeugt. Nach meiner Erkenntnis dürfte mit Deinem Vorgehen gar kein keine Instanz des PDFCreators gebildet werden können.

Ich meine dieses Programm:
https://www.pdfforge.org/de/pdfcreator/download

Hier ist ein Beispiel, wie Du mit early binding eine Instanz erzeugst, einen Drucker dazu anlegst, zählst wieviele Drucker angelegt wurden (oh Wunder, es ist einer) und den Druckernamen ausliest. Anzahl und Name werden dann in einer MessageBox ausgegeben.

Im folgenden Beispiel kannst Du sehen, wie man die Methoden der im letzten Posting verlinkten Referenz unter VBA verwendet. Das habe ich mal unter einer 2er Version des PDFCreators erstellt. Es funktioniert aber auch mit der oben verlinkten Version 3.5:

       Sub PDFCreatorBeispiel()
       
       Dim pdfCreator As Object
       Dim drucker As Object
       Dim anzahlDrucker As Integer
       Dim druckerName As String
       
         Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")
         Set drucker = pdfCreator.GetPDFCreatorPrinters
         anzahlDrucker = drucker.Count
         druckerName = drucker.GetPrinterByIndex(0)
         
         MsgBox "Anzahl PDF-Creator Drucker: " & anzahlDrucker & Chr(13) & _
                "PDF-Creator Drucker Name: " & druckerName
       End Sub
       

Wie gesagt, poste mal, was Du an Code hast. Wenn sich da was auf Zellen in Tabellen bezieht, dann bitte direkt eine Beispielmappe. Beschreibe auch gerne mal, was Du eigentlich erreichen willst. Von wo kommst Du, wo willst Du hin. Du möchtest zwei Dateien zusammenführen, habe ich verstanden. Aber beschreibe mal das drumrum etwas genauer. Gibt es z.B. eine Tabelle, in der zwei Spalten mit Pfaden zu Dateien sind, die Du zu einer zusammenfassen willst? Was für Dateien sollen zusammengefasst werden? Usw.

Viele Grüße,

Zwenn
  

Betrifft: AW: PDF Objekt referenzieren von: 1714164.html
Geschrieben am: 20.09.2019 19:34:51

Hallo Zwenn,

zunächst möchte ich mich für Deine Unterstützung ganz herzlich bedanken!

Es ist im Grunde ganz einfach. Es gibt gar keine Tabellen. Es sollen nur PDF Dateien zusammen gefügt werden. Das ist alles. Der Code könnte also in jeder x-beliebigen Office Anwendung geschrieben sein. Am besten nachher über eine Listbox in einer UserForm, aber das kann ich alles. Mir geht es um die Objekte, in diesem Fall eben das pdfforge... Objekt. Und an diesem Beispiel stelle ich halt erneut fest, dass ich zwar nun im Lauf der Zeit verstanden habe, dass man über CreateObject("...") ein Objekt deklarieren kann. Welche es alles gibt, wofür man diese verwenden kann... Das ist immer nur für den jeweiligen Fall verständlich. Da fehlt mir eine Liste wie bei den Variablentypen (aha, es gibt Byte, Integer, Long, ..., und die nimmt man für... - aha, es gibt diese Objekte... gibt es das?). Das ist sozusagen im Allgemeinen der Teil an diesem Problem, der mich stört.

Hier der Code:

Sub pdf()
      
      Dim objPDF As Object
      Dim arrPDF(1) As String
      
      Set objPDF = CreateObject("pdfforge.pdf.pdf")
      
      arrPDF(0) = 'Pfad1
      arrPDF(1) = 'Pfad2
      
      objPDF.MergePDFFiles_2 (arrPDF), "'Pfad_Ziel\Dateiname.Dateiformat", True
      
      Set objPDF = Nothing
      
      End Sub
Ansonsten habe ich auf dem privaten Notebook (wo dieser Code nicht läuft):
* Windows 8.1
* Excel 2013
* Adobe Reader DC (Continuous Release | Version 2019.012.20040)

Und meine Frage ist nun, warum die Zeile "Set objPDF = CreateObject("pdfforge.pdf.pdf")" nicht umgesetzt werden kann. Das scheint einigen Nutzern so zu gehen und mir fehlt eine Antwort, die ich auch nachvollziehen kann. Analaog, wenn Byte eben den Wert 300 haben soll, dann geht das eben per Byte Definition nicht - verstanden! Aber hier? :-(

Dein Code konnte ich nicht zum Ende testen - Laufzeitfehler 429 "ActiveX Objekt..." an der Stelle "Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")". Ist Dein Code nicht auch Late Binding statt Early Binding?

Vielen Dank Dir!

Gruß Eric
  

Betrifft: PDF Objekt referenzieren von: 1714198.html
Geschrieben am: 21.09.2019 11:32:43

Hallo Eric,

Dein Code konnte ich nicht zum Ende testen - Laufzeitfehler 429 "ActiveX Objekt..." an der Stelle "Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")"

Das deutet darauf hin, dass du auf deinem Rechner kein PDFCreator installiert hast.
Diese Objekte, wie "PDFCreator.PDFCreatorObj", "pdfforge.pdf.pdf" usw, bringt nur PDFCreator mit,
deswegen bekommst du diese Fehlermeldung auf deinem Notebook.
Was den zweiten Firmenrechner betrifft, ist schwer zu sagen, ich würde die Installation des PDFCreators
vergleichen (Version, Vollständigkeit usw).

mfg Anton

  

Betrifft: AW: PDF Objekt referenzieren von: 1714201.html
Geschrieben am: 21.09.2019 13:02:35

Hallo Eric,

was Anton geschrieben hat klingt für mich plausibel. Prüfe das also unbedingt.

Ich poste Dir mal einen Code, den ich gestern angefangen habe, um selber zu testen, wie das funktioniert, was Du möchtest.

Aber Achtung! Der folgende Code ist NICHT lauffähig und dient nur zur Anschauung.

Ich habe da vor allem Kommentare reingeschrieben, die unter anderem viele Zitate aus der Referenz zur COM-Schnittstelle des PDFCreator enthalten. Du solltest damit wenigstens eine Idee bekommen, wie es funktionieren könnte.

Dein Script habe ich an anderer Stelle auch gefunden, finde dazu in der Referenz aber nix. Deshalb kann ich dazu im Moment nix sagen. Wenn das nach der Prüfung von Antons Hinweisen läuft, benutz das weiter.

Ansonsten habe ich jetzt am Wochenende keine Zeit mehr, mich um diese Sache zu kümmern. Deshalb hier mal das, was ich bisher habe. Du kannst vor allem sehen, dass zwei (implizit mit dem Printjob drei) von den fünf genannten Objekten der Schnittstelle verwendet werden, um an die benötigten Methoden zu kommen. Ob das so in die richtige Richtung geht weiß ich nicht, weil ich davon bisher nix getestet habe und deshalb nicht genau weiß, wie die Objete zusammenarbeiten:

    Sub DateienMergen()
    
    Dim pdfCreator As Object
    Dim pdfCreatorQueue As Object
    Dim pdfCreatorPrintJob As Object
    Dim arrPDF(1) As String 'Aus deinem Makro übernommen
    
      'Die beiden zu vereinenden Dateien festlegen
      arrPDF(0) = x 'Pfad1 anpassen
      arrPDF(1) = y 'Pfad2 anpassen
    
      'Einleitend eine grundsätzliche Erklärung zur Verwendung der COM-Schnittstelle
      'des PDFCreators. Auszug unter der Überschrift "Modularität" aus:
    'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/user-manual/basics/ _
    workflow-comparsion-v1-7-v2/
      '
      'Im Vergleich dazu hat die COM Schnittstelle des neuen PDFCreators (v2.*) fünf
      'verschiedene Objekte: das Queue Objekt, das PrintJob Objekt, das PDFCreatorObj
      'Objekt, das Printers Objekt, das OutputFiles Objekt. Der Fokus liegt hierbei
      'auf den drei ersten Objekten, da diese ausreichen, um den prinzipiellen Ablauf
      'zu beschreiben. Das Queue Objekt fungiert als Behälter für alle Druckaufträge,
      'die konvertiert werden sollen. Durch das Queue Objekt hat man die volle Kontrolle
      'über diesen Behälter. Jeder einkommende Druckauftrag wird gewrappt und
      'repräsentiert durch ein PrintJob Objekt, das es ermöglicht, spezielle
      'Einstellungen für einen Druckauftrag zu setzen, wie z.B. unter welchem Profil
      'dieser Druckauftrag konvertiert werden soll. Das PDFCreatorObj Objekt ermöglicht
      'das Erfragen von Informationen zur PDFCreator Instanz, ob beispielsweise die
      'PDFCreator Anwendung gerade läuft oder nicht.
      '
      'Wir setzen die beiden benöätigten der 5 möglichen Objekte zum Mergen von Druckaufträgen
      Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")
      Set pdfCreatorQueue = CreateObject("PDFCreator.JobQueue")
      
    'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
      'sagt, Initialize() muss aufgerufen werden:
      '"Zusammenfassung: Um das erzeugte COM-Objekt nutzen zu können, muss als aller erstes diese
      'Methode aufgerufen werden."
      '(Unter dem Link sieht man übrigens unter der ersten Überschrift "Die Queue" und hinter
      'dem Wort "ProgID" darunter, genau den Schriftzug, den wir für die Initialisierung des
      'benötigten Queue-Objektes weiter oben verwendet haben.)
      Call pdfCreatorQueue.Initialize
      
      'Die beiden zusammenzuführenden Dateien in die Queue schieben
      'Laut Referenz funktioniert das nur mit PostScript Dateien
      'Ich hatte bisher keine Zeit da was auszutesten
    'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/pdfcreator/
      'Unter der letzten Überschrift "void AddFileToQueue(string path)" steht:
      'Zusammenfassung: Fügt eine Datei direkt zur Queue hinzu, ohne dass gedruckt werden muss.
      'Momentan können jedoch nur .PS Dateien direkt hinzugefügt werden, dies könnte sich mit
      'den nächsten Versionen der COM-Schnittstelle ändern.
      'path: Der Pfad zur Datei, die hinzugefügt werden soll.
      Call pdfCreator.AddFileToQueue(arrPDF(0))
      Call pdfCreator.AddFileToQueue(arrPDF(1))
      
      'Wir bewegen uns in der Dokumentation weiterhin hier:
    'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
      'Jetzt unter der Überschrift "void MergeAllJobs()"
      'Wir fügen also alle bisher erstellten Druckjobs zu einem zusammen
      Call pdfCreatorQueue.MergeAllJobs
      
      'COM freigeben unter der letzten Überschrift "void ReleaseCom()" Kasten beachten:
    'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
      Call pdfCreatorQueue.ReleaseCom
    End Sub
    

Viele Grüße,

Zwenn
  

Betrifft: AW: PDF Objekt referenzieren von: 1714208.html
Geschrieben am: 21.09.2019 15:02:44

Hallo Anton,
Hallo Zwenn,

als Nächstes vergleiche ich mal kommende Woche die Versionen des PDF Creators auf den Firmenrechnern. Einmal auf meinem (der wo es fubktioniert) und auf dem, auf welchem es nicht funktioniert.

Ganz herzlichen Dank an euch und bis bald!

Gruß Eric

  

Betrifft: AW: PDF Objekt referenzieren von: 1714218.html
Geschrieben am: 21.09.2019 16:35:15

Hallo Anton,
Hallo Zwenn,

ein paar Neuigkeiten.

Ich habe den PDF Creator auf meinem Notebook installiert (Version 3.5.1). Der Herausgeber ist die pdfforge GmbH.

Interessanterweise funktioniert Zwenn's Code nun an dieser Stelle "Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")" und dadurch läuft auch der gesamte Code durch. Dummerweise funktioniert in meinem Code die Stelle "Set objPDF = CreateObject("pdfforge.pdf.pdf")" immer noch nicht. Es kommt auch immer noch die Fehlermeldung "Laufzeitfehler 429".

Die Objekte "PDFCreator.PDFCreatorObj" und "pdfforge.pdf.pdf" funktionieren also offenbar beide nicht zwangsläufig, wenn der PDF Creator installiert ist.

Mit der Installation des PDF Creator scheinen insgesamt neun neue Verweise im VBA Editor hinzu gekommen zu sein. Darunter auch der Verweise "PDFCreator_COM". Ich habe alle neun Verweise aktiviert, aber "pdfforge.pdf.pdf" erzeugt immer noch den Laufzeitfehler 429.

Liegt das nun eventuell an der Version des PDF Creators?

Gruß Eric

  

Betrifft: AW: PDF Objekt referenzieren von: 1714222.html
Geschrieben am: 21.09.2019 16:58:08

Hallo Zwenn,

Dein zweiter Code funktioniert nun auch einwandfrei und ich habe auch die Kommentare aufmerksam gelesen. Klasse, wieviel Arbeit Du Dir wegen mir machst. Danke!

Da nun alles inklusive der Job Merges funktioniert, stellt der zweite Code eigentlich meine Lösung dar. Umarbeiten und hübsch machen kann ich den auf alle Fälle.

Bleibt eigentlich nur noch die Frage offen, wo ich die Ausgabedatei, also das Merge-Ergebnis finden kann. Dazu habe ich die Links aufgerufen, um es selber herauszufinden, aber habe nichts gefunden. Es müsste doch eigentlich im Code angegeben werden müssen, in welchem Verzeichnis das Ergebnis landen soll und wie die Datei heißen soll, oder?

Geht das auch noch zu lösen? Dann hätten wir es!

Vielen Dank!

Gruß Eric

  

Betrifft: AW: PDF Objekt referenzieren von: 1714226.html
Geschrieben am: 21.09.2019 18:37:46

Hallo Zwenn,
Hallo Anton,

ich habe die Output Zeile gefunden!

Unter die Zeile:
Call pdfCreatorQueue.MergeAllJobs

Muss nur die Zeile:
Call pdfCreatorQueue.NextJob.ConvertTo('Pfad\Dateiname.pdf)

Das war's!

Vielen, vielen Dank!

Gruß Eric

Beiträge aus dem Excel-Forum zum Thema "PDF Objekt referenzieren"