Einzelnen Beitrag anzeigen

loomhead

Registriert seit: 6. Sep 2009
2 Beiträge
 
#1

Bilder als Steuerzeichen drucken

  Alt 6. Sep 2009, 20:40
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 1Auszug)

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
  Mit Zitat antworten Zitat