PDf-Dateien per Makro ausdrucken

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

PDf-Dateien per Makro ausdrucken

Beitrag von snickers »

Hallo,

ich möchte PDF-Dateien über ein Makro ausdrucken. Im Internet habe ich folgendes Beispiel gefunden,
das bei mir allerdings nicht funktioniert. Sobald ich die Scalc-Datei öffne und die Makros darin aktiviere,
erscheint die OO-Meldung "BASIC-Syntaxfehler" an der Codestelle mit der Funktionsdeklaration
"Public Declare Function ShellExecute...". Ich setzte die OpenOffice-Version V3.1 ein.

Hier der zugehörige Code-Ausschnitt:

Option Explicit
Dim sPDF_Datei as String
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


Sub Start
..
..
sPDF_Datei = "C:\Test.pdf"
Call Datei_drucken
..
End Sub

Sub Datei_drucken
Call ShellExecute(0, "Print", sPDF_Datei, "", "", 2)
End Sub


Vorab vielen Dank für Eure Unterstützung.
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: PDf-Dateien per Makro ausdrucken

Beitrag von Karolus »

Hallo
Das sieht sehr nach VBA code aus, versuch erstmal eine zusätzliche Zeile im Kopfbereich:

Code: Alles auswählen

Option VBASupport 1
Falls das nichts nützt, versuche mal:

Code: Alles auswählen

Sub DateiDrucken
oService = createUNOService("com.sun.star.system.SystemShellExecute")
oService.execute("print", "C:\Test.pdf",0)
end sub
Letzteres funktioniert hier unter Linux wenn ich "print" durch "lp" ersetze, (den Dateipfad natürlich auch durch eine vorhandene Datei).

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDF-Dateien per Makro ausdrucken

Beitrag von snickers »

Hallo,

der erste Vorschlag mit "Option VBASupport 1" hat keine Veränderung bewirkt. Wenn ich die Funktionsdeklaration
von "ShellExecute" entferne und Ihren zweiten Vorschlage umsetze, treten keine Fehlermeldungen mehr auf.
Obwohl der Befehl "oService.execute("print",....)" ohne Probleme durchlaufen wird, findet kein Ausdruck des
Dokuments statt. (Es erscheint nur ganz kurzzeitig eine DOS-Box auf dem Desktop. Es ist aber kein Inhalt erkennbar,
da die Ansicht von zu kurzer Dauer ist.)

Welche Möglichkeit habe ich, um an dieser Stelle zu debuggen?
Wie kann ich herausfinden, weshalb der Ausdruck scheitert oder kennen Sie eine mögliche Erklärung?

Muss das zu druckende Dokument zuvor mit dem AcrobatReader geöffnet worden sein?
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: PDf-Dateien per Makro ausdrucken

Beitrag von Karolus »

Hallo
Ich habs vorhin kurz unter Windows probiert und kam auch nicht weiter wie du, vielleicht findet sich hier jemand der von Windows mehr Ahnung hat.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDF-Dateien per Makro ausdrucken

Beitrag von snickers »

Mit Hilfe eines Bildschirm-Ausdrucks ist es mir gelungen, den Inhalt der
DOS-Box festzuhalten:

In der Titelleiste steht: C:\WINDOWS\System32\print.exe

Im anschließenden Fensterbereich steht nur: Unzulässige Option - //


Wer hat eine Ahnung, welcher Fehler hier vorliegen könnte?
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDf-Dateien per Makro ausdrucken

Beitrag von snickers »

Hallo,

hat niemand eine Ahnung, welches Problem bei diesem Lösungsansatz vorliegt?
Ich bin auch jederzeit dankbar für eine alternative Lösung, die zum gleichen Ziel führt....
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Re: PDf-Dateien per Makro ausdrucken

Beitrag von ykcim »

HI,

print braucht einen Ausgabeport: print lpt1 c:\test.pdf.
Aber ob man dann mit print eine pdf datei drucken kann, kann ich gerade mangels Drucker nicht ausprobieren.
Es kann aber sein das print nur reinen Text ausdruckt. Bei einer PDF als den PDF-Quellcode.

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDf-Dateien per Makro ausdrucken

Beitrag von snickers »

Hallo Ykcim,

vielen dank für deinen Vorschlag. Ich habe dahingehend verschiedene Versuche unternommen, war bislang allerdings nicht wirklich erfolgreich.
Wie muß die Syntax für diesen Parameter korrekt aussehen?

Meine bisherigen Varianten waren auf jeden Fall nicht korrekt:

oService.execute("print", "lpt1", "C:\Test.pdf")
=> DOS-Box-Meldung: Die Datei lpt1 konnte nicht gefunden werden.

oService.execute("print lpt1", "C:\Test.pdf", 0)
=> Windowsmeldung: 'print lpt1' konnte nicht gefunden werden. Stellen Sie sicher, dass Sie den Namen korrekt eingegeben haben und wiederholen Sie den Vorgang. ...

oService.execute("print", "C:\Test.pdf", "lpt1")
=> DOS-Box-Meldung: Unzulässige Option -//
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Re: PDf-Dateien per Makro ausdrucken

Beitrag von ykcim »

Der Befehl für Print lautet: print lpt1 c:\test.pdf
Also muss in der Variablen mit dem Parameter alles stehen:

oService.execute("print","lpt1 C:\Test.pdf")

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDf-Dateien per Makro ausdrucken

Beitrag von snickers »

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.
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: PDF-Dateien per Makro ausdrucken

Beitrag von snickers »

Eine Sache habe ich noch vergessen zu erwähnen:

Der Druckername in der Batch-Datei darf keine Leerzeichen oder Umlaute (ü, ä, ö) enthalten. Solche Zeichen werden
von pdfp.exe nicht richtig erkannt und somit auch nicht der entsprechende Drucker gefunden.
Antworten