Drucker Steuercodes aus Datei lesen und über canvas neu ausg
Hallo,
ich suche schon seit langem nach einer Möglichkeit, einem Ansatz ähnlich DOSPRN, eine Druckerdatei in eine Datei für einen Windowsdrucker umzuwandeln. Ich stelle mir vor, anhand von einer Referenzdatei mit z.B. EPSON Steuercodes, eine Erstellte Druckdatei aus einem DOS-Programm um zu wandeln. Sicherlich wäre der einfachste Weg DOS PRN zu nutzen, aber dies ist für mich nicht felexibel genug und ich möchte geren lernen so etwas selber um zu setzten. Verschieden Recherchen hier im Forum haben mich auf die Printer.Canvas gebracht, die ich denke geeignet ist. Tutourial Allerdings habe ich noch keine Idee, wie ich ohne großen Aufwand (Berechnung der Zeichenbreite z.B. bei Fettdruck etc.)die Codes ersetzten kann und anschließend mit Printer.Canvas.TextOut(x, y, sl[zeile]); den Text auch formatiert ausdrucken kann. Hat jemand eine Idee, wie man dies einfach gestalten kann ? Vielleicht auch ein kleines Beispiel ? mfg waldforest |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Hi,
kannst Du noch mal genauer sagen was Du machen möchtest? Du möchtest eine Druckerdatei in eine Datei für einen Drucker umwandeln? Stellt sich für mich die Frage was ist eine Druckerdatei und was ist eine Datei für einen Windows-Drucker? Was die Steuercodes angeht, so kannst Du am einfachsten zu bekannten Standards greifen. Ob Epson seine Steuercodes offen legt oder ob Du da bei PLC (oder wie der HP-Standard heißt) mehr Glück hast kann ich nicht sagen. Am Einfachsten dürfte es aber sein, wenn Du einfach auf Postscript (PS) setzt. Das wird so z.B. auch häufig von PDF-Druckern verwendet. Dazu kannst Du einen beliebigen Drucker installieren bzw. zum Erzeugen der Dateien verwenden, der eben einen PS - Prozessor besitzt (typischerweise sind das Laserdrucker die das häufig im Namen tragen). Einem solchen Drucker wird eben der Druck wirklich als Postscript übertragen, ein spezieller Prozessor im Drucker wandelt das ganze dann erst um. Da Postscript wohl bekannt ist, solltest Du damit leicht eine Umwandlung hinbekommen. Allerdings stellt sich dann weiterhin die Frage, was genau Du jetzt eigentlich damit machen möchtest? Wie gesagt, die Unterscheidung der beiden Dateien ist mir noch überhaupt nicht klar. Gruß Der Unwissende |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Hallo,
ich versuche noch einmal mein Anliegen näher zu beschreiben. Ich habe eine Druckerdatei (PRN) welche aus einer DOS Anwendung mit EPSON Steuercodes (Schriftart, Fett etc) erzeugt wird. Diese ist leider unter Windows und GDI Drucker nicht sofort druckbar. Nun möchte ich, so wie dies vom Druckserverprogramm DOSPRN gemacht wird, selber eine Art Umwandler nach GDI programmieren. Nun fragt man sich warum das Pferd neu satteln, wenn es bereits besattelte Pferde gibt. 1.) möchte ich lernen, wie man so etwas realisieren kann. 2.) denke ich, dass ich, sofern es mir gelingt eine Datei mit EPSON Escape Steuercodes in eine ausdruckbare Datei zu konfertieren, ich mir einige Futers selber coden kann. z.B. mit Hintergrundbild Wäre super wenn es hier ein paar Anregungen Hilfestellungen geben würde. P.S.: Habe mir heute auch noch einmal das Thema "Parsen" angesehen, was sicher eine Vorstufe (Umwandlung von ESCAPE Sequenzen nach vielleicht z.B. Ritchtext Codes) sein kann. mfg waldforest |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Würde es nicht reichen, wenn du nur eine GUI-Erweiterung zu DOSPRN machst?
Die GUI also ganz einfach nur DOSPRN steuert. |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
anbei eine Druckerunit für NEC und Epson, die ESC/P-Codes umsetzt in Windowsprinter-Befehle, die war jahrelang im Einsatz um bei uns Rechnungen und Lieferscheine zu drucken. Allerdings ist sie 10 Jahre alt, war für Turbo Pascal für Windows, und beschränkt sich auf das, was in den Rechnungen vorkam, also verschiedene Schriften , aber keine Grafik. Noch ein Hinweis: der Font muss natürlich nichtproportional sein. Ich habe damals Lucida Sans Typewriter verwendet, damit sahen die Drucke sehr gut aus, sonst eben Courier, aber das ist keine sehr schöne Schrift. Vielleicht kannst du was damit anfangen, vielleicht auch nicht. Die Unit wurde innerhalb eines Programms verwendet, das ein Verzeichnis auf gespoolte Dateien überwachte, diese ausdruckte und löschte. Im Endeffekt wurden NEC-Drucke aus einem uralten Clipper-Programm auf einen Laserjet4 umgeleitet. Gruss Reinhard |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Hallo,
super, erst einmal vielen Dank, werde mich mit dem Code einmal beschäftigen. Im Übrigen, wenns funktioniert, ist es ein guter Schritt in die Richtung die ich brauche. Meine Fieles kommen ebenfalls aus einer Clipper Anwendung. Mal sehen, ob ich den Source nach meinen Bedürfnissen anpassen kann. Danke !! mfg waldforest |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Ich habe sowas in dieser art selber mal angefangen:
Delphi-Quellcode:
// Außerdem wird noch diese Funktion gebraucht:
procedure TPlutoDrawText.DrawText(const tx, ty: Integer; const aText: widestring);
var px, py, pw, ph, l, p,u,ph2,t,j,FontI, Level:Integer; str1:Widestring; str3,str4:String; str2:widestring; command, value:Widestring; TmpBG, TmpPN,TmpBG2:TColor; TmpFS, NewFS:TFontStyles; TmpFN:String; aText2:String; isText,isText2:Boolean; isList:Boolean; begin px:=tx; py:=0; l:=1; p:=1; ph:=0; Level:=px; aText2:=aText; // DelSteuerzeichen(aText); isText:=False; repeat str1:=NextHtml(l,p,str2,aText2); ph2:=Canvas.TextHeight(str1); if ph2 > ph then ph:=ph2; until p = 0; l:=1; p:=1; pw:=0; ph:=ph+2; repeat str1:=NextHtml(l,p,str2,aText2); pw:=canvas.TextWidth(str1); if pw > 0 then canvas.FillRect(px,py-1,px+pw,py+ph); isText2:=str1 <> ''; if str1 <> '' then isText:=True; str1:=DelSteuerzeichen(str1); if islist then begin str1:=TrimLeft(str1); // str1:=TrimRight(str1); end; canvas.TextOut(px,py,str1); Canvas.font.Style:=TmpFS; tmpfs:=[]; str2:=LowerCase(str2); u:=pos('=',str2)-1; j:=1; t:=1; if u > -1 then begin repeat str3:=GetTokenExt(str2,' ','"',j); command:=LowerCase(GetToken(GetTokenExt(str3,'=','"',1),'=',1)); Value:=LowerCase(GetToken(GetTokenExt(str3,'=','"',2),'"',2)); // Writeln('Value:[',Value+']'); // writeln('Str3:[',str3,']'); if Command = 'pn' then begin TmpPN:=Canvas.pen.Color; Canvas.Pen.Color:=String2ToColor('pl_'+Value); end; // Command = fg if Command = 'fg' then begin TmpFG:=Canvas.Font.Color; Canvas.Font.Color:=String2ToColor('pl_'+Value); end; // Command = fg if Command = 'bg' then begin TmpBG:=Canvas.Brush.Color; Canvas.Brush.Color:=String2ToColor('pl_'+Value); end; // Command = bg if command = 'fn' then begin end; // fn if Command = 'fs' then begin TmpFS:=Canvas.Font.Style; NewFS:=[]; // writeln(Value); for FontI:=1 to NumToken(value,',') do begin str4:=GetToken(Value,',',FontI); if str4 = 'b' then include(Newfs, fsBold); if str4 = 'i' then include(Newfs, fsItalic); if str4 = 'u' then include(Newfs, fsUnderline); if str4 = 's' then include(Newfs, fsStrikeOut); end; canvas.Font.Style:=Newfs; end; inc(j); until str3 = ''; end; // u > 0 px:=px+pw; if u = -1 then begin command:=LowerCase(str2); if command ='list' then begin px:=level; isList:=True; end; if command = 'addlevel' then begin TmpBG2:=Canvas.brush.Color; Canvas.brush.Color:=clBlack; if isText2 then py:=py+ph+1; inc(level,10); px:=level; // if not isText2 then Canvas.FillRect(px-5,py,px,py+5); Canvas.brush.Color:=TmpBG2 end; if command = '/addlevel' then begin if isText2 then py:=py+ph+1; dec(level,10); px:=level; end; if command ='/list' then begin px:=level; isList:=False; end; if command = 'br' then begin py:=py+ph+1; px:=level; end; if command = 'hr' then begin if isText then py:=py+ph+1; px:=tx; Canvas.MoveTo(0,py); Canvas.LineTo(canvas.ClipRect.Right,py); py:=py+3; end; if command = '/fg' then Canvas.Font.Color:=TmpFG; if command = '/bg' then Canvas.Brush.Color:=TmpBG; if command = '/pn' then Canvas.Pen.Color:=TmpPN; if command = '/fs' then begin end; if command = '/' then begin Canvas.Font.Color:=TmpFG; Canvas.Brush.Color:=TmpBG; Canvas.Pen.Color:=TmpPN; // Canvas.font.Style:=TmpFS; // tmpfs:=[]; end; end; // u = -1 until p = 0; end;
Delphi-Quellcode:
und diese hier:
function NextHtml(var FirstIndex, LastIndex: Integer;
var aCommand:widestring; const asoruce: widestring): String; begin lastindex:=PosExt('<',asoruce,FirstIndex); // writeln(Firstindex,'\',Length(asoruce)); if LastIndex > 0 then begin result:=Copy(asoruce,FirstIndex,abs(LastIndex-FirstIndex)-1); FirstIndex:=PosExt('>',asoruce,LastIndex); aCommand:=Copy(asoruce,LastIndex,abs(LastIndex-(FirstIndex-1))); end else begin aCommand:=''; result:=Copy(asoruce,FirstIndex,Length(asoruce)); end; end; // NextHtml
Delphi-Quellcode:
müsstest du evlt. anpassen unter Windows ist das glaube ich #10#13 oder so.
function DelSteuerzeichen(const aString:String):String;
var x:Integer; NewStr:String; begin for x:=1 to Length(aString) do begin if aString[x] <> #10 then NewStr:=NewStr+aString[x] end; result:=NewStr; end; das habe ich jetzt in Lazarus erstellt. soltle aber auch bei dir laufen. Evlt. müsstest du noch eine Gobale Variable anlegen: Canvas:TCanvas; Da wird der Text drauf gezeichnet. und das hier wird noch gebraucht:
Delphi-Quellcode:
Evlt. hilft es dir oder anderen.
function NumToken(aString: String; SepChar: Char):Byte;
var RChar : Char; StrLen : Byte; TNum : Byte; TEnd : Byte; begin if SepChar = '#' then begin RChar := '*' end else begin RChar := '#' end; StrLen := Length(aString); TNum := 0; TEnd := StrLen; while TEnd <> 0 do begin Inc(TNum); TEnd := Pos(SepChar,aString); if TEnd <> 0 then begin aString[TEnd] := RChar; end; end; Result := TNum; end; function GetToken(aString: String; SepChar: Char; TokenNum: Byte):String; var Token : String; StrLen : Byte; TNum : Byte; TEnd : Byte; begin if aString <> '' then begin StrLen := Length(aString); TNum := 1; TEnd := StrLen; while ((TNum <= TokenNum) and (TEnd <> 0)) do begin //"Test wie geht es dir so" hallo "Tach" TEnd := Pos(SepChar,aString); if TEnd <> 0 then begin Token := Copy(aString,1,TEnd-1); Delete(aString,1,TEnd); Inc(TNum); end else Token := aString; end; if TNum >= TokenNum then Result := Token else begin Result := Format('Fehler: Tokennummer (%s) ist größer als token !',[aString]); // MessageBox(0,pchar(Result),nil,MB_OK or MB_ICONEXCLAMATION); end; end; end; Ich habe das gleiche noch mal in einer anderen Variante dort wird zunäst eine TObjectlist gefült. jede Zeile besteht aus Blöcken je nach Zeichen Formatierung. Damit ist dann auch per Scrollbar ein einfaches Scrollen möglich. Bei Intresse lade ich mal das ganze Projekt hoch. Es ist ein Lazarus Projekt was aber leicht nach Delphi umgewandelt werden kann. Das Projekt hat zwar weniger mit dem Drucken zu tun sollte aber eine Grundlage da stellen, weil du beim Drucken ja "nur" die Auflösung ändern müsstest.... |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Thema ;) |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Hallo,
vielen Dank, siehr ganz gut aus, vielen. Ich werde hier erst kommende Woche dazu kommen mich näher mit zu beschäftigen. Vielleicht wäre es wirklich hilfreich das Projejt ho zu laden. mfg waldforest |
Re: Drucker Steuercodes aus Datei lesen und über canvas neu
Liste der Anhänge anzeigen (Anzahl: 1)
Das Projekt ist zwar für Lazarus geschrieben sollte aber als "anregung" durch aus reichen.
Es geht hier auch nur um den Soruce. Ich hänge mal das ganze Projekt dran. Nicht wundern ich habe weiter gemacht und einige neue Proceduren erstellt. Damit ich z.b. auch Scrollen kann und auch Links unterstützen kann(aber das baue ich noch ein). Und noch was: Er lies nur Strings ein und löscht alle Zeilenumbrüche normalerweise. Weil um die musst du dich kümmern mit hier mal einige beispiele: <fg="red">Roter Text</fg> oder <bg="Blue">Blauer Text</bg> oder aber auch <bg="Black" fg="Red"> Roter text auf Schwartzen hintergrund</> Die Units musst du ALLE anpassen für Delphi. Aber zum reinschauen dürfte es reichen. Die UColorlist stellt über 600 Farben zuverfügung und einige Funktionen um dadrauf zuzugreifen Die Tools.pas stellt einige Hilfe Funktionen und Proceduren bereit die gebraucht werden Die uPlutoDrawText.pas ist die Eigentliche Unit um die es geht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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