RealBasic.de Foren-Übersicht RealBasic.de
Das deutsche RealBasic-Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Windows: RAW-Daten zu Drucker senden

 
Neues Thema eröffnen   Neue Antwort erstellen    RealBasic.de Foren-Übersicht -> Tutorials
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
qualidat



Anmeldedatum: 10.02.2006
Beiträge: 249

BeitragVerfasst am: 30.11.2007, 09:37    Titel: Windows: RAW-Daten zu Drucker senden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
robin



Anmeldedatum: 08.03.2010
Beiträge: 2

BeitragVerfasst am: 09.03.2010, 09:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    RealBasic.de Foren-Übersicht -> Tutorials Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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