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

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

API correlate