![]() |
Bilder als Steuerzeichen drucken
Hallo Zusammen,
einige werden sich jetzt wundern warum ich mit diesem alten Thema ein neuen Beitrag eröffne. Ganz einfach: ich habe bisher - auch hier im Forum - keine Lösung gefunden. Erklärung des Problems: Ich habe hier einen EPSON TM88IV, Star TSP100 und einen EPSON-Nachbau von ART. Aller Drucker (Treiber) unterstützen ESC/POS. Auf diesen drei Druckern versuche ich einen Bon mit: - Formatiertem Text - Barcode - Dynamisch erzeugtem BMP zu drucken Das dynamische Bild ist ein S/W BMP (2Bit) und enthält einen Gutscheincode. Beim EPSON-Nachbau funktioniert es problemlos. Die beiden anderen versagen wie folgt: - Star druckt Bild jedoch die Steuerzeichen für formatiertem Text als Plain-Text. - EPSON druckt alles optimal jedoch fehlt das BMP ganz. Ich drucke im Augenblick wie folgt: VARIANTE 1:(Auszug)
Delphi-Quellcode:
Wie gesagt: Diese Variante(1) funktioniert auf dem EPSON-Nachbau jedoch auf keinem anderen Drucker.
[...]
Printer.BeginDoc; printString:=' '; [...] printString:=printString+('#27#33#32); // DOUBLE WIDTH [...] printString:=printString+('IHR BELEG'+#10#13); [...] // TEXT DRUCKEN len:= Length(printString)-2; Move( len, printString[1], 2 ); Escape( printer.canvas.handle, PASSTHROUGH, 0, PChar(printString), Nil ); // NEUE SEITE printer.NewPage;// IMPORTANT! // BILD LADEN tmpStream := TResourceStream.Create( HInstance, 'bg', 'BMP' ); bmp:=TBitmap.Create; bmp.LoadFromStream(tmpStream); // BILD DRUCKEN Bits := bmp.Handle; GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); Image := AllocMem(ImageSize); try GetDIB(Bits, 0, Info^, Image^); StretchDIBits(Printer.Canvas.Handle, 90, 20, Bmp.Width, bmp.Height, 0, 0, bmp.Width, bmp.Height, Image, Info^, DIB_RGB_COLORS, SRCCOPY); finally FreeMem(Image, ImageSize); end; printer.NewPage;// IMPORTANT! // BARCODE DATA BCText:=‘ABC123‘; printString:=printString+#29#102#1; printString:=printString+#29#72#1; printString:=printString+#29#104#64; printString:=printString+#29#119#3; printString:=printString+#29#107#69; // BARCODE TEXT printString:=printString+(char(length(BCText))); printString:=printString+(Pchar(BCText)); // PRINT BARCODE len:= Length(printString)-2; Move( len, printString[1], 2 ); Escape( printer.canvas.handle, PASSTHROUGH, 0, PChar(printString), Nil ); Printer.EndDoc; printer.Refresh; Folgende Variante funktioniert auch bei allen Druckern. Jedoch bin ich nicht in der Lage ein Bild zu drucken. Steuerzeichen für Textformatierungen funktionieren mit dieser Variante bei ALLEN Druckern!! (Habe ich hier im Forum unter: ![]() VARIANTE 2:
Delphi-Quellcode:
Mir währe es am liebsten das Ganze wie in Variante 2 zu gestalten, jedoch weiss ich einfach nicht wie ich das BMP an den Drucker senden muss.
procedure WriteRawStringToPrinter(PrinterName:String; S:String);
var Handle: THandle; N: DWORD; DocInfo1: TDocInfo1; begin if not OpenPrinter(PChar(PrinterName), Handle, nil) then begin ShowMessage('error ' + IntToStr(GetLastError)); Exit; end; with DocInfo1 do begin pDocName := PChar('test doc'); pOutputFile := nil; pDataType := 'RAW'; end; StartDocPrinter(Handle, 1, @DocInfo1); StartPagePrinter(Handle); WritePrinter(Handle, PChar(S), Length(S), N); EndPagePrinter(Handle); EndDocPrinter(Handle); ClosePrinter(Handle); end; procedure TForm1.Button1Click(Sender: TObject); begin WriteRawStringToPrinter('epson', 'Test This'); end; Im Prinzip muss das BMP in Steuerzeichen zerlegt und dann byte fuer byte an den Drucker geschickt werden. ABER WIE GEHT DAS??? Wie kann ich ein dynamisch erzeugtes BMP in Steuerzeichen bzw. eine ESC-Sequence zerlegen und dann drucken? Es wäre toll wenn mir jemand helfen könnte, mein ganze Projekt hängt hier dran. Gruß & Danke im Voraus Karsten |
Re: Bilder als Steuerzeichen drucken
Hier wird ESC/P Mode und RAW-Mode gemischt (Ausgabe als Text mit ESC-Codes und Ausgabe via Printer.Canvas). Vielleicht sollte man alles auf dem Canvas zeichnen und ausgeben, statt hier zwischendurch hin und her zu schalten. Als Barcode verwendet man dann halt ein TTF, statt Druckerschrift.
Ansonsten unterstützen ESC/P Drucker keine gemischte Ausgabe von Grafik/Text. Der Grafik-Modus muss vorher verlassen werden (ESC @), bevor wieder alle ESC-Sequenzen verfügbar sind (also wohl auch nach Ausgabe via Canvas). Für die Alternative, alles via ESC/P zu drucken: Man schaltet mit "ESC ( G" in den Grafik-Modus (genaue Beschreibung siehe EPSON ESC/P Reference Manual). Einen Modul zur Ausgabe für Grafik und Text auf einem Nadeldrucker, schwirrt irgendwo in meinen alten Archiven rum... aber das suchen |
Re: Bilder als Steuerzeichen drucken
Hallo Satty67,
vielen Dank fuer die Info. Zitat:
Meine Frage hierzu waere jedoch: Wie kann ich die Grafik denn so formatieren das ich sie als ESC an den Drucker senden kann? Ich brauche dann z.B. eine function bmp2esc. Aber wie lese ich jedes Bit eines Bildes und mache ESC-Codes daraus? Vielen Dank & Gruß Karsten |
Re: Bilder als Steuerzeichen drucken
Zitat:
Eine umfangreiche Dokumentation findet sich ![]() Dort ab Seite 169. Auf Seite 172 ist der ESC-Befehl gut beschrieben (nach Umschalten mit "ESC ( G" wird die Grafik via "ESC ." plus Parameter gesendet). Die Grafik hast Du ja in einer TBitmap. Da kannst Du ja bequem via Canvas.Pixels oder .ScanLine auf die Bildpunkte zugreifen. (BitMapFormat passend setzen, z.B. pf1bit, dann ist sogar umrechnen unnötig). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz