Delphi + Epson ESC/P + podgląd wydruku

0

Mam program dedykowany dla systemu DOS. W jego ustawieniach można przestawić drukowanie
wyłącznie na porty LPT, COM lub do pliku. Wydruki generowane są w standardzie EPSON ESC/P.

Potrafię przechwycić wydruk za pomocą aplikacji napisanej w Delphi i mógłbym przekierować
sobie na dowolną inną drukarkę, ale chciałbym mieć możliwość podglądu tego wydruku.

I tu pojawia się problem, bo o ile znaczniki pogrubienia, pochylenia lub podkreślenia
można łatwo zrealizować w Memo, to indeks dolny i górny już chyba tylko w Richedit,
a o zagęszczeniu tekstu (condensed) można już chyba zapomnieć?

Pytanie moje więc jest nastepujące:

Jak zrealizować podgląd wydruku takiego pliku?
Czy można to zrobić:

  • za pomocą Memo,
  • za pomocą Richedit,
  • za pomocą Canvas,
  • czy po prostu użyć jakiegoś dobrego (ale tylko darmowego!) komponentu do podglądu wydruków?

Może da się to jakoś skonwertować na bitmapę, a może do PDF-a?

A może widział gdzieś ktoś porównanie różnych standardów wydruku - najlepiej w formie tabelki
z kodami sterującymi ESC/P, PCL, HPGL? Wówczas dałbym sobie spokój z tym podglądem wydruku
i po prostu od razu wrzucał na drukarkę (przy użyciu rozpoznawanych przez nią kodów).

0

ja swego czasu pisałem program, który drukował wydruki textowe na drukarkach nieigłowych (z formatowaniem, tabelkami itd). Formatowanie w pliku miałem na kodach sterujących, które miały postać
[#27][kod][wartość]
#27 to ESC
kod to jeden znak kodu, np. B dla pogróbienia, I dla pochylenia, L dla LPI itd
wartość to jeden znak wartości kodu, np B1 najcieńszy B6 najgróbszy, I0 wyłączenie pochylenia I1 włączenie pochylenia.

Plik był w takim formacie, bo potem na podstawie plików z kodami sterującymi drukarek były robione podmiany na kody sterujące konkretnej drukarki

Całość to było kilkanaście godzin pisania, plik mógł być "wydrukowany" na dowolnum canvasie, czyli na drukarce, do pliku czy na jakiejś kontrolce.

Ja użyłem do tego celu Canvas i jego metody, do stworzenia odpowiedniego fontu CreateFontIndirect

taki mały hint (kawałek z ww aplikacji)

//FLPI to ilość lini na cal
//FCPI to ilość znaków na cal
//FItalic, FUnderline to zmienne typu bool
//FFont to nazwa fontu (ważne, żeby była to czcionka o stałej szerokości

  fDPI_V := Trunc(GetDeviceCaps(Printer.Handle, LogPixelsX) /
GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) *
GetDeviceCaps(Printer.Handle, HorzRes));
  fDPI_H := Trunc(GetDeviceCaps(Printer.Handle, LogPixelsY) /
GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT) *
GetDeviceCaps(Printer.Handle, VertRes));

function CreateFont(FontHandle: THandle): HFONT;
var
  lf: TLogFont;
begin
  GetObject(FontHandle, SizeOf(lf), Addr(lf));
  lf.lfHeight := fDPI_V div FLPI;
  lf.lfWidth := fDPI_H div FCPI;
  lf.lfEscapement := 0;
  lf.lfOrientation := 0;
  lf.lfWeight := 400;;
  lf.lfItalic := Byte(FItalic);
  lf.lfUnderline := Byte(FUnderline);
  lf.lfStrikeOut := 0;
  lf.lfCharSet := EASTEUROPE_CHARSET;
  StrCopy(lf.lfFaceName, PChar(FFont));
  lf.lfOutPrecision := OUT_DEFAULT_PRECIS;
  lf.lfQuality := ANTIALIASED_QUALITY;
  lf.lfPitchAndFamily := FF_MODERN or FIXED_PITCH;
  Result := CreateFontIndirect(lf);
end;

odpowiedznią gróbość uzyskałem rysując text przesunięty o pixel (lub więcej) w prawo

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0