Декларативен layout DOM
HPDFLayoutDOM изгражда преизползваеми документни компоненти върху THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, притежавани overflow фрагменти и ImmediateFlushLayout
Композиция на документ и секции
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 притежава секциите си, всяка THPDFDOMSection притежава body, header, footer и style, а всеки stack или container притежава закачените му компоненти
THPDFDOMRenderer.Render стартира и завършва целевия документ, създава свежа страница за всяка нова секция, повтаря секционните furniture елементи на продължителните страници и връща статистика за страници, поставяне, разделяне, furniture, структура, marked-content, artifact и максимум продължения
Задайте всички THotPDF опции за изход, компресия, съответствие, слоеве и immediate-flush, преди да извикате Render
GenerateStructure е True по подразбиране, така че renderer-ът изгражда и устойчиво на продължения логическо дърво на структурата и ползва THPDFDOMDocument.Language, когато целта няма език
Компоненти
THPDFDOMTextобгръща Unicode текст, кешира граници на редове по ширина и наследени text метрики и разделя чрез source символни диапазони, без да копира source текстаTHPDFDOMSpacerрезервира вертикално пространство и може да се разделя между странициTHPDFDOMStackподрежда притежаваните си наследници вертикално с наследени padding и spacingTHPDFDOMContainerдобавя стилизирана кутия около един притежаван наследник и препраща split продълженияTHPDFDOMTableразпределя претеглени колони, рисува стилизирани редове и клетки и повтаря водещите header редове на продължителните странициTHPDFDOMListсъздава номерирани или неномерирани list елементи с label и body компонентиTHPDFDOMImageпритежава клонирана графика, разрешава изрични размери и дава figure семантика и контрол на компресията
Всички компоненти излагат стабилни договорки Name, Path, Style, Clone, Measure, Draw и Split, плюс семантична роля, език, алтернативен текст, replacement текст, expansion текст и artifact замествания
Обхождането на body от най-високо ниво е линейно и не клонира компоненти; текстовите и табличните продължения пазат metadata за диапазон или дял от ред, вместо да копират пълното дърво на съдържанието
Наследяване на стил
THPDFDOMStyle разрешава име на шрифт, размер, стилове, цвят на текста, фон, рамка, padding, spacing и височина на реда през веригата си от родители
Стилът на секцията е родител на body и furniture-а ѝ, стилът на stack или container е родител на наследниците му, а табличният стил тече през редовете към клетките
Само изрично зададените стойности презаписват родителя; Clear премахва локалните задания и връзката към родителя, а Assign копира локалните задания, без да копира собственост или родство
Родителски вериги, по-дълбоки от 64 нива, се отхвърлят като циклични или неограничени
Фабрики за преизползваеми компоненти
THPDFDOMComponentFactory е анонимна функция, която създава по една инстанция THPDFDOMComponent, притежавана от извикващия, при всяко извикване
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Имената на фабриките не отчитат разлика в регистъра и са уникални, всяко извикване трябва да върне нова инстанция на компонент, а приемащият container поема собствеността след Add
Ползвайте SetHeaderClone, SetFooterClone или Clone, когато един обявен компонент трябва да се преизползва на няколко места с собственост
Таблици с повтарящи се header-и
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);
Header редовете трябва да са последователни и да предхождат body редовете, положителните тегла на колоните делят наличната ширина, а височините на редовете са изрични положителни стойности
Когато RepeatHeaders е true, разделяне изисква място за всички водещи header редове и поне един body ред, за да не се появяват продължителни страници само с header
Пагинация и граници на провал
Renderer-ът първо преизмерва всеки компонент спрямо оставащия body правоъгълник, премества минимален неделим фрагмент на свежа страница, когато е възможно, и делегира всяко валидно разделяне на PlaceLayoutElement
Елемент, който не се събира на празна body страница, вдига изключение със стабилния си елементен път, вместо тихо да изхвърли съдържание
MaximumContinuationDepth е 100,000 по подразбиране и ограничава повредени компоненти, които многократно връщат продължение без напредък
Размерите на страницата на секцията трябва да са положителни, полетата и междините на furniture не могат да са отрицателни, а геометрията header плюс footer трябва да оставя положителен body правоъгълник
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 експортира същите повърхности за документ, стил, компонент, таблица, секция, renderer и статистика