DOM di Layout Dichiarativo
HPDFLayoutDOM costruisce componenti di documento riutilizzabili sopra THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, frammenti di overflow di proprietà e ImmediateFlushLayout
Composizione di documento e sezioni
Document := THPDFDOMDocument.Create;
Renderer := THPDFDOMRenderer.Create;
try
Section := Document.AddSection;
Section.PageWidth := 595.28;
Section.PageHeight := 841.89;
Section.Header := THPDFDOMText.Create('Quarterly report');
Section.Footer := THPDFDOMText.Create('Confidential');
Section.Body.Style.Padding := 12;
Section.Body.Style.Spacing := 8;
Section.Body.AddText(BodyText, 'Narrative');
PDF.OutputStream := Output;
PDF.ImmediateFlushLayout := True;
Statistics := Renderer.Render(Document, PDF);
finally
Renderer.Free;
Document.Free;
end;
THPDFDOMDocument possiede le proprie sezioni, ogni THPDFDOMSection possiede body, header, footer e stile, e ogni stack o contenitore possiede i componenti a esso collegati
THPDFDOMRenderer.Render avvia e chiude il documento di destinazione, crea una pagina nuova per ogni sezione, ripete l'arredamento della sezione sulle pagine di continuazione e restituisce statistiche su pagine, posizionamento, split, arredamento, struttura, marked-content, artifact e profondità massima di continuazione
Impostare tutte le opzioni THotPDF di output, compressione, conformance, layer e immediate-flush prima di chiamare Render
GenerateStructure vale True per default, quindi il renderer costruisce anche un albero di struttura logica sicuro per le continuazioni e usa THPDFDOMDocument.Language quando la destinazione non ha una lingua
Componenti
THPDFDOMTextincapsula testo Unicode, mette in cache i confini di riga per larghezza e metriche di testo ereditate e spezza tramite intervalli di caratteri sorgente senza copiare il testo sorgenteTHPDFDOMSpacerriserva spazio verticale e può dividersi tra pagineTHPDFDOMStackdisponde verticalmente i figli di cui è proprietario con padding e spacing ereditatiTHPDFDOMContaineraggiunge un box stilizzato attorno a un unico figlio di cui è proprietario e inoltra le continuazioni di splitTHPDFDOMTablerisolve le colonne pesate, disegna righe e celle stilizzate e ripete le righe di intestazione iniziali sulle pagine di continuazioneTHPDFDOMListcrea voci di elenco numerate o non numerate con componenti di etichetta e corpoTHPDFDOMImagepossiede una copia clonata della grafica, risolve le dimensioni esplicite e offre semantica di figura e controllo della compressione
Tutti i componenti espongono contratti stabili Name, Path, Style, Clone, Measure, Draw e Split, più ruolo semantico, lingua, testo alternativo, testo di sostituzione, testo di espansione e override artifact
La traversata del body di primo livello è lineare e non clona componenti; le continuazioni di testo e tabella conservano metadati di intervallo o di porzione di riga invece di copiare l'intero albero di contenuto
Ereditarietà dello stile
THPDFDOMStyle risolve nome del font, dimensione, stili, colore del testo, sfondo, bordo, padding, spacing e interlinea attraverso la catena dei padri
Lo stile di una sezione è il padre del suo body e del suo arredamento, lo stile di uno stack o contenitore è il padre dei suoi figli, e lo stile della tabella scorre dalle righe alle celle
Solo i valori assegnati esplicitamente sovrascrivono il padre; Clear rimuove le assegnazioni locali e il collegamento al padre, mentre Assign copia le assegnazioni locali senza copiare proprietà o ascendenza
Catene di padri più profonde di 64 livelli vengono rifiutate come cicliche o illimitate
Factory di componenti riutilizzabili
THPDFDOMComponentFactory è una funzione anonima che crea un'istanza THPDFDOMComponent di proprietà del chiamante per ogni invocazione
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
I nomi delle factory sono case-insensitive e univoci, ogni chiamata deve restituire una nuova istanza del componente, e il contenitore che la riceve ne prende possesso dopo Add
Usare SetHeaderClone, SetFooterClone o Clone quando un componente dichiarato deve essere riutilizzato in più siti di proprietà
Tabelle con intestazioni ripetute
Table := THPDFDOMTable.Create('Orders');
Table.AddColumn(1);
Table.AddColumn(3);
Header := Table.AddRow(18, True);
Header[0].Text := 'ID';
Header[1].Text := 'Description';
Row := Table.AddRow(22);
Row[0].Text := '1001';
Row[1].Text := 'Bounded streaming layout';
Section.Body.Add(Table);
Le righe di intestazione devono essere contigue e precedere le righe del corpo, i pesi positivi delle colonne dividono la larghezza disponibile, e le altezze delle righe sono valori positivi espliciti
Quando RepeatHeaders è true, uno split richiede spazio per tutte le righe di intestazione iniziali e per almeno una riga del corpo, impedendo pagine di continuazione con sole intestazioni
Impaginazione e confini di fallimento
Il renderer prima rimisura ogni componente rispetto al rettangolo del body rimanente, sposta su una pagina nuova il frammento minimo non divisibile quando possibile, e delega ogni split valido a PlaceLayoutElement
Un elemento che non entra in una pagina body vuota solleva un'eccezione con il suo percorso di elemento stabile invece di scartare il contenuto in silenzio
MaximumContinuationDepth vale 100.000 per default e delimita i componenti malformati che restituiscono ripetutamente una continuazione senza progresso
Le dimensioni di pagina della sezione devono essere positive, margini e gap dell'arredamento non possono essere negativi, e la geometria di header più footer deve lasciare un rettangolo body positivo
C++Builder
std::unique_ptr<THPDFDOMDocument> document(new THPDFDOMDocument());
THPDFDOMSection* section = document->AddSection();
section->Header = new THPDFDOMText(L"Report", "Header");
section->Body->AddText(L"Declarative content", "BodyText");
std::unique_ptr<THPDFDOMRenderer> renderer(new THPDFDOMRenderer());
THPDFDOMRenderStatistics statistics =
renderer->Render(document.get(), pdf.get());
L'HPDFLayoutDOM.hpp generato esporta le stesse superfici di documento, stile, componente, tabella, sezione, renderer e statistiche