Seite 1 von 1

PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker senden)

Verfasst: 10.05.2007 13:19
von shadow
Hallo,

hab in Folge eines kleinen Projekts ein Include-File erstellt, mit welchem Rohdaten an den Drucker gesendet werden können. Drucker, die PostScript unterstützen, können so auch .ps-Dateien drucken.
Weiß nicht, vielleicht ist ja für jemanden hilfreich.

P.S.: RAW-Dateien sind Druckausgaben, die mit der Option "In Datei umleiten" erstellt werden. Standardmäßig haben diese Dateien die Extension prn.

Code: Alles auswählen

; Sending data directly to a printer (printing raw data).
; This code is a port of the following MSDN sample:
; http://msdn2.microsoft.com/en-us/library/ms535786(d=printer).aspx
;
; Author: 	A.R.
; Compiler: PureBasic 4.02

EnableExplicit

; PrinterName$		Name of the registered printer.
; DocName$				This name will be used for printer job description.
; *rawdata				Pointer to a memory block containing the data to send.
; size.l					The size of the memory block. Perhaps could be replaced by MemorySize(...).
; *written.l			Amount of bytes written to the printer. Check this to see if all data was sent.
Procedure.l RawDataToPrinter(PrinterName$, DocName$, *rawdata, size.l, *written.l)
	Protected hPrinter.l, DocInfo.DOC_INFO_1, Job.l
	Protected DataType$ = "RAW"
	
	; Need a handle to the printer.
	If Not OpenPrinter_(PrinterName$, @hPrinter, #Null)
		ProcedureReturn GetLastError_()
	EndIf
	
	; Fill in the structure with info about this "document".
	DocInfo\pDocName = @DocName$
	DocInfo\pOutputFile = #Null
	DocInfo\pDataType = @DataType$
	; Inform the spooler the document is beginning.
	Job = StartDocPrinter_(hPrinter, 1, @DocInfo)
	If Not Job
		ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	; Start a page.
	If Not StartPagePrinter_(hPrinter)
		EndDocPrinter_(hPrinter)
		ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	; Send the data to the printer.
	If Not WritePrinter_(hPrinter, *rawdata, size, *written)
		EndPagePrinter_(hPrinter)
		EndDocPrinter_(hPrinter)
		ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	; End the page.
	If Not EndPagePrinter_(hPrinter)
		EndDocPrinter_(hPrinter)
		ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	; Inform the spooler that the document is ending.
	If Not EndDocPrinter_(hPrinter)
		ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	; Tidy up the printer handle.
	If Not ClosePrinter_(hPrinter)
		ProcedureReturn GetLastError_()
	EndIf
	
	ProcedureReturn #ERROR_SUCCESS
EndProcedure

;- for testing purpose
Define *rawdata, size.l, written.l

ReadFile(0, "c:\test.prn")
size = Lof(0)
*rawdata = AllocateMemory(size)
ReadData(0, *rawdata, size)
CloseFile(0)

If RawDataToPrinter("Brother HL-1030 series", "myDocument", *rawdata, size, @written) <> #ERROR_SUCCESS
	MessageRequester("", "Error!", #MB_OK | #MB_ICONSTOP)
Else
	MessageRequester("", "OK!", #MB_OK | #MB_ICONINFORMATION)
EndIf

FreeMemory(*rawdata)

End

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 07.06.2013 13:31
von kunstlust
Cool genau danach habe ich gesucht, werde ich testen und berichten :mrgreen:

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 07.06.2013 19:04
von Falko
Funktioniert, so wie dieser Source aufgebaut ist, nur
unter den älteren Purebasic-Versionen, nicht aber mit der aktuellsten PB-Version,
wo native Pointerangaben nicht mehr erlaubt sind :(

Gruß,
Falko

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 07.06.2013 19:24
von RSBasic
Ich kann das zwar nicht testen, aber würde es funktionieren, wenn du einfach stattdessen folgendes nimmst?

Code: Alles auswählen

Procedure.l RawDataToPrinter(PrinterName$, DocName$, *rawdata, size.l, *written)
Oder funktioniert es trotzdem nicht?

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 07.06.2013 20:20
von Falko
Hast Recht, Ray.
---------------------------
PureBasic
---------------------------
Zeile 15: Native Typen können nicht mit Zeigern verwendet werden.
---------------------------
OK
---------------------------
Es ging also nur um native typendeklaration bei Pointern, wo ich
hier das .l übersehen hatte und somit der Code nicht funktionierte.

Nochmals vielen Dank für deinen Hinweis. hiermit funktioniert er. :allright:

Gruß,
Falko

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 07.06.2013 20:32
von kunstlust
Ich danke euch, werde die Neuerung übernehmen, hab heute aber lieber Sonne getankt, hatte Nachholbedarf....

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 09.06.2013 11:32
von kunstlust
Gibt es neben dieser gut funktionierenden Methode, auch eine Möglichkeit ein PDF direkt an den Spooler zu senden, ohne den Drucker freizugeben? Mir ist auch bekannt das dies per LPR geht, aber per GDI ist es nur mit PS und PRN Dateien möglich, weil Windows eben noch dazwischen hängt. So wie unter DOS an die Freigaben eine Datei zu senden wäre toll, weil es dabei nur um die Intelligenz des Drucker ankommt und die können heute schon eine ganze Menge. Mir geht es um Rechte am PC, ein Freigabe. Braucht immer erhöhte Rechte um diese zu setzen und mit IP-Adresse haben es nicht alle Anwender so, zumal Druckerinstallation zum Teil Portdefenitionen erzeugen, die keine versteht. Eine Datei native in Spooler zu legen, damit dieser sie weiterleitet wäre für mich Ideal, weil alle Drucker leicht per WMI auszulesen sind. Hat jemand eine Idee dazu? Danke für Tips

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 10.06.2013 17:44
von kunstlust

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 10.06.2013 17:53
von Falko
Was waren das noch Zeiten, wo ich sowas angefangen hatte :mrgreen:

Re: PRN-Dateien ausdrucken (bzw. Rohdaten an den Drucker sen

Verfasst: 10.06.2013 19:00
von kunstlust
@Falko viel Dank noch einmal :mrgreen: