TppHotPDFDevice

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

 

Adaptador FastReport  Adaptador QuickReport  Adaptador DevExpress

Classe de dispositivo ReportBuilder que usa o HotPDF como backend PDF subjacente, em vez do ppPDFDevice do próprio ReportBuilder. Destinada a projetos que já incorporam o 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 PDFACompliance: string;

    property PDFXCompliance: string;

    property Compressed: Boolean;

    property CompressionLevel: TPDFCompressionLevel;

    property RenderMode: TppHotPDFRenderMode;

  end;

 

Descrição

O TppHotPDFDevice desce de TppGraphicsDevice (um nível acima de TppCustomScreenDevice / TppImageDevice), por isso encaixa na cadeia de dispositivos do ReportBuilder quando atribuído a TppReport.PrinterDevice ou usado como dispositivo de publicação num TppPublisher. O DeviceName é reportado como 'HotPDF'. Como o registo de dispositivos no ReportBuilder é feito via ppRptDeviceMap e não via RegisterComponents, não há entrada na palete de componentes do IDE - os chamadores instanciam o TppHotPDFDevice diretamente

 

Cada página que chega através de TppGraphicsDevice.ReceivePage é desenhada num TMetafileCanvas transitório (criado em BeforeRenderPage, finalizado em AfterRenderPage). O TMetafile capturado é depois entregue ao importador de auto-escala ShowEnhancedMetafile do HotPDF:

 

1. StartJob cria a instância THotPDF, define os metadados e chama BeginDoc

2. BeforeRenderPage cria um TMetafile dimensionado para spWidth x spHeight mais um TMetafileCanvas, e define-o como o Canvas herdado

3. RenderPage (herdado) percorre os DrawCommands e encaminha-os através do GraphicsContext para a nossa canvas de metaficheiro

4. AfterRenderPage finaliza o metaficheiro (liberta a canvas), acrescenta uma nova página HotPDF dimensionada para mmWidth x mmHeight (convertidos em pontos PDF) e depois reproduz o metaficheiro via ShowEnhancedMetafile ou emite comandos de desenho suportados de forma nativa quando RenderMode é hprmNativeDrawCommands

5. EndJob chama HotPDF.EndDoc; se a saída for uma Stream, copia os bytes do ficheiro temporário escrito internamente

 

Propriedades

FileName - caminho PDF de destino. Usado a menos que SetOutputStream tenha instalado uma stream

Title / Author / Subject / Keywords - metadados do documento. Quando Title está vazio, o dispositivo recorre a FileName, para que o PDF tenha sempre um título não vazio

PDFVersion - o nível da especificação PDF a que o documento deve obedecer. A predefinição é pdf17

PDFACompliance e PDFXCompliance - encaminham para o PDF do relatório gerado os portões de conformidade com normas do HotPDF. Os chamadores continuam a preparar quaisquer perfis ICC, OutputIntent, tagging ou ativos de pré-impressão necessários através do fluxo de trabalho HotPDF normal antes de dependerem da declaração final de conformidade

Compressed - compressão de streams do HotPDF ligada (predefinição True). Defina False para PDFs de diagnóstico

CompressionLevel - nível FlateDecode. A predefinição é clDefault

RenderMode - a predefinição é hprmPageMetafile, a ponte visual original. Defina hprmNativeDrawCommands para mapear comandos de desenho ReportBuilder suportados diretamente em operações HotPDF de texto, vetores, imagens e links URI. Páginas com comandos não suportados recaem automaticamente na ponte de metaficheiro

SetOutputStream(AStream) - encaminha os bytes do PDF para AStream em vez de gravar em disco. Chamar 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;

  Dev.PDFACompliance := '3B';

  Dev.RenderMode := hprmNativeDrawCommands;

  ppReport1.DeviceType := 'HotPDF';

  ppReport1.PrinterDevice := Dev;

  ppReport1.Print;

finally

  Dev.Free;

end;

 

Capacidades preservadas

Conteúdo vetorial e raster das páginas renderizado pelo pipeline standard de comandos de desenho do ReportBuilder. Strings de texto resolvidas por GDI. A captura de metaficheiro com 200 DPI predefinidos (configurável via PixelsPerInch herdado) dá saída com qualidade de impressão sem ficheiros enormes. O modo de comandos de desenho nativo mapeia diretamente comandos comuns de texto, formas, linhas, imagens e hyperlinks URI em operações de página HotPDF quando a página contém apenas comandos suportados

 

Limitações da ponte de metaficheiro

Como as páginas são capturadas como enhanced metafiles, as funcionalidades PDF específicas do ReportBuilder que exigem informação estrutural (campos AcroForm, destinos nomeados e outlines) não são propagadas. As propriedades de portão PDF/A e PDF/X são encaminhadas para o HotPDF, mas ativos específicos de normas, como perfis de OutputIntent, continuam a ser responsabilidade do chamador

O modo de comandos de desenho nativo cobre atualmente o conjunto comum de comandos de desenho do ReportBuilder e recai deliberadamente na ponte de metaficheiro para páginas com comandos não suportados, como renderizadores personalizados complexos ou gradientes, preservando a saída visual em vez de emitir uma página parcialmente

 

Nota de empacotamento

O dispositivo vive em Lib\Addons\ReportBuilder\ e não faz parte dos pacotes principais HotPDF*.dpk, pelo que a dependência ReportBuilder só é trazida por projetos que optem pelo dispositivo. Um teste smoke (smoke_pp_hotpdf.dpr) vive ao lado da unidade

 

Ver também: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Suporte EMF/WMF melhorado