Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bilder als Steuerzeichen drucken (https://www.delphipraxis.net/139842-bilder-als-steuerzeichen-drucken.html)

loomhead 6. Sep 2009 19:40


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:
[...]
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;
Wie gesagt: Diese Variante(1) funktioniert auf dem EPSON-Nachbau jedoch auf keinem anderen Drucker.

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: link gefunden)

VARIANTE 2:
Delphi-Quellcode:
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;
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.

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

Satty67 6. Sep 2009 20:48

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

loomhead 6. Sep 2009 22:45

Re: Bilder als Steuerzeichen drucken
 
Hallo Satty67,

vielen Dank fuer die Info.
Zitat:

Zitat von Satty67
[...]
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

Dies klingt sehr Interessant und ist auch meine erste Wahl.

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

Satty67 7. Sep 2009 07:28

Re: Bilder als Steuerzeichen drucken
 
Zitat:

Zitat von loomhead
Ich brauche dann z.B. eine function bmp2esc.

So in der Art. Leider finde ich meine alte Drucker-Funktion nicht mehr (ist auch gefühlt schon jahrzehnte her, das ich auf Nadeldrucker via ESC/P ausgegeben hab').

Eine umfangreiche Dokumentation findet sich hier als PDF.
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:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz