|
TppHotPDFDevice ReportBuilder adapter (
|
FastReport adapter QuickReport adapter DevExpress adapter |
|
Classe de dispositivo ReportBuilder que usa HotPDF como backend PDF subjacente em vez do ppPDFDevice próprio do ReportBuilder. Destina-se a projetos que já incorporam HotPDF e querem um único backend PDF em toda a aplicação
Declaração Delphi: 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;
Descrição TppHotPDFDevice descende de TppGraphicsDevice (um nível acima de TppCustomScreenDevice / TppImageDevice), portanto encaixa na cadeia de dispositivos do ReportBuilder quando atribuído a TppReport.PrinterDevice ou usado como dispositivo publicador em um TppPublisher. DeviceName é relatado como 'HotPDF'. Como o registro de dispositivo no ReportBuilder é feito via ppRptDeviceMap e não por RegisterComponents, não há entrada na paleta de componentes da IDE; os chamadores instanciam TppHotPDFDevice diretamente
Cada página que passa por TppGraphicsDevice.ReceivePage é desenhada em um TMetafileCanvas transitório (criado em BeforeRenderPage, finalizado em AfterRenderPage). O TMetafile capturado é então enviado ao importador com autoescala ShowEnhancedMetafile do HotPDF:
1. 2. 3. RenderPage (herdado) percorre os DrawCommands e os roteia pelo GraphicsContext para o nosso canvas de metafile 4. AfterRenderPage finaliza o metafile (libera o canvas), adiciona uma nova página HotPDF dimensionada para mmWidth x mmHeight (convertidos para pontos PDF) e reproduz o metafile via ShowEnhancedMetafile 5. EndJob chama HotPDF.EndDoc; se a saída for um Stream, copia bytes do arquivo temporário gravado internamente
Propriedades
Title / Author / Subject / Keywords - metadados do documento. Quando Title está vazio, o dispositivo usa FileName como fallback para que o PDF sempre tenha um título não vazio
SetOutputStream(AStream) - direciona os bytes do PDF para AStream em vez de gravar em disco. Chame antes de o relatório disparar StartJob
Fluxo de trabalho típico
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;
Capacidades preservadas Conteúdo vetorial e raster de página renderizado pelo pipeline padrão de draw-command do ReportBuilder. Strings de texto resolvidas por GDI. A captura de metafile padrão de 200 DPI (configurável via PixelsPerInch herdado) oferece saída com qualidade de impressão sem arquivos enormes
Limitações da ponte de metafile Como as páginas são capturadas como metafiles avançados, recursos PDF específicos do ReportBuilder que exigem informação estrutural (campos AcroForm, destinos nomeados, outlines, gates de conformidade PDF/A ou PDF/X) não são propagados. A saída é uma reprodução visual fiel do que o ReportBuilder renderiza, não um PDF estruturado
Nota de empacotamento O dispositivo fica em Lib\Addons\ReportBuilder\ e não faz parte dos pacotes principais HotPDF*.dpk, portanto a dependência ReportBuilder só é puxada por projetos que optam pelo dispositivo. Um teste smoke (smoke_pp_hotpdf.dpr) fica junto da unit
Veja também: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Enhanced EMF/WMF Support |