 |
RealBasic.de Das deutsche RealBasic-Forum
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
qualidat
Anmeldedatum: 10.02.2006 Beiträge: 249
|
Verfasst am: 30.11.2007, 09:37 Titel: Windows: RAW-Daten zu Drucker senden |
|
|
Hier mal ein Beispiel, wie man Rohdaten "RAW" (leider nur unter Windows) zu einem Drucker senden kann. (Findet sich evtl. jemand, der das auch mit CUPS unter MacOS X hinbekommt?)
Der Drucker muss mit einem Treiber eingerichtet sein. Dieser Treiber übernimmt aber nur noch die reine Transportfunktion der Binärdaten, sämtliche anderen Einstellungen werden ignoriert.
Der Datenstrom muss also sowohl die Druckdaten als auch die Drucker-Steuerkommandos enthalten. Damit bekommt man von RB aus auch Zugriff auf Gerätefunktionen, nicht nur auf das nackte Drucken ansich, z.B. Duplex-Ansteuerung, Bon abschneiden, Karte laminieren, Farbprofile, Kontrasteinstellungen usw.
Dazu muss man sich mit den jeweiligen Steuersprachen (ESC-P, PCL, PostScript, etc.) auseinandersetzen und die zu sendende Datei entsprechend selber "zusammenbasteln". Zum Testen könnt ihr z.B. einen Druckjob zunächst in eine Datei umleiten und danach mit dem Beispielprogramm doch noch zum Drucker senden.
Achtung Falle! Häufig befinden sich am Anfang der Druckdateien Zeichen oder Codes, die man nicht in den Dokumentationen findet. Diese dienen z.B. der Umschaltung zwischen PCL- und Postscript-Betrieb bei einem HP Laserjet oder der Positionierung des Farbbandes bei einem Sublimationsdrucker. Ohne diese Codes passiert oftmals garnichts. Da sollte man sich mal eine Druckdatei mit einem Hexeditor ansehen.
Ich habe das Ganze z.B. angefangen, um einen Plastikkartendrucker Zebra-Eltron P310i aus einer eigenen Anwendung heraus komplett zu steuern ...
Die Funktion will den vollständigen Pfad zur Druckdatei und den Windows-Namen des Druckers. Getestet habe ich das unter W2K und XP.
| Code: |
Function WinPrintFile(fname as string, targetprinter as string) as boolean
dim Result as boolean = false
Dim pDocInfo as new MemoryBlock(12)
Dim sWrittenData as new MemoryBlock(32767)
Dim hPrinter, lReturn, strLength, amtSent as integer
Dim lpcWritten, lpDocName, lpOutputFile, lpDataType As MemoryBlock
dim f as folderitem
Dim bs as BinaryStream
#if TargetWin32
declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (pPrinterName As CString, byRef hPrinter As Integer, pDefault As Integer) As Integer
declare Function ClosePrinter Lib "winspool.drv" (hPrinter As Integer) As Integer
declare Function StartDocPrinter Lib "winspool.drv" Alias "StartDocPrinterA" (hPrinter As Integer, Level As Integer, pDocInfo As Ptr) As Integer
declare Function EndDocPrinter Lib "winspool.drv" (hPrinter As Integer) As Integer
declare Function StartPagePrinter Lib "winspool.drv" (hPrinter As Integer) As Integer
declare Function EndPagePrinter Lib "winspool.drv" (hPrinter As Integer) As Integer
declare Function WritePrinter Lib "winspool.drv" (hPrinter As Integer, pBuf As Ptr, cdBuf As Integer, pcWritten As Ptr) As Integer
f=getfolderitem(fname)
bs =f.OpenAsBinaryFile
if (f.exists) and (bs<>nil) then
lpDocName = new memoryBlock(255)
lpOutputFile = new memoryBlock(255)
lpDataType = new memoryBlock(255)
lpcWritten = new memoryBlock(4)
lpDocName.CString(0) = "Direct Download"
lpOutputFile.CString(0) = ""
lpDataType.CString(0) = "RAW"
pDocInfo.Long(0) = lpDocName.addressMBS(0)
pDocInfo.Long(4) = lpOutputFile.addressMBS(0)
pDocInfo.Long(8) = lpDataType.addressMBS(0)
lReturn = OpenPrinter(TargetPrinter, hPrinter, 0)
if lReturn <> 0 then
lReturn = StartDocPrinter(hPrinter, 1, pDocInfo)
if lReturn <> 0 then
lReturn = StartPagePrinter(hPrinter)
if lReturn <> 0 then
while not bs.EOF
sWrittenData = bs.Read(32767)
strLength = lenb(sWrittenData)
lReturn = WritePrinter(hPrinter, sWrittenData, strlength, lpcWritten )
amtSent = amtSent + lpcWritten.Long(0)
if lpcWritten.long(0) <> strlength then
msgBox "Could not write data to printer."
end if
wend
lReturn = EndPagePrinter(hPrinter)
Result = true
else
msgBox "StartPagePrinter failed."
end if
lReturn = EndDocPrinter(hPrinter)
else
msgBox "StartDocPrinter failed."
end if
lReturn = ClosePrinter(hPrinter)
else
msgBox "OpenPrinter failed."
end if
end if
#else
msgbox "windows only."
#endif
return Result
end sub
|
|
|
| Nach oben |
|
 |
robin
Anmeldedatum: 08.03.2010 Beiträge: 2
|
Verfasst am: 09.03.2010, 09:29 Titel: |
|
|
Klingt recht Interessant!
Unter Linux sollte das mittels senden an die drucker Warteschlange durch den Befehl lpr -o raw -P <Warteschlangenname> <file>
funzn |
|
| Nach oben |
|
 |
|
|
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht teilnehmen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|