Gebraucht wird ein PDF-Drucker für (hüst) Word 2000. Nach dem fälligen Update von Windows XP nach Windows 7 (64-Bit) will das alte Adobe Professional 7 keinen PDF-Drucker mehr zur Verfügung stellen. Es ist weiterhin gewünscht, dass der neue PDF-Drucker sich wie der Konverter von Adobe Professional verhält — also nicht über den Druckdialog sondern über ein Icon/Menü gestartet wird. Weiterhin soll das erzeugte PDF in der Verzeichnisstruktur im selben Ordner und mit dem selben Dateinamen (bis auf die Endung .pdf
) wie das .doc
gespeichert werden.
Das Starten des Drucks über einen separaten Menüpunkt lässt sich leicht mit einem Makro und der Methode ActiveDocument.PrintOut()
bewerkstelligen. Schwieriger ist die Übergabe eines Dateinamens an das Drucksystem, da dieses keine Informationen über das zu druckende Dokument erhält/benötigt. Ich habe schliesslich den PDF-Drucker von bioPDF benutzt, da er, im Gegensatz zu vielen anderen, über ein API verfügt. Wie sich allerdings herausstellte, hat MS Office <= 2003 einen Bug, der die native Nutzung des API verhindert. bioPDF stellt aber eine weitere Möglichkeit bereit den Druckvorgang zu steuern, nämlich eine config.exe
die eine runonce.ini
erzeugt — sozusagen eine Konfiguration für genau einen (den nächsten) Druckjob.
Das folgende VB-Skript tut schliesslich alles was ich eben beschrieben habe (und noch ein kleines Bisschen mehr):
Sub printPDF()
Dim sPath As String
Dim sName As String
Dim sFullName As String
Dim sPdfFileName As String
Dim o As Document
Dim sCurrentPrinterName As String
Set o = ActiveDocument
sCurrentPrinterName = ActivePrinter
ActivePrinter = "PDF Writer - bioPDF"
If Len(o.Path) = 0 Then
o.Save
End If
sName = CreateObject("scripting.filesystemobject").getBaseName(o.Name)
sPath = o.Path
sFullName = o.FullName
sPdfFileName = sPath & "\" & sName & ".pdf"
Dim cmd As String
cmd = "C:\Program Files\bioPDF\PDF Writer\API\EXE\config.exe "
Shell cmd & "/S Output " & sPdfFileName, vbHide
Shell cmd & "/S showpdf " & "no", vbHide
Shell cmd & "/S openfolder " & "no", vbHide
o.PrintOut
ActivePrinter = sCurrentPrinterName
End Sub