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
THPDFDOMTextîmpachetează text Unicode, memorează în cache granițele liniilor după lățime și metricele de text moștenite și împarte prin intervale de caractere sursă fără a copia textul sursăTHPDFDOMSpacerrezervă spațiu vertical și se poate împărți între paginiTHPDFDOMStackaranjează vertical copiii deținuți cu padding și spațiere moșteniteTHPDFDOMContaineradaugă o casetă stilizată în jurul unui copil deținut și redirecționează continuările împărțiriiTHPDFDOMTablerezolvă coloanele ponderate, desenează rânduri și celule stilizate și repetă rândurile de antet inițiale pe paginile de continuareTHPDFDOMListcreează elemente de listă numerotate sau nenumerotate cu componente de etichetă și corpTHPDFDOMImagedeține un grafic clonat, rezolvă dimensiunile explicite și oferă semantică de figură și control al compresiei
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