Печать форм данных

Материалы и спецификации печати форм данных
В основе печати форм данных в Delphi лежит работа с графическими контекстами (GDI/HDC). Технически принтер получает команды через TPrinter.Canvas, где разрешение задается свойством Printer.Canvas.Font.PixelsPerInch (обычно 300–1200 dpi в зависимости от драйвера). Однако прямое рисование на HDC принтера требует учета цветовых профилей ICC — в Delphi 2026 для корректной цветопередачи используются преобразования через ICM 2.0 (Image Color Management) с вызовом SetICMMode. Альтернатива — использование векторных метафайлов (EMF): TMetaFileCanvas записывает команды GDI, которые затем интерпретируются драйвером принтера с минимальными потерями разрешения. Критический параметр — Orientation (poPortrait/poLandscape) и PaperSize (DMPAPER_*), устанавливаемые через Printer.SetPrinter c флагами DM_ORIENTATION и DM_PAPERSIZE.
Технические отличия от альтернативных подходов
Печать формы как растрового изображения (BitBlt) в корне отличается от генерации отчета через FastReport или QuickReport. При BitBlt (PrintWindow API) захватывается пиксельный буфер формы с фиксированным разрешением экрана (96–192 dpi), что дает ступенчатость и потерю качества на принтере 600+ dpi. Альтернатива — EMF-метафайлы: CreateEnhMetaFile генерирует векторные данные, масштабируемые без артефактов. В отличие от ReportBuilder, который использует собственный движок рендеринга с поддержкой фреймов и подчиненных отчетов, печать через TPrinter не поддерживает автоматическое разбиение страниц — требуется ручное управление Printer.NewPage и расчет высоты строк через Canvas.TextHeight. Еще одно различие — управление цветом: FastReport поддерживает ColorMatching через frxGdipPictureCache, тогда как прямая печать форм требует явной калибровки через GetDeviceCaps(LOGPIXELSX) и GetDeviceCaps(COLORRES).
Производственный цикл печати: технические этапы
- Инициализация потока печати: вызов Printer.BeginDoc создает spool-файл (SHD/SPL в Windows). Важно задать Copies и Collate (сортировка копий) через SetPrinter, иначе многокопийная печать эмулируется циклом.
- Построение макета: через GetDeviceCaps(PHYSICALWIDTH) и GetDeviceCaps(PHYSICALHEIGHT) получаем физические размеры страницы в пикселях принтера. Поля вычисляются через GetDeviceCaps(PHYSICALOFFSETX) — это аппаратные отступы, игнорируемые при прямом Canvas->Draw.
- Рендеринг содержимого: если форма содержит TDBGrid, печать выполняется построчно через цикл с Canvas.TextOut и Canvas.Rectangle для ячеек. Для сложных форм (TForm) используется PrintWindow с флагом PW_CLIENTONLY или полный захват через GetWindowDC + StretchBlt.
- Завершение: Printer.EndDoc отправляет spool-файл в очередь. Контроль ошибок — проверка Printer.Printers.Count > 0 перед BeginDoc.
Стандарты качества и контроль печати
Для соответствия ISO 12647 (контроль цветопередачи в офсетной печати) Delphi-приложение должно применять цветоделение (CMYK) через GetDeviceCaps(PLANES) и GetDeviceCaps(BITSPIXEL). Реальные значения битности (обычно 24 или 32 bpp) влияют на сглаживание шрифтов. Качество растровой печати через BitBlt оценивается по градиентам — при 1200 dpi и 24 битах цветовые переходы без полос возможны только при Halftone-режиме сглаживания (SetStretchBltMode). Для метафайлов (EMF) критичен параметр iMillimeters в заголовке — масштаб 1:1 достигается установкой SetMapMode(MM_LOMETRIC) или SetMapMode(MM_HIMETRIC). Контроль плотности штриховки фона: для заливок форм (Color = clWhite) важно учитывать, что драйвер может заменять чистый белый на непропечатанную область экономии тонера — решается принудительной установкой Canvas.Brush.Style = bsSolid и значением RGB(255,255,254).
Технические ограничения и их обход
- Медленная печать больших таблиц: TPrinter не кэширует объекты — для 10000 строк с TDBGrid требуется отдельная компиляция макета в TMemoryStream с последующим PlayEnhMetaFile. Решение — предрасчет макета в TCanvas памяти с разрешением принтера.
- Несоответствие шрифтов: шрифты форм (например, Tahoma 8pt) на принтере выглядят мельче из-за разных DPI. Техника коррекции: Canvas.Font.Height = -MulDiv(9, GetDeviceCaps(LOGPIXELSY), 72).
- Границы и LiveBindings: при динамическом отображении данных через TBindExpr, печать их требует вызова TBindingsList.Notify перед BeginDoc, иначе в макет попадут кэшированные значения.
- Цветовые искажения: на PostScript-принтерах цветовые паттерны (TCanvas.Brush.Bitmap) теряются. Используйте Canvas.RenderFromBitmap с перекодировкой через GetICMProfile.
Добавлено: 27.04.2026
