|
Filtr eksportu QuickReport, który używa HotPDF jako bazowego backendu PDF zamiast własnego QRPDFFilter QuickReport. Przeznaczony dla projektów, które już osadzają HotPDF i chcą jednego backendu PDF w całej aplikacji
Deklaracja Delphi:
type
TQRHotPDFExportFilter = class(TQRExportFilter)
public
constructor Create(Filename: string); override;
procedure SetOutputStream(AStream: TStream);
property Title, Author, Subject, Keywords: string;
property PDFVersion: TPDFVersType;
property Compressed: Boolean;
property CompressionLevel: TPDFCompressionLevel;
end;
Opis
TQRHotPDFExportFilter dziedziczy po TQRExportFilter, więc pasuje do zwykłego workflow MyReport.ExportToFilter(MyExporterInstance) bez zmian w rdzeniu QuickReport. Ponieważ TQRExportFilter nie jest potomkiem TComponent (to zwykła klasa w projekcie QuickReport), nie ma rejestracji komponentu IDE - callers tworzą TQRHotPDFExportFilter bezpośrednio przez Create('out.pdf')
QuickReport renderuje każdą przygotowaną stronę do TMetafile cacheowanego w QRPrinter.PageList. Zamiast ponownie implementować cały zestaw callbacków per-component TextOut / AcceptGraphic / AcceptBand, adapter ignoruje je (no-op overrides) i zbiera metafiles per-page w Finish:
1. Start(PaperWidth, PaperHeight, Font) - tworzy instancję THotPDF, ustawia metadata, wywołuje BeginDoc i zapisuje (PaperWidth, PaperHeight), aby Finish mogło poprawnie ukształtować strony
2. NewPage / EndPage / TextOut / AcceptGraphic - no-op (metafile już zawiera wyrenderowaną zawartość)
3. Finish - dla każdego cacheowanego metafile QRPrinter.PageList[i] dodaje (lub ponownie używa) stronę HotPDF o rozmiarze PaperWidth / PaperHeight w points i wywołuje ShowEnhancedMetafile. Następnie EndDoc i zwolnienie
Właściwości
Title / Author / Subject / Keywords - document metadata. Gdy Title jest puste, adapter używa fallbacku Filename, więc PDF zawsze ma niepusty tytuł. Ustaw przed wywołaniem ExportToFilter
PDFVersion - poziom specyfikacji PDF, w który ma celować dokument. Domyślnie pdf17
Compressed - kompresja streamów HotPDF włączona (domyślnie True). Ustaw False dla diagnostycznych PDFs
CompressionLevel - poziom FlateDecode. Domyślnie clDefault
SetOutputStream(AStream) - kieruje PDF bytes do AStream zamiast zapisywać na dysk. Wywołaj przed ExportToFilter. Wewnętrznie używany jest plik tymczasowy, ponieważ HotPDF zapisuje przy EndDoc; bytes są streamowane z powrotem w Finish
Typowy przepływ pracy
Filter := TQRHotPDFExportFilter.Create('Report.pdf');
try
Filter.Title := 'Monthly Statement';
Filter.PDFVersion := pdf17;
QuickRep1.ExportToFilter(Filter);
finally
Filter.Free;
end;
Zachowane możliwości
Zawartość strony vector i raster renderowana przez standardowy preview / printer pipeline QuickReport. GDI-resolved text strings. Rozmiar strony podąża za PaperWidth / PaperHeight przekazanymi do Start przez QuickReport
Ograniczenia mostka metafile
Ponieważ strony są przechwytywane jako enhanced metafiles, specyficzne dla QuickReport 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 QuickReport, a nie strukturalnym PDF
Uwaga o pakietowaniu
Adapter znajduje się w Lib\Addons\QuickReport\ i nie jest częścią głównych pakietów HotPDF*.dpk, więc zależność QuickReport jest pobierana tylko przez projekty, które świadomie włączają adapter. Smoke test (smoke_qr_hotpdf.dpr) znajduje się obok unitu
Zobacz też: TfrxHotPDFExport, TppHotPDFDevice, dxHotPDFExportReportLink, THPDFPage.ShowMetafile, Enhanced EMF/WMF Support
|