|
Clase de dispositivo de ReportBuilder que usa HotPDF como backend PDF subyacente en lugar del propio ppPDFDevice de ReportBuilder. Pensado para proyectos que ya integran HotPDF y quieren un único backend PDF en toda la aplicación
Declaración en 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;
Descripción
TppHotPDFDevice desciende de TppGraphicsDevice (un nivel por encima de TppCustomScreenDevice / TppImageDevice), así que se integra en la cadena de dispositivos de ReportBuilder cuando se asigna a TppReport.PrinterDevice o se usa como dispositivo publicador en un TppPublisher. DeviceName se informa como 'HotPDF'. Como el registro de dispositivos en ReportBuilder se hace mediante ppRptDeviceMap y no con RegisterComponents, no hay entrada en la paleta de componentes del IDE; los llamadores instancian TppHotPDFDevice directamente
Cada página que pasa por TppGraphicsDevice.ReceivePage se dibuja en un TMetafileCanvas transitorio (creado en BeforeRenderPage, finalizado en AfterRenderPage). Luego el TMetafile capturado se envía al importador de escalado automático ShowEnhancedMetafile de HotPDF:
1. StartJob crea la instancia THotPDF, establece los metadatos y llama a BeginDoc
2. BeforeRenderPage crea un TMetafile con tamaño spWidth x spHeight más un TMetafileCanvas, y lo asigna al Canvas heredado
3. RenderPage (heredado) recorre los DrawCommands y los canaliza a través de GraphicsContext hacia nuestro lienzo de metarchivo
4. AfterRenderPage finaliza el metarchivo (libera el lienzo), agrega una nueva página HotPDF con tamaño mmWidth x mmHeight (convertido a puntos PDF) y reproduce el metarchivo mediante ShowEnhancedMetafile
5. EndJob llama a HotPDF.EndDoc; si la salida es un Stream, copia bytes del archivo temporal escrito internamente
Propiedades
FileName - ruta PDF de destino. Se usa salvo que SetOutputStream haya instalado un stream
Title / Author / Subject / Keywords - metadatos del documento. Cuando Title está vacío, el dispositivo recurre a FileName para que el PDF siempre tenga un título no vacío
PDFVersion - nivel de especificación PDF al que debe apuntar el documento. El valor predeterminado es pdf17
Compressed - compresión de flujo HotPDF activada (True predeterminado). Ponga False para PDFs de diagnóstico
CompressionLevel - nivel FlateDecode. El valor predeterminado es clDefault
SetOutputStream(AStream) - enruta los bytes del PDF a AStream en lugar de escribirlos en disco. Llámelo antes de que el informe dispare StartJob
Flujo de trabajo 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
Contenido de página vectorial y rasterizado renderizado por la canalización estándar de comandos de dibujo de ReportBuilder. Cadenas de texto resueltas por GDI. La captura de metarchivo a 200 DPI por defecto (configurable mediante el PixelsPerInch heredado) da salida con calidad de impresión sin archivos enormes
Limitaciones del puente de metarchivos
Como las páginas se capturan como metarchivos mejorados, no se propagan las funciones PDF específicas de ReportBuilder que requieren información estructural (campos AcroForm, destinos con nombre, esquemas, controles de conformidad PDF/A o PDF/X). La salida es una reproducción visual fiel de lo que renderiza ReportBuilder, no un PDF estructurado
Nota de empaquetado
El dispositivo vive en Lib\Addons\ReportBuilder\ y no forma parte de los paquetes principales HotPDF*.dpk, así que la dependencia de ReportBuilder solo entra en los proyectos que optan por este dispositivo. Hay una prueba de humo (smoke_pp_hotpdf.dpr) junto a la unidad
Ver también: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Soporte EMF/WMF mejorado
|