TppHotPDFDevice

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

 

FastReport adapter  QuickReport adapter  DevExpress adapter

Klasa device ReportBuilder, która używa HotPDF jako bazowego backendu PDF zamiast własnego ppPDFDevice ReportBuilder. Przeznaczona dla projektów, które już osadzają HotPDF i chcą jednego backendu PDF w całej aplikacji

 

Deklaracja 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;

 

Opis

TppHotPDFDevice dziedziczy po TppGraphicsDevice (jeden poziom powyżej TppCustomScreenDevice / TppImageDevice), więc pasuje do device chain ReportBuilder po przypisaniu do TppReport.PrinterDevice lub użyciu jako publisher device w TppPublisher. DeviceName zgłasza się jako 'HotPDF'. Ponieważ rejestracja device w ReportBuilder odbywa się przez ppRptDeviceMap, a nie RegisterComponents, nie ma wpisu w palecie komponentów IDE - callers tworzą TppHotPDFDevice bezpośrednio

 

Każda strona przechodząca przez TppGraphicsDevice.ReceivePage jest rysowana na tymczasowym TMetafileCanvas (tworzonym w BeforeRenderPage i finalizowanym w AfterRenderPage). Przechwycony TMetafile jest następnie przekazywany do auto-scaling importer ShowEnhancedMetafile HotPDF:

 

1. StartJob tworzy instancję THotPDF, ustawia metadata i wywołuje BeginDoc

2. BeforeRenderPage tworzy TMetafile o rozmiarze spWidth x spHeight oraz TMetafileCanvas i ustawia go jako odziedziczony Canvas

3. RenderPage (odziedziczone) przechodzi przez DrawCommands i kieruje je przez GraphicsContext na nasz metafile canvas

4. AfterRenderPage finalizuje metafile (zwalnia canvas), dodaje nową stronę HotPDF o rozmiarze mmWidth x mmHeight (przeliczonym na PDF points) i odtwarza metafile przez ShowEnhancedMetafile

5. EndJob wywołuje HotPDF.EndDoc; jeśli output jest Stream, kopiuje bytes z pliku tymczasowego zapisanego wewnętrznie

 

Właściwości

FileName - target PDF path. Used unless SetOutputStream has installed a stream.

Title / Author / Subject / Keywords - document metadata. Gdy Title jest puste, device używa fallbacku FileName, więc PDF zawsze ma niepusty tytuł

PDFVersion - poziom specyfikacji PDF, w który ma celować dokument. Domyślnie pdf17

Compressed - HotPDF stream compression on (default True). Set False for diagnostic PDFs.

CompressionLevel - FlateDecode level. Defaults to clDefault.

SetOutputStream(AStream) - kieruje PDF bytes do AStream zamiast zapisywać na dysk. Wywołaj przed uruchomieniem StartJob przez report

 

Typowy przepływ pracy

 

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;

 

Zachowane możliwości

Zawartość strony vector i raster renderowana przez standardowy draw-command pipeline ReportBuilder. GDI-resolved text strings. Domyślne 200 DPI metafile capture (konfigurowalne przez odziedziczone PixelsPerInch) daje jakość druku bez ogromnych plików

 

Ograniczenia mostka metafile

Ponieważ strony są przechwytywane jako enhanced metafiles, specyficzne dla ReportBuilder funkcje PDF wymagające informacji strukturalnych (AcroForm fields, named destinations, outlines, PDF/A lub PDF/X conformance gates) nie są propagowane. Wynik jest wierną wizualną reprodukcją tego, co renderuje ReportBuilder, a nie strukturalnym PDF

 

Uwaga o pakietowaniu

Device znajduje się w Lib\Addons\ReportBuilder\ i nie jest częścią głównych pakietów HotPDF*.dpk, więc zależność ReportBuilder jest pobierana tylko przez projekty, które świadomie włączają device. Smoke test (smoke_pp_hotpdf.dpr) znajduje się obok unitu

 

Zobacz też: TfrxHotPDFExport, TQRHotPDFExportFilter, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Enhanced EMF/WMF Support