|
TppHotPDFDevice ReportBuilder adapter (
|
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. 2. 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 из временного файла, записанного внутри
Свойства
Title / Author / Subject / Keywords — metadata документа. Когда Title пуст, adapter откатывается к имени отчета или файла, чтобы PDF всегда имел непустой title PDFVersion — уровень спецификации PDF, на который должен быть рассчитан документ. По умолчанию pdf17
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 |