von snickers » Do, 27.05.2010 16:03
Hallo,
wie von "ykcim" bereits vermutet funktioniert die print-Funktion nicht korrekt. Es findet zwar ein Ausdruck statt, aber
es erscheinen nur die Byte-Werte, die man sehen kann, wenn man die PDF-Datei mit einem Hex-Editor geöffnet hat.
Nach mühsamen Versuchen habe ich aber nun endlich die funktionierende Lösung gefunden:
Im Internet findet sich das kostenlose Tool "pdfp.exe" (Google kennt es

). Per Kommandozeile können damit PDF-Dateien
ausgedruckt werden. Mittels einer Batch-Datei habe ich die zu druckenden PDF-Dateien und den Namen des Druckers eingetragen.
Den Inhalt meiner Batch-Datei sieht beispielsweise folgendermaßen aus:
cd C:\Programme\PDF-Printer
pdfp -p Kyocera_FS-3750 H:\Zeichnungen_2010\Gehaeuse-Farbig\0410459.pdf
taskkill /IM AcroRd32.exe
In meinem Beispiel befindet sich "pdfp.exe" im Verzeichnis "C:\Programme\PDF-Printer" und der ausgewählte Drucker
"Kyocera_FS-3750" (Die installierten Druckernamen kann man sich unter Start=> Einstellungen => Drucker und Faxgeräte
anzeigen lassen). Wenn pdfp ein PDF-Dokument an den Drucker sendet, dann wird hierzu kurzzeitig der Acrobat Reader
gestartet, der dann aber geöffnet bleibt. Mit dem letzten Befehl von "taskkill" sorge ich dafür, dass der Reader nach
dem Ausdruck gleich wieder automatisch beendet wird.
Der Aufruf der Batch-Datei von meinem Makro funktioniert wie folgt:
Private sZielDrucker as String
Sub Ausdruck_starten
Dim oService as Object
Dim sVerzeichnis_PDF_Datei as String
Dim sDruck_BatchDatei as String
Dim sKommandozeile(2) as String
Dim iDateiNummer as Integer
...
glob_Verzeichnis_Einstellungen = "C:\Programme\PDF-Printer\"
sVerzeichnis_PDF_Datei = "H:\Zeichnungen_2010\Gehaeuse-Farbig\0410459.pdf"
sZielDrucker = "Kyocera_FS-3750"
sDruck_BatchDatei = ConvertToURL(glob_Verzeichnis_Einstellungen & "drucken.bat")
iDateiNummer = Freefile
'Batch-Datei mit Druckername und zu druckende Datei initialisieren:
sKommandozeile(0) = "cd " & glob_Verzeichnis_Einstellungen 'In Ordner von pdfp.exe wechseln
sKommandozeile(1) = "pdfp -p " & sZielDrucker & " " & sVerzeichnis_PDF_Datei 'PDF-Datei ausdrucken
sKommandozeile(2) = "taskkill /IM AcroRd32.exe" 'Acrobat Reader wieder schließen
open sDruck_BatchDatei for output as #iDateiNummer
print #iDateiNummer, sKommandozeile(0)
print #iDateiNummer, sKommandozeile(1)
print #iDateiNummer, sKommandozeile(2)
close #iDateinummer
oService = createUNOService("com.sun.star.system.SystemShellExecute")
oService.execute(sDruck_BatchDatei, "", 0) 'Batch-Datei ausführen lassen
...
End Sub
Die Namen der installierten Drucker lassen sich wie folgt ermitteln und können der Variable 'sZielDrucker' zugewiesen werden:
Sub Drucker_ermitteln
Dim sDatei as String
Dim sZeile as String
Dim sStartzeichen as String
Dim sDruckerName as String
Dim iPos as Integer
Dim iZaehler as Integer
Dim iDateiNummer as Integer
'Alle installierten Drucker der Registry entnehmen:
shell("regedit /e c:\printer.txt 'HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices'", 10)
wait 1000
#iDateiNummer = Freefile
sDatei = "C:\printer.txt"
open sDatei for input as #iDateiNummer
do while not eof(#iDateiNummer)
line input #iDateiNummer, sZeile
sStartzeichen=left(sZeile,1)
if sStartzeichen = """" then
iPos = InStr(sZeile, """=")
sDruckerName = mid(sZeile, 2, iPos-2)
sDrucker(iZaehler) = sDruckerName
iZaehler = iZaehler +1
end if
loop
close #iDateiNummer
End Sub
Ich hoffe damit allen geholfen zu haben, die vor dem gleichen oder ähnlichen Problem stehen.
Hallo,
wie von "ykcim" bereits vermutet funktioniert die print-Funktion nicht korrekt. Es findet zwar ein Ausdruck statt, aber
es erscheinen nur die Byte-Werte, die man sehen kann, wenn man die PDF-Datei mit einem Hex-Editor geöffnet hat.
Nach mühsamen Versuchen habe ich aber nun endlich die funktionierende Lösung gefunden:
Im Internet findet sich das kostenlose Tool "pdfp.exe" (Google kennt es :-)). Per Kommandozeile können damit PDF-Dateien
ausgedruckt werden. Mittels einer Batch-Datei habe ich die zu druckenden PDF-Dateien und den Namen des Druckers eingetragen.
Den Inhalt meiner Batch-Datei sieht beispielsweise folgendermaßen aus:
[b]cd C:\Programme\PDF-Printer
pdfp -p Kyocera_FS-3750 H:\Zeichnungen_2010\Gehaeuse-Farbig\0410459.pdf
taskkill /IM AcroRd32.exe[/b]
In meinem Beispiel befindet sich "pdfp.exe" im Verzeichnis "C:\Programme\PDF-Printer" und der ausgewählte Drucker
"Kyocera_FS-3750" (Die installierten Druckernamen kann man sich unter Start=> Einstellungen => Drucker und Faxgeräte
anzeigen lassen). Wenn pdfp ein PDF-Dokument an den Drucker sendet, dann wird hierzu kurzzeitig der Acrobat Reader
gestartet, der dann aber geöffnet bleibt. Mit dem letzten Befehl von "taskkill" sorge ich dafür, dass der Reader nach
dem Ausdruck gleich wieder automatisch beendet wird.
Der Aufruf der Batch-Datei von meinem Makro funktioniert wie folgt:
[b]Private sZielDrucker as String
Sub Ausdruck_starten
Dim oService as Object
Dim sVerzeichnis_PDF_Datei as String
Dim sDruck_BatchDatei as String
Dim sKommandozeile(2) as String
Dim iDateiNummer as Integer
...
glob_Verzeichnis_Einstellungen = "C:\Programme\PDF-Printer\"
sVerzeichnis_PDF_Datei = "H:\Zeichnungen_2010\Gehaeuse-Farbig\0410459.pdf"
sZielDrucker = "Kyocera_FS-3750"
sDruck_BatchDatei = ConvertToURL(glob_Verzeichnis_Einstellungen & "drucken.bat")
iDateiNummer = Freefile
'Batch-Datei mit Druckername und zu druckende Datei initialisieren:
sKommandozeile(0) = "cd " & glob_Verzeichnis_Einstellungen 'In Ordner von pdfp.exe wechseln
sKommandozeile(1) = "pdfp -p " & sZielDrucker & " " & sVerzeichnis_PDF_Datei 'PDF-Datei ausdrucken
sKommandozeile(2) = "taskkill /IM AcroRd32.exe" 'Acrobat Reader wieder schließen
open sDruck_BatchDatei for output as #iDateiNummer
print #iDateiNummer, sKommandozeile(0)
print #iDateiNummer, sKommandozeile(1)
print #iDateiNummer, sKommandozeile(2)
close #iDateinummer
oService = createUNOService("com.sun.star.system.SystemShellExecute")
oService.execute(sDruck_BatchDatei, "", 0) 'Batch-Datei ausführen lassen
...
End Sub [/b]
Die Namen der installierten Drucker lassen sich wie folgt ermitteln und können der Variable 'sZielDrucker' zugewiesen werden:
[b]Sub Drucker_ermitteln
Dim sDatei as String
Dim sZeile as String
Dim sStartzeichen as String
Dim sDruckerName as String
Dim iPos as Integer
Dim iZaehler as Integer
Dim iDateiNummer as Integer
'Alle installierten Drucker der Registry entnehmen:
shell("regedit /e c:\printer.txt 'HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices'", 10)
wait 1000
#iDateiNummer = Freefile
sDatei = "C:\printer.txt"
open sDatei for input as #iDateiNummer
do while not eof(#iDateiNummer)
line input #iDateiNummer, sZeile
sStartzeichen=left(sZeile,1)
if sStartzeichen = """" then
iPos = InStr(sZeile, """=")
sDruckerName = mid(sZeile, 2, iPos-2)
sDrucker(iZaehler) = sDruckerName
iZaehler = iZaehler +1
end if
loop
close #iDateiNummer
End Sub[/b]
Ich hoffe damit allen geholfen zu haben, die vor dem gleichen oder ähnlichen Problem stehen.