Декларативен 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, когато целта няма език

Компоненти

Всички компоненти излагат стабилни договорки 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 и статистика

Свързани API