TppHotPDFDevice

ReportBuilder adapter (Lib\Addons\ReportBuilder\ppHotPDFDevice.pas)

 

FastReport adapter  QuickReport adapter  DevExpress adapter

Класс устройства ReportBuilder, использующий HotPDF как базовый PDF backend вместо собственного ppPDFDevice из ReportBuilder. Предназначен для проектов, где HotPDF уже встроен и требуется единый PDF backend для всего приложения

 

Delphi declaration:

type

  TppHotPDFDevice = class(TppGraphicsDevice)

  public

    class function DeviceName: String; override;

    procedure StartJob; override;

    procedure EndJob; override;

    procedure CancelJob; override;

    procedure SetOutputStream(AStream: TStream);

    property FileName: string;

    property Title, Author, Subject, Keywords: string;

    property PDFVersion: TPDFVersType;

    property Compressed: Boolean;

    property CompressionLevel: TPDFCompressionLevel;

  end;

 

Описание

TppHotPDFDevice наследуется от TppGraphicsDevice (на один уровень выше TppCustomScreenDevice / TppImageDevice), поэтому подключается к device chain ReportBuilder при назначении TppReport.PrinterDevice или использовании как publisher device в TppPublisher. DeviceName сообщается как 'HotPDF'. Поскольку device registration в ReportBuilder выполняется через ppRptDeviceMap, а не RegisterComponents, entry в IDE component palette нет; callers создают TppHotPDFDevice напрямую

 

Каждая страница, приходящая через TppGraphicsDevice.ReceivePage, рисуется на временный TMetafileCanvas (создается в BeforeRenderPage, завершается в AfterRenderPage). Захваченный TMetafile затем передается в ShowEnhancedMetafile auto-scaling importer HotPDF:

 

1. StartJob creates the THotPDF instance, sets metadata, and calls BeginDoc.

2. BeforeRenderPage creates a TMetafile sized to spWidth x spHeight plus a TMetafileCanvas, and sets it as the inherited Canvas.

3. RenderPage (inherited) обходит DrawCommands и направляет их через GraphicsContext на наш metafile canvas

4. AfterRenderPage завершает metafile (free canvas), добавляет новую страницу HotPDF размером mmWidth x mmHeight (converted to PDF points) и проигрывает metafile через ShowEnhancedMetafile

5. EndJob вызывает HotPDF.EndDoc; если output является Stream, копирует bytes из временного файла, записанного внутри

 

Свойства

FileName - target PDF path. Used unless SetOutputStream has installed a stream.

Title / Author / Subject / Keywords — metadata документа. Когда Title пуст, adapter откатывается к имени отчета или файла, чтобы PDF всегда имел непустой title

PDFVersion — уровень спецификации PDF, на который должен быть рассчитан документ. По умолчанию pdf17

Compressed - HotPDF stream compression on (default True). Set False for diagnostic PDFs.

CompressionLevel - FlateDecode level. Defaults to clDefault.

SetOutputStream(AStream) — направить PDF bytes в AStream вместо записи на диск. Вызывайте перед ExportToFilter. Внутри используется temp file, потому что HotPDF сохраняет на EndDoc; bytes возвращаются в Finish

 

Typical workflow

 

Dev := TppHotPDFDevice.Create(nil);

try

  Dev.FileName := 'Report.pdf';

  Dev.Title := 'Monthly Statement';

  Dev.PDFVersion := pdf17;

  ppReport1.DeviceType := 'HotPDF';

  ppReport1.PrinterDevice := Dev;

  ppReport1.Print;

finally

  Dev.Free;

end;

 

Capabilities preserved

Векторное и растровое содержимое страниц выводится стандартным draw-command pipeline ReportBuilder. Текстовые строки разрешаются GDI. Захват metafile с 200 DPI по умолчанию (настраивается через унаследованный PixelsPerInch) дает качество печати без огромных файлов

 

Limitations of the metafile bridge

Поскольку страницы захватываются как enhanced metafiles, PDF-функции ReportBuilder, требующие структурной информации (поля AcroForm, named destinations, outlines, проверки соответствия PDF/A или PDF/X), не передаются. Результат является точным визуальным воспроизведением того, что выводит ReportBuilder, а не структурированным PDF

 

Packaging note

Устройство находится в Lib\Addons\ReportBuilder\ и не входит в основные пакеты HotPDF*.dpk, поэтому зависимость ReportBuilder подключается только в проектах, которые явно выбирают это устройство. Smoke test (smoke_pp_hotpdf.dpr) расположен рядом с модулем

 

См. также: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Enhanced EMF/WMF Support