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

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 ==
# После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
# Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".
# У 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
Category:Принтер
Category:Справочники