Deklaratyvus išdėstymo DOM
HPDFLayoutDOM kuria pakartotinai naudojamus dokumento komponentus per THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, valdomus perpildymo fragmentus ir ImmediateFlushLayout
Dokumento ir sekcijų sudėtis
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 valdo savo sekcijas, kiekviena THPDFDOMSection valdo savo turinį, antraštę, poraštę ir stilių, o kiekvienas krūvas arba konteineris valdo prie jo pridėtus komponentus
THPDFDOMRenderer.Render pradeda ir baigia tikslinį dokumentą, sukuria naują puslapį kiekvienai naujai sekcijai, kartoja sekcijos baldus tęsinių puslapiuose ir grąžina puslapio, išdėstymo, padalijimo, baldų, struktūros, žymėto turinio, artefakto ir maksimalaus tęsinio statistiką
Prieš kviesdami Render nustatykite visus THotPDF išvesties, glaudinimo, atitikties, sluoksnio ir momentinio išleidimo parinktis
GenerateStructure pagal numatymą yra True, todėl atvaizduotojas taip pat kuria tęsiniui saugų loginės struktūros medį ir naudoja THPDFDOMDocument.Language, kai tikslinis dokumentas neturi kalbos
Komponentai
THPDFDOMTextapgaubia Unicode tekstą, talpina eilučių ribas pagal plotį ir paveldėtą teksto metriką ir skaido per šaltinio simbolių intervalus nenukopijuodamas šaltinio tekstoTHPDFDOMSpacerrezervuoja vertikalią erdvę ir gali skaidytis per puslapiusTHPDFDOMStackišdėsto valdomus antrinius elementus vertikaliai su paveldėtu užpildymu ir tarpaisTHPDFDOMContainerprideda stilizuotą rėmelį aplink vieną valdomą antrinį elementą ir perduoda padalijimo tęsiniusTHPDFDOMTableišsprendžia svorius pagal stulpelius, piešia stilizuotas eilutes ir langelius ir kartoja pirmaujančias antraštės eilutes tęsinių puslapiuoseTHPDFDOMListkuria sunumeruotus arba nesunumeruotus sąrašo elementus su etiketės ir turinio komponentaisTHPDFDOMImagevaldo klonuotą grafiką, išsprendžia aiškius matmenis ir suteikia paveikslo semantiką bei glaudinimo kontrolę
Visi komponentai atskleidžia stabilias Name, Path, Style, Clone, Measure, Draw ir Split sutartis bei semantinio vaidmens, kalbos, alternatyvaus teksto, pakaitinio teksto, išplėtimo teksto ir artefakto perrašus
Aukščiausio lygio turinio peržvalga yra tiesinė ir neklonuoja komponentų; teksto ir lentelių tęsiniai išlaiko intervalo arba eilutės pjūvio metaduomenis, o ne nukopijuoja visą turinio medį
Stiliaus paveldėjimas
THPDFDOMStyle išsprendžia šrifto pavadinimą, dydį, stilius, teksto spalvą, foną, kraštinę, užpildymą, tarpus ir eilutės aukštį per savo pirminių elementų grandinę
Sekcijos stilius yra jos turinio ir baldų pirminis, krūvo arba konteinerio stilius yra jos antrinių elementų pirminis, o lentelės stilius teka per eilutes į langelius
Tik aiškiai priskirtos reikšmės perrašo pirminį; Clear pašalina vietinius priskyrimus ir pirminio nuorodą, o Assign nukopijuoja vietinius priskyrimus nenukopijuodamas nuosavybės arba kilmės
Pirminių grandinės gilesnės nei 64 lygiai atmetamos kaip cikliškos arba neribotos
Pakartotinai naudojamų komponentų gamyklos
THPDFDOMComponentFactory yra anoniminė funkcija, kuri kiekvieno iškvietimo metu kuria vieną iškvietėjo valdomą THPDFDOMComponent egzempliorių
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Gamyklų pavadinimai nepriklauso nuo raidžių dydžio ir yra unikalūs, kiekvienas kvietimas turi grąžinti naują komponento egzempliorių, o gaunantis konteineris prisiima nuosavybę po Add
Naudokite SetHeaderClone, SetFooterClone arba Clone, kai vienas deklaruotas komponentas turi būti pakartotinai naudojamas keliose nuosavybės vietose
Lentelės su kartojama antrašte
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);
Antraštės eilutės turi būti gretimos ir eiti prieš turinio eilutes, teigiami stulpelių svoriai padalija turimą plotį, o eilučių aukščiai yra aiškios teigiamos reikšmės
Kai RepeatHeaders yra tiesa, padalijimui reikia vietos visoms pirmaujančioms antraštės eilutėms ir bent vienai turinio eilutei, todėl išvengiama tik antraštės tęsinių puslapių
Paginacija ir gedimo ribos
Atvaizduotojas pirma iš naujo išmatuoja kiekvieną komponentą pagal likusį turinio stačiakampį, kai įmanoma perkelia neskaidomą mažiausią fragmentą į naują puslapį ir perduoda kiekvieną teisingą padalijimą PlaceLayoutElement
Elementas, kuris netelpa į tuščią turinio puslapį, sukelia išimtį su savo stabiliu elemento keliu, o ne tyliai išmeta turinį
MaximumContinuationDepth pagal numatymą yra 100 000 ir riboja nepageidaujamus komponentus, kurie pakartotinai grąžina nejudantį tęsinį
Sekcijos puslapio matmenys turi būti teigiami, paraštės ir baldų tarpai negali būti neigiami, o antraštės bei poraštės geometrija turi palikti teigiamą turinio stačiakampį
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());
Sugeneruotas HPDFLayoutDOM.hpp eksportuoja tuos pačius dokumento, stiliaus, komponento, lentelės, sekcijos, atvaizduotojo ir statistikos paviršius