|
Clasă de dispozitiv ReportBuilder care folosește HotPDF ca backend PDF de bază în locul propriului ppPDFDevice al ReportBuilder. Este destinată proiectelor care încorporează deja HotPDF și doresc un singur backend PDF în întreaga aplicație
Declarație 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;
Descriere
TppHotPDFDevice derivă din TppGraphicsDevice (cu un nivel deasupra TppCustomScreenDevice / TppImageDevice), astfel încât se integrează în lanțul de dispozitive ReportBuilder când este atribuit la TppReport.PrinterDevice sau folosit ca dispozitiv publisher pe un TppPublisher. DeviceName este raportat ca 'HotPDF'. Deoarece înregistrarea dispozitivelor în ReportBuilder se face prin ppRptDeviceMap și nu prin RegisterComponents, nu există o intrare în paleta de componente IDE - apelanții instanțiază direct TppHotPDFDevice
Fiecare pagină care trece prin TppGraphicsDevice.ReceivePage este desenată pe un TMetafileCanvas tranzitoriu (creat în BeforeRenderPage, finalizat în AfterRenderPage). TMetafile-ul capturat este apoi trimis importatorului HotPDF ShowEnhancedMetafile cu autoscalare:
1. StartJob creează instanța THotPDF, setează metadatele și apelează BeginDoc
2. BeforeRenderPage creează un TMetafile dimensionat la spWidth x spHeight plus un TMetafileCanvas și îl setează ca Canvas moștenit
3. RenderPage (moștenit) parcurge DrawCommands și le redirecționează prin GraphicsContext către canvas-ul nostru metafile
4. AfterRenderPage finalizează metafile-ul (eliberează canvas-ul), adaugă o pagină HotPDF nouă dimensionată la mmWidth x mmHeight (convertite în puncte PDF) și redă metafile-ul prin ShowEnhancedMetafile
5. EndJob apelează HotPDF.EndDoc; dacă ieșirea este un Stream, copiază octeții din fișierul temporar scris intern
Proprietăți
FileName - calea țintă a PDF-ului, folosită dacă SetOutputStream nu a instalat un flux
Title / Author / Subject / Keywords - metadatele documentului, iar când Title este gol, dispozitivul revine la FileName astfel încât PDF-ul să aibă mereu un titlu nenul
PDFVersion - nivelul de specificație PDF țintit de document, implicit pdf17
Compressed - compresia fluxului HotPDF activată, implicit True. Puneți False pentru PDF-uri de diagnostic
CompressionLevel - nivelul FlateDecode, implicit clDefault
SetOutputStream(AStream) - redirecționează octeții PDF în AStream în loc să scrie pe disc. Apelați-l înainte ca raportul să declanșeze StartJob
Flux tipic
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;
Capabilități păstrate
Conținut vectorial și raster al paginii randat de fluxul standard de comenzi de desen al ReportBuilder. Șiruri de text rezolvate prin GDI. Capturarea implicită la 200 DPI a metafile-ului (configurabilă prin PixelsPerInch moștenit) oferă ieșire de calitate de tipar fără fișiere uriașe
Limitările podului bazat pe metafile
Deoarece paginile sunt capturate ca enhanced metafile, funcțiile PDF specifice ReportBuilder care au nevoie de informație structurală (câmpuri AcroForm, destinații denumite, schițe, porți de conformitate PDF/A sau PDF/X) nu sunt propagate. Ieșirea este o reproducere vizuală fidelă a ceea ce randă ReportBuilder, nu un PDF structurat
Notă de ambalare
Dispozitivul se află în Lib\Addons\ReportBuilder\ și nu face parte din pachetele principale HotPDF*.dpk, astfel că dependența ReportBuilder este adusă doar de proiectele care optează pentru dispozitiv. Un test smoke (smoke_pp_hotpdf.dpr) se află lângă unitate
Vezi și: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Suport Enhanced EMF/WMF
|