Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Drucker Steuercodes aus Datei lesen und über canvas neu ausg (https://www.delphipraxis.net/105737-drucker-steuercodes-aus-datei-lesen-und-ueber-canvas-neu-ausg.html)

waldforest 28. Dez 2007 18:31


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

Der_Unwissende 29. Dez 2007 10:30

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

waldforest 29. Dez 2007 10:57

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

himitsu 29. Dez 2007 12:31

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.

Reinhard Kern 29. Dez 2007 13:12

Re: Drucker Steuercodes aus Datei lesen und über canvas neu
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von waldforest
Hallo,
ich suche schon seit langem nach einer Möglichkeit, einem Ansatz ähnlich DOSPRN, eine Druckerdatei in eine Datei für einen Windowsdrucker umzuwandeln.
...
Hat jemand eine Idee, wie man dies einfach gestalten kann ?
Vielleicht auch ein kleines Beispiel ?

mfg waldforest

Hallo,

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

waldforest 29. Dez 2007 14:24

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

mimi 3. Jan 2008 11:32

Re: Drucker Steuercodes aus Datei lesen und über canvas neu
 
Ich habe sowas in dieser art selber mal angefangen:
Delphi-Quellcode:
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;
// Außerdem wird noch diese Funktion gebraucht:
Delphi-Quellcode:
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
und diese hier:
Delphi-Quellcode:
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;
müsstest du evlt. anpassen unter Windows ist das glaube ich #10#13 oder so.
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:
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;
Evlt. hilft es dir oder anderen.
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 3. Jan 2008 12:48

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Thema ;)

waldforest 3. Jan 2008 18:56

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

mimi 4. Jan 2008 13:45

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