AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder als Steuerzeichen drucken

Ein Thema von loomhead · begonnen am 6. Sep 2009 · letzter Beitrag vom 7. Sep 2009
Antwort Antwort
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
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Bilder als Steuerzeichen drucken

  Alt 6. Sep 2009, 21:48
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
  Mit Zitat antworten Zitat
loomhead

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

Re: Bilder als Steuerzeichen drucken

  Alt 6. Sep 2009, 23:45
Hallo Satty67,

vielen Dank fuer die Info.
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Bilder als Steuerzeichen drucken

  Alt 7. Sep 2009, 08:28
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).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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