DOM de layout declarativ

HPDFLayoutDOM construiește componente de document reutilizabile peste THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, fragmente de overflow deținute și ImmediateFlushLayout

Compoziția documentului și a secțiunilor

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 deține secțiunile sale, fiecare THPDFDOMSection deține corpul, antetul, subsolul și stilul său, iar fiecare stivă sau container deține componentele atașate

THPDFDOMRenderer.Render începe și încheie documentul țintă, creează o pagină nouă pentru fiecare secțiune nouă, repetă elementele de mobilier ale secțiunii pe paginile de continuare și returnează statistici de pagină, plasare, împărțire, mobilier, structură, conținut marcat, artefact și continuare maximă

Setați toate opțiunile THotPDF de ieșire, compresie, conformitate, strat și golire imediată înainte de a apela Render

GenerateStructure are implicit True, astfel încât renderer-ul construiește și un arbore de structură logică sigur la continuare și folosește THPDFDOMDocument.Language când ținta nu are limbă

Components

Toate componentele expun contracte stabile Name, Path, Style, Clone, Measure, Draw și Split, plus rol semantic, limbă, text alternativ, text de înlocuire, text de expansiune și suprascrieri de artefact

Traversarea corpului de nivel superior este liniară și nu clonează componente; continuările de text și tabel rețin metadate de interval sau de felie de rând în loc să copieze arborele complet de conținut

Moștenirea stilurilor

THPDFDOMStyle rezolvă numele fontului, dimensiunea, stilurile, culoarea textului, fundalul, bordura, padding-ul, spațierea și înălțimea liniei prin lanțul său de părinți

Stilul unei secțiuni este părintele corpului și al mobilierului său, stilul unei stive sau al unui container este părintele copiilor săi, iar stilul de tabel curge prin rânduri către celule

Doar valorile atribuite explicit suprascriu părintele; Clear elimină atribuirile locale și legătura cu părintele, în timp ce Assign copiază atribuirile locale fără a copia proprietatea sau ascendența

Lanțurile de părinți mai adânci de 64 de niveluri sunt respinse ca ciclice sau nemărginite

Fabrice de componente reutilizabile

THPDFDOMComponentFactory este o funcție anonimă care creează o instanță THPDFDOMComponent deținută de apelant la fiecare invocare

Document.RegisterComponent('notice',
  function: THPDFDOMComponent
  begin
    Result := THPDFDOMContainer.Create(
      THPDFDOMText.Create('Reusable notice'));
  end);

Section.Body.Add(Document.CreateComponent('notice'));

Numele de fabrică sunt insensibile la majuscule și unice, fiecare apel trebuie să returneze o instanță nouă de componentă, iar containerul care primește preia proprietatea după Add

Folosiți SetHeaderClone, SetFooterClone sau Clone când o componentă declarată trebuie reutilizată în mai multe locuri de proprietate

Tabele cu antet repetat

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

Rândurile de antet trebuie să fie contigue și să preceadă rândurile de corp, ponderile pozitive de coloană împart lățimea disponibilă, iar înălțimile de rând sunt valori pozitive explicite

Când RepeatHeaders este true, o împărțire necesită spațiu pentru toate rândurile de antet inițiale și cel puțin un rând de corp, prevenind paginile de continuare doar cu antet

Paginație și granițe de eșec

Renderer-ul remăsoară mai întâi fiecare componentă față de dreptunghiul rămas al corpului, mută un fragment minim neseparabil pe o pagină nouă când este posibil și deleagă fiecare împărțire validă către PlaceLayoutElement

Un element care nu încape pe o pagină de corp goală ridică o excepție cu calea sa stabilă de element în loc să arunce conținutul silențios

MaximumContinuationDepth are implicit 100.000 și mărginește componentele malformate care returnează în mod repetat o continuare fără progres

Dimensiunile paginii secțiunii trebuie să fie pozitive, marginile și spațiile de mobilier nu pot fi negative, iar geometria antetului plus subsolului trebuie să lase un dreptunghi de corp pozitiv

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());

HPDFLayoutDOM.hpp generat exportă aceleași suprafețe de document, stil, componentă, tabel, secțiune, renderer și statistici

API-uri conexe