Eingebundene Drucker auslesen -> Lösung bitte mal testen

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

Moderator: Moderatoren

benjy
*
Beiträge: 19
Registriert: Mo, 03.10.2005 12:20

Eingebundene Drucker auslesen -> Lösung bitte mal testen

Beitrag von benjy »

hi hab ein kleines problem

ich möchte in einem Dialog alle im system eingebundenen Drucker zur auswahl anzeigen (combobox) damit dann das Macro direckt auf den ausgewählten drucken kann
ich weis das es ein druckmenü schon giebt allerdings lohnt sich das nur bei schon vorhandenen daten. ich erstelle aber erst die daten mit dem Macro und will sie nun direckt ausdrucken so das niemand in dem Dockument rumpfuschen kann.

wenn jemand weis wie mann die zur verfügung stehenden drucker in die Combobox bekommt dann antworte er bitte.

benjy
Zuletzt geändert von benjy am Mo, 08.01.2007 15:27, insgesamt 1-mal geändert.
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag von ykcim »

Vielleicht wäre das Betreinsystem noch hilfreich?

Leider gibt es keine eigene Funktion/Api für das auslesen der Systemdrucker.
Unter Windows kann die Infos selber aus der Registry auslesen.

Für Windows NT/2000/XP steht hier eine Lösung: http://www.dannenhoefer.de/faqstarbasic ... ucker.html

Für Linux .... ?

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
benjy
*
Beiträge: 19
Registriert: Mo, 03.10.2005 12:20

Beitrag von benjy »

danke für die info

sollte eigentlich unabhänging vom system laufen.

hab mal selbst in der APi geschaut und etwas gefunden

http://api.openoffice.org/docs/common/r ... erver.html

unter "getPrinterNames" werden dort alle verfügbare drucker zurück gegeben
ist es darüber vieleicht möglich ohne die windofs registrie zu quälen

wenn ja dann sagt mir bitte wie.

Gruß benjy
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag von ykcim »

Nein dieses Interface nützt leider nichts.
Es gibt keinen Service dem es zugeordnet ist.
Daher kann es nicht verwenden.:-(

Ich suche selber ein vernünftige Lösung für alle BS.

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
benjy
*
Beiträge: 19
Registriert: Mo, 03.10.2005 12:20

Beitrag von benjy »

hi Michael
wie sieht es aus hast du etwas erreichen können oder giebt es immer noch keien möglichkeit die Drucker auf linux aus zu lesen

mfg benjamin
martin schniewind
Beiträge: 2
Registriert: Fr, 17.11.2006 14:51

Beitrag von martin schniewind »

Habe mal versucht, die Drucker vom Betriebssystem (Linux mit CUPS) zu ermitteln - mittels lpstat (könnte also auch statt it CUPS mit lpd gehen). Unschön ist hier noch, wie ich inaktive Drucker ausfiltere, weil ich die deutsche Ausgabe von lpadmin unterstelle. Aber es funktioniert.

Der Code geht von einem Tabellenblatt namens "INI" aus, in das die Drucker eingetragen werden.

Die auskommentierte Zeile würde den Standard-Drucker zurückgeben.

Code: Alles auswählen

ErstelleDruckerliste()
	Dim INI as Object
	Dim List as Integer
	Dim Drucker as String, I as Integer
	INI = ThisComponent.Sheets.getByName("INI")
	
	Dim Sys as Object
	Sys = createUnoService("com.sun.star.system.SystemShellExecute")
	'Sys.execute("lpstat", "-d | cut -f3 -d' ' > /tmp/printers", 0)
	Sys.execute("lpstat", "-a | grep -i -v ""rejecting"" | grep -i -v ""keine anfragen"" | cut -f1 -d' ' > /tmp/printers", 0)
	List = FreeFile()
	Open "/tmp/printers" for input as #List
	INI.getCellRangeByName("A1:A100").ClearContents(com.sun.star.sheet.CellFlags.STRING + _
													com.sun.star.sheet.CellFlags.VALUE)
	I = 0
	do while not eof(#List)
		line input #List, Drucker
		INI.getCellByPosition(0, I).String = Drucker
		I = I + 1
NextZeile:
	loop
	close #List
	
End Sub

che
*
Beiträge: 12
Registriert: Do, 05.02.2004 16:25

Beitrag von che »

Da es offensichtlich keine BS übergreifende Lösung gibt, die Drucker auszulesen/anzusprechen, könntest Du ggf. das Ganze umgehen.
So zum Beispiel:

Code: Alles auswählen

If GetGuiType = 1 Then
        ' Windows
    Code von Dannhöfer

   ElseIf GetGuiType = 4 Then
     ' Unix, Linux
     Code von martin schniewind

   ElseIf GetGuiType = ? Then
    'Mac Type habe ich auf die Schnelle nicht gefunden
    Code für Mac (wie Unix -> CUPS?!)

   Else
      MsgBox "Nix Drucken"           

   End If 
Nicht schön, müsste aber gehen (habe es für eine Mailfunktion und für unabhängige Abfragen des Environment schon erfolgreich genutzt).

HTH
benjy
*
Beiträge: 19
Registriert: Mo, 03.10.2005 12:20

Beitrag von benjy »

hi hatte vergessen das ich diese frage hier gestellt hatte und deshalb heute erst eure antworten gelesen.

na ja da ich in der zwichenzeit eine Distri gefunden habe die mir persönlich zusagt habbe ich mich selber daran gesetzt eine lösung zu finden. grundsätzich sieht sie genau so aus wie eure mit dem unterschied das ich noch den standart drucker mit auslese.

da ich hier zur zeit nur ein linux im einsatz habe würde ich mal alle bitten den code zu testen und sagen ob er geht oder nicht. Danke

Code: Alles auswählen

'Liefert in einem Array die installierten Drucker zurück! zuletzt wird der standerd drucker noch einmal wiederholt.
sub GetAlleDrucker(ListOfAllPrinter())
dim inumber as integer
dim ipos as integer
dim zaehler as integer
dim shilf(3) as string
Dim myPrinter(20)
if GetGUIType = 1 then
'listet alle drucker und den primären drucker bei windows auf !!! Achtung geht nur ab Windows NT!!
	shell("regedit.exe" , 10 ," /e c:\printer.txt " & Chr(34) & "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" & Chr(34),true)
	zaehler=0
	iNumber = Freefile
	shilf(0) = "file:///c:/printer.txt"
	Open shilf(0) For Input As #iNumber
		On Error Goto schluss
		While not eof(iNumber)
			Line Input #iNumber, shilf(1)
			shilf(2)=left(shilf(1),1)  
			if shilf(2)="""" then
				ipos=InStr(shilf(1),"""=")
				myprinter(zaehler)=mid(shilf(1),2,ipos-2)
				zaehler=zaehler+1
			end if
		wend
	schluss:
	Close #iNumber
	shell("regedit.exe" , 10 ," /e c:\printer.txt " & Chr(34) & "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows" & Chr(34),true)
	ipos=0
	iNumber = Freefile
	Open shilf(0) For Input As #iNumber
		On Error Goto schluss2
		do While not eof(iNumber)
			if ipos = 0 then
			Line Input #iNumber, shilf(1)
			shilf(2)=mid(shilf(1),2,6)
			if shilf(2)="Device" then
				ipos=InStr(shilf(1),",")
				myprinter(zaehler)=mid(shilf(1),11,ipos-11)
				zaehler=zaehler+1
			end if
			else
				exit do
			end if
		loop
	schluss2:
	Close #iNumber
	if zaehler>0then
		redim ListofAllPrinter(zaehler-1)
		for iNumber=0 to zaehler-1
			ListofAllPrinter(iNumber)=myprinter(iNumber)
		next iNumber
	end if
	kill shilf(0)
elseif GetGUIType = 4 then
'listet alle drucker und den primären drucker bei LINUX auf
	shilf(0) = "file:///tmp/printer"
	iNumber = Freefile
	open shilf(0) for Output as #iNumber
	Print #iNumber, "#!/bin/sh"
	Print #iNumber, "lpstat -p -d > /tmp/printer.txt"
	Close #iNumber
	shell("chmod u+x /tmp/printer")
	wait 20
	shell("/tmp/printer",10,"",true)
	wait 20
	shilf(0) = "file:///tmp/printer.txt"
	zaehler=0
	iNumber = Freefile
	Open shilf(0) For Input As #iNumber
		On Error Goto schluss3
		While not eof(iNumber)
			Line Input #iNumber, shilf(1)
			shilf(2)=left(shilf(1),5)  
			if shilf(2)="print" then
				ipos=InStr(shilf(1),"is idle.")
				myprinter(zaehler)=mid(shilf(1),9,ipos-9)
				zaehler=zaehler+1
			elseif shilf(2)="syste" then
				ipos=InStr(shilf(1),": ")
				myprinter(zaehler)=right (shilf(1),len(shilf(1))-(ipos+1))
				zaehler=zaehler+1
			end if
		wend
	schluss3:
	Close #iNumber
	if zaehler>0then
		redim ListofAllPrinter(zaehler-1)
		for iNumber=0 to zaehler-1
			ListofAllPrinter(iNumber)=myprinter(iNumber)
		next iNumber
	end if
	kill("file:///tmp/printer")
	kill("file:///tmp/printer.txt")
endif
end sub
ein anwendungs bespiel:

Code: Alles auswählen

dim listdrucker as variant
dim ihilf as integer
dim olist as object
	GetAlleDrucker (listdrucker())
	oList = oDlgDruck.GetControl("ComboBox1")
	oList.removeitems(0,100)
	if Isarray(listdrucker()) then
		for ihilf = lBound(listdrucker()) to (uBound(listdrucker())-1)
			oList.additem(listdrucker(ihilf),100)
		next ihilf
		oList.text= listdrucker(uBound(listdrucker()))
	end if
Antworten