AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Drucker Steuercodes aus Datei lesen und über canvas neu ausg
Thema durchsuchen
Ansicht
Themen-Optionen

Drucker Steuercodes aus Datei lesen und über canvas neu ausg

Ein Thema von waldforest · begonnen am 28. Dez 2007 · letzter Beitrag vom 4. Jan 2008
Antwort Antwort
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

Drucker Steuercodes aus Datei lesen und über canvas neu ausg

  Alt 28. Dez 2007, 19:31
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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 29. Dez 2007, 11:30
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
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 29. Dez 2007, 11:57
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#4

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 29. Dez 2007, 13:31
Würde es nicht reichen, wenn du nur eine GUI-Erweiterung zu DOSPRN machst?

Die GUI also ganz einfach nur DOSPRN steuert.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#5

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 29. Dez 2007, 14:12
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
Angehängte Dateien
Dateityp: pas wlpnec_171.pas (28,9 KB, 30x aufgerufen)
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#6

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 29. Dez 2007, 15:24
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
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 3. Jan 2008, 12:32
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 = 'pnthen begin
          TmpPN:=Canvas.pen.Color;
          Canvas.Pen.Color:=String2ToColor('pl_'+Value);
        end; // Command = fg

        if Command = 'fgthen begin
          TmpFG:=Canvas.Font.Color;
          Canvas.Font.Color:=String2ToColor('pl_'+Value);
        end; // Command = fg

        if Command = 'bgthen begin
          TmpBG:=Canvas.Brush.Color;
          Canvas.Brush.Color:=String2ToColor('pl_'+Value);
        end; // Command = bg
        
        if command = 'fnthen begin
        end; // fn
        
        if Command = 'fsthen begin
          TmpFS:=Canvas.Font.Style; NewFS:=[];
// writeln(Value);
          for FontI:=1 to NumToken(value,',') do begin
            str4:=GetToken(Value,',',FontI);
            if str4 = 'bthen include(Newfs, fsBold);
            if str4 = 'ithen include(Newfs, fsItalic);
            if str4 = 'uthen include(Newfs, fsUnderline);
            if str4 = 'sthen 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 ='listthen begin
        px:=level;
        isList:=True;
      end;

      if command = 'addlevelthen 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 = '/addlevelthen begin
        if isText2 then py:=py+ph+1;
        dec(level,10);
        px:=level;
      end;

      if command ='/listthen begin
        px:=level;
        isList:=False;
      end;

      if command = 'brthen begin
        py:=py+ph+1;
        px:=level;
      end;

      if command = 'hrthen 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 = '/fgthen Canvas.Font.Color:=TmpFG;
      if command = '/bgthen Canvas.Brush.Color:=TmpBG;
      if command = '/pnthen Canvas.Pen.Color:=TmpPN;

      if command = '/fsthen 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....
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
3. Jan 2008, 13:48
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Thema
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#9

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 3. Jan 2008, 19:56
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
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Drucker Steuercodes aus Datei lesen und über canvas neu

  Alt 4. Jan 2008, 14:45
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.
Angehängte Dateien
Dateityp: zip drawtext1.0_140.zip (30,6 KB, 13x aufgerufen)
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  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 22:16 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