Автоматическая структура PDF/UA из layout-деревьев

THPDFDOMRenderer может превратить визуальное layout-дерево в соответствующее дерево логической структуры без ручной раздачи MCID

THPDFDOMDocument.GenerateStructure по умолчанию True, включает вывод tagged PDF, создаёт один корень Document и один Sect на секцию, а если у цели нет языка документа — использует THPDFDOMDocument.Language

Семантические значения по умолчанию и переопределения

Содержимое layoutГенерируемая структура
THPDFDOMTextP, или от H1 до H6, когда задан HeadingLevel
THPDFDOMStack и THPDFDOMContainerDiv
THPDFDOMListL с потомками LI, Lbl и LBody плюс ListNumbering
THPDFDOMTableTable, TR, TH и TD, с column scope на ячейках заголовков
THPDFDOMImageFigure с альтернативным текстом
Колонтитулы, повторяющиеся заголовки таблиц, распорки и декоративные блокиmarked content Artifact

Каждый компонент также открывает SemanticRole, SemanticLanguage, AlternativeText, ActualText, ExpansionText и Artifact для явного управления

Пример доступного документа

Document.Language := 'en-US';
Section := Document.AddSection;
Section.Header := THPDFDOMText.Create('Quarterly report');
Section.Body.AddHeading('Results', 1, 'Title');

List := THPDFDOMList.Create('Decimal', 'Steps');
List.AddItem('1.', 'Review the totals');
Section.Body.Add(List);

Table := THPDFDOMTable.Create('Summary');
Table.AddColumn;
Table.AddColumn;
Header := Table.AddRow(18, True);
Header[0].Text := 'Name';
Header[1].Text := 'Value';
Row := Table.AddRow(18);
Row[0].Text := 'Alpha';
Row[1].Text := '42';
Section.Body.Add(Table);

Section.Body.Add(THPDFDOMImage.Create(Bitmap, 120, 80,
  'Revenue chart by quarter', 'Chart'));

PDF.PDFUACompliance := True;
PDF.PDFUAPart := 2;
Statistics := Renderer.Render(Document, PDF);

Рендерер отвергает первый заголовок выше H1, пропущенные уровни заголовков, «осиротевшие» роли списка или таблицы и figure без альтернативного текста в PDF/UA, прежде чем записать невалидную структуру

Идентичность между страницами и порядок чтения

Логический компонент сохраняет один элемент структуры при разбиении между страницами

Каждое видимое продолжение получает локальный для страницы MCID и словарь MCR, ведущий от существующего элемента структуры к нужной странице

ParentTree страницы отображает каждый MCID обратно в тот же элемент структуры, а клоны продолжений сохраняют логическую идентичность без копирования исходного текста или строк таблицы

Повторяющиеся заголовки таблиц на страницах продолжения — это artifact, поэтому их визуальный повтор не переставляет логический заголовок таблицы раньше ранее выведенных строк тела

Прямые API построения, устойчивые к продолжениям

BeginTaggedContentForStructure выделяет MCID и открывает marked content для уже существующего элемента структуры

AppendStructureMarkedContent добавляет явную страницу и MCID как MCR и обновляет ParentTree страницы

Используйте эти низкоуровневые методы, когда собственный layout-рендерер ведёт логику продолжений вне HPDFLayoutDOM

Статистика и совместимость

THPDFDOMRenderStatistics отчитывается о числе элементов структуры, marked content и artifact вместе со страницами, размещениями, разбиениями и глубиной продолжений

Выставляйте GenerateStructure в False перед рендерингом, когда нужен байтово-совместимый вывод без тегов

Связанные API