Verweis auf PDFCreator erzeugen

03/12/2009 - 19:41 von Kowalski | Report spam
Hi,

da der PDFCreator eine super Schnittstelle bietet, möchte ich diesen in mein
Project einbinden. Nun ergibt sich folgendes Problem:
Wenn ich in meiner Vorlage einen Verweis auf den PDFCreator setze und dieser
ist bei einem Anwender noch nicht installiert, kommt es zu einem Fehler.
Deshalb möchte ich den Verweis erst zur Laufzeit einbinden und bin dabei so
vorgegangen, wie es in der "Bibel" beschrieben ist. Es kommt jedoch erst gar
nicht zur Ausführung des Codes, da in der entsprechenden Userform zu Begin
folgender Code steht:
Private WithEvents PDFJob As PDFCreator.clsPDFCreator

hier kommt es natürlich zum Fehler, wenn der Verweis zu diesem Zeitpnkt noch
nicht gültig ist. Hat jemand eine Idee wie man hier vorgehen könnte

Vielen Dank schon mal

Kowalski !
 

Lesen sie die antworten

#1 Thomas Gahler
04/12/2009 - 18:02 | Warnen spam
Hallo Kowalski


Wenn ich in meiner Vorlage einen Verweis auf den PDFCreator setze und
dieser
ist bei einem Anwender noch nicht installiert, kommt es zu einem Fehler.
Deshalb möchte ich den Verweis erst zur Laufzeit einbinden [...]


Es gibt noch etwas besseres als den Verweis zur Laufzeit einbinden. Das
Stichwort heisst Latebinding.

siehe auch Early vs. Late Binding
http://word.mvps.org/faqs/interdev/...inding.htm


und bin dabei so
vorgegangen, wie es in der "Bibel" beschrieben ist.


Welche Bibel meinst du denn?



Es kommt jedoch erst gar
nicht zur Ausführung des Codes, da in der entsprechenden Userform zu Begin
folgender Code steht:
Private WithEvents PDFJob As PDFCreator.clsPDFCreator


Damit das gehen würde, musst du in einem Modul, das keinen "Kontakt" zum
PDFCreator hast den Verweis einbinden. Denn der Compiler prüft zuerst das
Modul und da kommt bereits der Fehler.


Wie gesagt, ich würde auf einem Mix aus Early und Late Binding aufbauen. Zum
Entwicklen nimmst du Early binding, dann hast du die Vorteile von
Intellisense. Anschliessend entfernst du den Verweis und wechselst auf Late
Bindung.
Damit das Late Binding trotzdem funktioniert musst du mit einer
Kopileranweisung den Code zu eine bedingten Kompilierung veranlassen und die
fehlenen Konstanten manuell deklarieren.

Dein Modul müsste dann ungefàhr so aussehen:

'
Option Explicit
'Wird mit Earlybinding gearbeitet muss ein Verweis auf
'die »PDFCreator« Bibliothek aktiviert werden
#Const EARLYBINDING = False 'oder True

'Code übernommen und leicht angepasst aus
'http://www.office-loesung.de/ftopic..._0_asc.php
'
'Download der Software PDFCreator (Version 0.9.5) Stand 24.12.2007 hier:
'http://sourceforge.net/projects/pdfcreator/

Public Function funcErstellenPDF( _
ByVal doc As Word.Document, _
ByVal strPDFDatei As String) _
As Boolean

#If EARLYBINDING Then
Dim pdfApp As PDFCreator.clsPDFCreator
#Else
Dim pdfApp As Object
#End If
Dim strAktiverDrucker As String

'Instanz zum PDFCreator erzeugen
#If EARLYBINDING Then
Set pdfApp = New PDFCreator.clsPDFCreator
#Else
Set pdfApp = CreateObject("PDFCreator.clsPDFCreator")
#End If

'Prüfen ob eine neue Instanz erzeugt werden konnte
If (pdfApp Is Nothing) Then
MsgBox doc.FullName & vbCr & vbCr & "Es konnte keine
PDFCreator-Instanz erzeugt werden." & vbCr & "Das aktuelle Worddokument kann
nicht konvertiert werden.", _
vbOKOnly + vbCritical, _
tgMSG_TITEL_ABBRUCH
Exit Function
End If

'PDFCreator vorbereiten
With pdfApp
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Initialisierung des PDFCreator fehlgeschlagen", _
vbOKOnly + vbExclamation, _
tgMSG_TITEL_WARNUNG
Exit Function
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = funcGetPath(strPDFDatei, True)
.cOption("AutosaveFilename") = funcGetFileName(strPDFDatei)
.cOption("AutosaveFormat") = 0 '0 = PDF
.cClearCache
End With

'Aktuellen Drucker merken
strAktiverDrucker = ActivePrinter

'Drucker auswàhlen
With Dialogs(wdDialogFilePrintSetup)
.Printer = "PDFCreator"
.DoNotSetAsSysDefault = True
.Execute
End With

'Dokument ausdrucken
doc.PrintOut Background:=False, Copies:=1

'Warten bis die Ghostscript-Datei im Monitor aufgenommen wurde
Do Until pdfApp.cCountOfPrintjobs = 1
DoEvents
funcSleep tgPAUSE_¼SEC
Loop

pdfApp.cPrinterStop = False

'Warten bis die .pdf-Datei erzeugt wurde
Do Until pdfApp.cCountOfPrintjobs = 0
DoEvents
funcSleep tgPAUSE_¼SEC
Loop

'PDFCreator schliessen und freigeben
pdfApp.cClose
Set pdfApp = Nothing

'Aktuellen Drucker zurücksetzen
With Dialogs(wdDialogFilePrintSetup)
.Printer = strAktiverDrucker
.DoNotSetAsSysDefault = True
.Execute
End With

'Rückgabewert festlegen
funcErstellenPDF = funcExistiertDatei(strPDFDatei)
End Function

Private Sub Demo()
MsgBox funcErstellenPDF _
(doc:=ActiveDocument, _
strPDFDatei:="C:\Temp\TestPDF.pdf")
End Sub
'









Thomas Gahler
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP3), Office XP (SP3)

Ähnliche fragen