|
Classe de périphérique ReportBuilder qui utilise HotPDF comme backend PDF sous-jacent au lieu du ppPDFDevice natif de ReportBuilder. Destinée aux projets qui intègrent déjà HotPDF et veulent un seul backend PDF pour toute l’application
Déclaration 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;
Description
TppHotPDFDevice dérive de TppGraphicsDevice (un niveau au-dessus de TppCustomScreenDevice / TppImageDevice), ce qui lui permet de s’insérer dans la chaîne de périphériques ReportBuilder lorsqu’il est assigné à TppReport.PrinterDevice ou utilisé comme périphérique d’édition sur un TppPublisher. DeviceName est signalé comme 'HotPDF'. Comme l’enregistrement de périphérique dans ReportBuilder se fait via ppRptDeviceMap plutôt que RegisterComponents, il n’y a pas d’entrée dans la palette de composants de l’IDE - les appelants instancient TppHotPDFDevice directement
Chaque page reçue via TppGraphicsDevice.ReceivePage est dessinée sur un TMetafileCanvas temporaire (créé dans BeforeRenderPage, finalisé dans AfterRenderPage). Le TMetafile capturé est ensuite transmis à l’importeur à mise à l’échelle automatique ShowEnhancedMetafile de HotPDF :
1. StartJob crée l’instance THotPDF, définit les métadonnées et appelle BeginDoc
2. BeforeRenderPage crée un TMetafile dimensionné selon spWidth x spHeight plus un TMetafileCanvas, puis l’affecte au Canvas hérité
3. RenderPage (hérité) parcourt les DrawCommands et les achemine via le GraphicsContext vers notre canvas de metafile
4. AfterRenderPage finalise le metafile (canvas libéré), ajoute une nouvelle page HotPDF dimensionnée selon mmWidth x mmHeight (converties en points PDF), puis joue le metafile via ShowEnhancedMetafile
5. EndJob appelle HotPDF.EndDoc; si la sortie est un flux, copie les octets depuis le fichier temporaire écrit en interne
Propriétés
FileName - chemin PDF cible. Utilisé sauf si SetOutputStream a installé un flux
Title / Author / Subject / Keywords - métadonnées du document. Quand Title est vide, le périphérique retombe sur FileName afin que le PDF ait toujours un titre non vide
PDFVersion - niveau de spécification PDF que le document doit viser. Valeur par défaut pdf17
Compressed - compression de flux HotPDF activée (True par défaut). Mettre False pour les PDF de diagnostic
CompressionLevel - niveau FlateDecode. Valeur par défaut clDefault
SetOutputStream(AStream) - achemine les octets PDF vers AStream au lieu d’écrire sur le disque. À appeler avant que le rapport déclenche StartJob
Flux de travail type
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;
Capacités préservées
Contenu vectoriel et raster des pages rendu par le pipeline standard de commandes de dessin de ReportBuilder. Chaînes de texte résolues par GDI. La capture metafile par défaut à 200 DPI (configurable via le PixelsPerInch hérité) fournit une sortie de qualité impression sans fichiers énormes
Limites du pont metafile
Comme les pages sont capturées sous forme d’Enhanced Metafiles, les fonctionnalités PDF spécifiques à ReportBuilder qui exigent des informations structurelles (champs AcroForm, destinations nommées, signets, contrôles de conformité PDF/A ou PDF/X) ne sont pas propagées. La sortie est une reproduction visuelle fidèle de ce que rend ReportBuilder, pas un PDF structuré
Note de packaging
Le périphérique se trouve dans Lib\Addons\ReportBuilder\ et ne fait pas partie des packages principaux HotPDF*.dpk, donc la dépendance ReportBuilder n’est ajoutée que par les projets qui choisissent ce périphérique. Un smoke test (smoke_pp_hotpdf.dpr) se trouve à côté de l’unité
Voir aussi: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Prise en charge EMF/WMF améliorée
|