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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

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

Beitrag 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
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

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

Beitrag von kunstlust »

Cool genau danach habe ich gesucht, werde ich testen und berichten :mrgreen:
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

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

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

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

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

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

Beitrag von kunstlust »

Ich danke euch, werde die Neuerung übernehmen, hab heute aber lieber Sonne getankt, hatte Nachholbedarf....
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

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

Beitrag von Falko »

Was waren das noch Zeiten, wo ich sowas angefangen hatte :mrgreen:
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

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

Beitrag von kunstlust »

@Falko viel Dank noch einmal :mrgreen:
Antworten