Работа с принтером.

Материал из DRKB


Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer: TPinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers:

Свойства TPrinter[править | править код]

  • Aborted: Boolean - Показывает, что процесс печати прерван
  • Canvas: TCanvas - Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст... Тут есть несколько особенностей, они описаны после описания объекта.
  • Fonts: TStrings - Возвращает список шрифтов, поддерживаемых принтером
  • Handle: HDS - Получить Handle на принтер для использования функций API (см. Далее)
  • Orientation: TPrinterOrientation - Ориентация листа при печати : (poPortrait, poLandscape)
  • PageHeight: Integer - Высота листа в пикселах
  • PageNumber: Integer - Номер страницы, увеличивается на 1 при каждом NewPage
  • PageWidth: Integer - Ширина листа в пикселах
  • PrinterIndex: Integer - Номер используемого принтера по списку доступных принтеров Printers
  • Printers: TStrings - Список доступных принтеров
  • Printing: Boolean - Флаг, показывающий, что сейчас идет процесс печати
  • Title: string - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати

Методы TPrinter[править | править код]

  • AssignPrn - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
  • Abort - Сбросить печать
  • BeginDoc - Начать печать
  • NewPage - Начать новую страницу
  • EndDoc - Завершить печать.

Пример :

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Printer do
  begin
    BeginDoc; { Начало печати }
    Canvas.Font := Label1.Font; { Задали шрифт }
    Canvas.TextOut(100, 100, 'Это тест принтера !!!'); { Печатаем текст }
    EndDoc; { Конец печати }
  end;
end;


Особенности работы с TPrinter[править | править код]

  1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
  2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".
  3. У TPrinter информация о принтере, по видимому, определяются один раз - в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.


Определение параметров принтера через API[править | править код]

Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter - Printer.Handle.

Далее вызывается функция API (unit WinProcs):

GetDevice(Handle: HDC; Index: Integer): Integer;
  • Index - код параметра, который необходимо вернуть.

Для Index существует ряд констант:

  • DriverVersion - вернуть версию драйвера
  • Texnology - Технология вывода, их много, основные
    • dt_Plotter - плоттер
    • dt_RasPrinter - растровый принтер
    • dt_Display - дисплей
  • HorzSize - Горизонтальный размер листа (в мм)
  • VertSize - Вертикальный размер листа (в мм)
  • HorzRes - Горизонтальный размер листа (в пикселах)
  • VertRes - Вертикальный размер листа (в пикселах)
  • LogPixelX - Разрешение по оси Х в dpi (пиксел /дюйм)
  • LogPixelY - Разрешение по оси Y в dpi (пиксел /дюйм)

Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все. Параметры, возвращаемые по LogPixelX и LogPixelY очень важны - они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера. Пример таких функций:

procedure TForm1.GetPrinterInfo; { Получить информацию о принтере }
begin
  PixelsX := GetDeviceCaps(Printer.Handle, LogPixelsX);
  PixelsY := GetDeviceCaps(Printer.Handle, LogPixelsY);
end;

function TForm1.PrinterCoordX(x: Integer): Integer; { переводит координаты из мм в пиксели }
begin
  PrinterCoordX := Round(PixelsX / 25.4 * x);
end;

function TForm1.PrinterCoordY(y: Integer): Integer; { переводит координаты из мм в пиксели }
begin
  PrinterCoordY := Round(PixelsY / 25.4 * y);
end;

begin
  GetPrinterInfo;
  Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),
    'Этот текст печатается с отступом 30 мм от левого края и ' +
    '55 мм от верха при любом разрешении принтера');
end;


Данную методику можно с успехом применять для печати картинок - зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) - микроскопической.

P.S. Мой комментарий.

Я производил печать следующим образом:

procedure TForm6.SpeedButton1Click(Sender: TObject);
var
  PRect: Trect;
  PBitMap: TBitmap;
begin
  PBitmap := TBitMap.Create;
  PBitmap.LoadFromFile('C:\1.bmp');
  with PRect do
  begin
    Left := 0;
    Top := 0;
    Right := Printer.PageWidth;
    Bottom := Printer.PageHeight;
  end;
  with printer do
  begin
    BeginDoc;
    Font.Name := 'Times New Roman';
    Canvas.StretchDraw(PRect, Bitmap);
    EndDoc;
  end;
  PBitmap.Free;
end;


Удачи!


Author: DenKop@mail.ru
Source: Взято с сайта http://blackman.wp-club.net/
ID: 03264