CUPS és pascal

Fórumok

CUPS és pascal

Hozzászólások

Szeretnék freepascal+lazarus-ból nyomtatni, annyit sikerült kinyomoznom, hogy postscript fájlt át tudok adni a CUPS-nak, azt valamikor még kézzel is írtam, ezzel nincs gondom. A problémám az, hogyan tudok betűtípusokra hivatkozni, egyáltalán nem tudom milyen betűtípusok érhetőek el CUPS alatt, honnan tudhatom meg ezt. Az X alatt elérhető összes betűtípus(TTF, Type1, stb.) elérhető CUPS alól. Ugye a Postscript nyomtatók tudnak min. 35 beépített betűtípust (amelyek régi típusoknál nem tartalmazzák az Ő, Ű betűket) ugyanígy kezeli a CUPS az X alá telepített fontokat?

Szerintem neked inkabb valami postscript generator API-t kellene nezegetned. Nem megoldas, hogy mondjuk docbook xml-t nyomsz ki, majd azt feldolgozod postscriptte a docbook egyeb utility-eivel?

Nem foglalkozom pascallal, de talan van hozza kesz unit postscript generalasra.

A nyomtatok beepitett fontjaiban ne bizz:) ő és ű betűk tudnak meglepetéseket okozni. A megoldás a font embedding a postscriptben, de ilyet meg már sokan megírtak, felelesleges újra feltalálni a kereket.

Szia,

A Lazarus jelenleg nálam csak Windows 2000 alatt van fenn... Ez a pár sor Delphi-ből működik, de 0.9.x Lazarus alól nem nyomtat (lehet hogy hiányos elég régi verzó), de lehet hogy linux alatt egy újabb verzió csinál is valamit... Én ebben az irányban kutakodnék, mert a Canvas egy TPostScriptCanvas objectum szerintem jól hangzik és ez a standart megvalósítás a borland-os Delphiben is...

[code:1:a8372e8bb7]
unit unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Printers,
Buttons;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
Application.MessageBox('Nyomtatás','Print...',0);
Printer.OutputType:=otPrinter; // csak FreePascal esetén...
Printer.BeginDoc;
Printer.Canvas.MoveTo(100,100);
printer.Canvas.LineTo(200,200);
Printer.EndDoc;
end;

initialization
{$I unit1.lrs}

end.
[/code:1:a8372e8bb7]

Bocs, ha láma kérdéseket teszek fel, de több mint 10 éve programoztam utóljára. Freepascal-hoz találtam egy cups4pascal nevü liblary-t, gyakorlatilag minden benne van ami a nyomtatás beállításához kell, de a dokumentum előállítása ennek előtte kell hogy történjen.
Amit aperger leírt, nem hiszem hogy működik UHU alatt, és ha jól látom egy darab vonalat rajzol.
Nekem formázott szöveg nyomtatására van szükségem, ami a prg. futásidejében generálódik, és az X fontjait használja. Még előnézet sem feltétlenül szükséges, bár azt egyszerübben megoldhatónak látom.

Épp UHU-m van a cégnél a Windows 2000 mellett, feltettem egy Lazarus-t és működik, csak segíteni akartam

[code:1:021f206959]
unit umain;

{$mode objfpc}{$H+}

interface

(*
Linux alatt nyomtat, es a betutipust is be tudom allitani,
valoszinu X-Window-os, mert a dialog azt hozza fel...
De ez lehet nem jo Neked.... ?????
*)

uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
Buttons, Printers;

type
TForm1 = class(TForm)
Button1: TButton;
FontDialog1: TFontDialog;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
if FontDialog1.Execute then begin
Printer.BeginDoc;
// Printer.PostScript.Document -->> lehet hogy ez segit hasznalni a UNIT-od...
Printer.Canvas.Pen.Color:=clRed;
Printer.Canvas.FontSize:=FontDialog1.Font.Size;
Printer.Canvas.FontFace:=FontDialog1.Font.Name;
// ertek = '-adobe-helvetika-medium-r-normal-*-*-240-*-*-p-*-iso8895-2'
Printer.Canvas.TextOut(200,200,FontDialog1.Font.Name);
Printer.EndDoc;
end;
end;

initialization
{$I umain.lrs}

end.
[/code:1:021f206959]

A font kiválasztásánál a charset értéke meghatározó !!!!!! De azt is lehet állítani...
Csak a fontot a beállított nyomtató-rendszernek (CUPS, LPRN) ismernie kell!!!!

Perger Attila

ui.: Szívesen!

Kösz Attila!

Ezt ki fogom próbálni. FontDialog a Lazarusban is van onnan pedig össze lehet szedni a telepített fontok neveit. Lehet próbálkozni :D
Majd megírom a fejleményeket.

Újból előszedem a témat! :)

Megint próbálkoztam a dologgal, de újfent elakadtam.
Nyomtatni gyakorlatilag tudok, de az lcl Printer.Canvas elég korlátozottan használható. Font család ha jól emlékszem 4 használható, ez elég is lenne, de Latin1 kódlapot használ. egynémely ékezetes betű helyén '?' jelenik meg. Jelenleg nincs a Printer.Canvas-nak FontFace tulajdonsága, bár lehet hogy csak postscript nyomtatóknál van így. FontFace tulajdonsága a PostscriptPrinterCanvas-nak van, ha jól emlékszem. Remélem tud valaki segíteni, gyakorlatilag az is elég lenne, ha olyan kódlappal tudnék nyomtatni, ami ismeri az ékezetes betűket.

Szia,

Elég ritkán foglalkozol ezzel a dologgal... :-) De ez csak egy kis térfarépa volt ... elég gyenge.

Na szóval. Nem tudok most segíteni, mert épp JAVA dolgokat nyúzok, de futtatok Kylix-ban írt programokat több linux disztró alatt. Az indító scriptbe be szoktam állítani LC_LANG és LC_ALL környezeti változókat. Nem túl elegáns, de működik:
LC_LANG=hu_HU.iso-8859-2
LC_ALL=hu_HU.iso-8859-2

vagy

LC_LANG=hu_HU.utf-8
LC_ALL=hu_HU.utf-8

Így például a nyelvi fájl, amit betöltök csak akkor jelenik meg helyesen, ha a nyelvi fájl kódolása és a környezet beállítása megegyezik.

Hátha segít.

Attila

UHU-ban gondolom kapásból UTF-8 be van állítva, de azért megnézem.
Ami aggaszt az ez:
procedure TPostscriptPrinterCanvas.BeginDoc;
begin
Inherited BeginDoc;

//Clear all existing values
//before starting an new document
fDocument.Clear;
fHeader.Clear;

FirstUpdatefont:=True;
Font.Size:=12;
Font.Color:=clBlack;

WriteHeader('%!PS-Adobe-3.0');
WriteHeader('%%'+Format('BoundingBox: 0 0 %d %d',[PageWidth,PageHeight]));
WriteHeader('%%'+Format('Creator: Lazarus PostScriptCanvas for %s',[Application.ExeName]));
WriteHeader('%%'+Format('Title: %s',[Title]));
WriteHeader('%%CreationDate: '+DateTimeToStr(Now));
WriteHeader('%%Pages: (atend)');
WriteHeader('%%PageResources: (atend)');
WriteHeader('%%PageOrder: Ascend');
WriteHeader('%%Page: 1');
WriteHeader('');
WriteHeader('%------------------------------------------------------------');
WriteHeader('%================== BEGIN SETUP==============================');
WriteHeader('');
WriteHeader('% ISO Fonts');
WriteHeader('/Helvetica findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/HelveticaISO exch definefont pop');
WriteHeader('');
WriteHeader('/Helvetica-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/HelveticaISO-Bold exch definefont pop');
WriteHeader('');
WriteHeader('/Helvetica-Oblique findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/HelveticaISO-Oblique exch definefont pop');
WriteHeader('');
WriteHeader('/Helvetica-Oblique-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/HelveticaISO-Oblique-Bold exch definefont pop');
WriteHeader('');

WriteHeader('/Courier findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/CourierISO exch definefont pop');
WriteHeader('');
WriteHeader('/Courier-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/CourierISO-Bold exch definefont pop');
WriteHeader('');
WriteHeader('/Courier-Oblique findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/CourierISO-Oblique exch definefont pop');
WriteHeader('');
WriteHeader('/Courier-Oblique-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/CourierISO-Oblique-Bold exch definefont pop');
WriteHeader('');

WriteHeader('/Times findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/TimesISO exch definefont pop');
WriteHeader('');
WriteHeader('/Times-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/TimesISO-Bold exch definefont pop');
WriteHeader('');
WriteHeader('/Times-Italic findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/TimesISO-Italic exch definefont pop');
WriteHeader('');
WriteHeader('/Times-Italic-Bold findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/TimesISO-Italic-Bold exch definefont pop');
WriteHeader('');

WriteHeader('/Roman findfont');
WriteHeader(' dup length dict begin');
WriteHeader(' {1 index /FID ne {def} {pop pop} ifelse} forall');
WriteHeader(' /Encoding ISOLatin1Encoding def');
WriteHeader(' currentdict');
WriteHeader('end');
WriteHeader('/RomanISO exch definefont pop');
WriteHeader('');
...

Probáltam az ISOLatin1Encoding-ot átírni ISOLatin2...-ra átírni, de akkor nem történik nyomtatás. Másrészt ha jól gondolom nem veszi figyelembe a környezeti változókat, mivel a ps-fájl fejlécében adja meg a kódlapot. :((

Forrás


unit umain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons, Printers,
  PrintersDlgs;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    PrintDialog1: TPrintDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
   s:widestring;
begin
  if PrintDialog1.Execute then begin;
    Printer.BeginDoc;
    Printer.Canvas.MoveTo(100,100);
    Printer.Canvas.LineTo(200,200);
    s:='teszt...';
    s:=InputBox('Adatbevitel','Tesztkarakterek',s);
    Printer.Canvas.TextOut(100,100,'Hello world!');
    Printer.Canvas.TextOut(200,200,s);
    Printer.EndDoc;
  end;
end;

initialization
  {$I umain.lrs}

end.

Indítóscript


#!/bin/sh

LANG=hu_HU
LC_ALL=hu_HU.iso-8859-2
#.iso-8859-2
#.utf8

./test01

Ez az összeállítás nekem működött, UTF-8 valamiért még nem, de szerintem csak próbálkozni kell
Fedore Core 4, alapbeállítás UTF8 környezetnél

Ez nekem is mükszik, igaz az ű, ő tetején kalap, meg tilde van, de szerintem ez a nyomtató sara.
A fenti fórum topic-ot már olvastam.
Az igazi megoldás az lenne, ha a ps fájlba befordítanák a X által használt karaktereket. Erre nem vállalkozom. :)
De úgy látom a gtk1 és a gtk2 fontdialog is más fontnevet ad vissza.
Egyszer hátha nekiül vki.

Az utóbbi két nap eredménye, hogy nincs más hátra, mint előre! :))

A Printer.Canvas egy Postscriptcanvas, ami Latin1 karaktertáblát használ. A nyomtatóra küldött állományt a ghostscript állítja elő, azonban ő csak ISOLatin1Encoding-ot és StandardEncodingot ismer (ill. Unicode-ot, de azzal a lazarus nem tud mit kezdeni) A megoldás egyféleképp működik,a ps fájlban deklarálni kell a Latin2-es karaktertáblát. Szerintem ennek nekifeszülök. :)
Ezek után, ha tudnám honnan lehet előbogarászni egy Font tulajdonságai közül, hogy melyik fájl tartozik hozzá, akár magát a fontot is beforgathatnám a ps fájlba. ;)