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