Декларативний DOM компонування
HPDFLayoutDOM будує перевикористовувані компоненти документів поверх THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, фрагментів переповнення, що належать володінню, та 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 володіє своїм тілом, заголовком, нижнім колонтитулом і стилем, а кожен стек чи контейнер володіє компонентами, приєднаними до нього
THPDFDOMRenderer.Render починає та завершує цільовий документ, створює нову сторінку для кожної нової секції, повторює меблі секції на сторінках продовження та повертає статистику сторінок, розміщень, розбиттів, меблів, структури, позначеного вмісту, артефактів та максимального продовження
Задайте всі параметри виводу, стиснення, відповідності стандартам, шарів і негайного скидання буфера для THotPDF до виклику Render
GenerateStructure за замовчуванням дорівнює True, тому рендерер також будує безпечне для продовження дерево логічної структури та використовує THPDFDOMDocument.Language, коли ціль не має мови
Компоненти
THPDFDOMTextобгортає текст Unicode, кешує межі рядків за шириною та успадкованими текстовими метриками та розбивається через діапазони вихідних символів без копіювання вихідного текстуTHPDFDOMSpacerрезервує вертикальний простір і може розбиватися між сторінкамиTHPDFDOMStackрозміщує належні нащадки вертикально з успадкованими внутрішніми полями та інтерваламиTHPDFDOMContainerдодає стилізовану рамку навколо одного належного нащадка та передає продовження розбиття даліTHPDFDOMTableрозв'язує зважені стовпці, малює стилізовані рядки та комірки та повторює ведучі рядки заголовків на сторінках продовженняTHPDFDOMListстворює нумеровані чи ненумеровані елементи списку з компонентами міток і тілаTHPDFDOMImageволодіє клонованою графікою, розв'язує явні розміри та надає семантику фігур і контроль стиснення
Усі компоненти надають стабільні контракти Name, Path, Style, Clone, Measure, Draw та Split плюс перевизначення семантичної ролі, мови, альтернативного тексту, тексту заміни, тексту розширення та артефактів
Обхід тіла верхнього рівня лінійний і не клонує компоненти; продовження тексту та таблиць зберігають метадані діапазону чи зрізів рядків замість копіювання повного дерева вмісту
Успадкування стилю
THPDFDOMStyle розв'язує назву шрифту, розмір, стилі, колір тексту, фон, рамку, внутрішні поля, інтервали та висоту рядка через ланцюг батьків
Стиль секції є батьком її тіла та меблів, стиль стека чи контейнера є батьком її нащадків, а стиль таблиці протікає через рядки до комірок
Лише явно призначені значення перевизначають батька; 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'));
Назви фабрик нечутливі до регістру та унікальні, кожен виклик мусить повертати новий екземпляр компонента, а приймальний контейнер набуває володіння після Add
Використовуйте SetHeaderClone, SetFooterClone або Clone, коли один оголошений компонент має бути перевикористаний у кількох місцях володіння
Таблиці з повторюваними заголовками
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);
Рядки заголовків мають бути суцільними та передувати рядкам тіла, додатні ваги стовпців ділять доступну ширину, а висоти рядків є явними додатними значеннями
Коли RepeatHeaders є true, для розбиття потрібне місце для всіх ведучих рядків заголовків і принаймні одного рядка тіла, що запобігає сторінкам продовження лише із заголовками
Пейджинація та межі збоїв
Рендерер спершу повторно вимірює кожен компонент проти решти прямокутника тіла, переміщує нерозбивний мінімальний фрагмент на нову сторінку, коли це можливо, та делегує кожен дійсний розбиття в PlaceLayoutElement
Елемент, який не може вміститися в порожню сторінку тіла, кидає виняток зі своїм стабільним шляхом елемента, а не мовчки відкидає вміст
MaximumContinuationDepth за замовчуванням становить 100 000 та обмежує пошкоджені компоненти, які повторно повертають продовження без прогресу
Розміри сторінок секцій мають бути додатними, поля та зазори меблів не можуть бути від'ємними, а геометрія заголовка плюс нижнього колонтитула має залишати додатний прямокутник тіла
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 експортує ті самі поверхні документа, стилю, компонента, таблиці, секції, рендерера та статистики