Автоматическая структура PDF/UA из layout-деревьев
THPDFDOMRenderer может превратить визуальное layout-дерево в соответствующее дерево логической структуры без ручной раздачи MCID
THPDFDOMDocument.GenerateStructure по умолчанию True, включает вывод tagged PDF, создаёт один корень Document и один Sect на секцию, а если у цели нет языка документа — использует THPDFDOMDocument.Language
Семантические значения по умолчанию и переопределения
| Содержимое layout | Генерируемая структура |
|---|---|
THPDFDOMText | P, или от H1 до H6, когда задан HeadingLevel |
THPDFDOMStack и THPDFDOMContainer | Div |
THPDFDOMList | L с потомками LI, Lbl и LBody плюс ListNumbering |
THPDFDOMTable | Table, TR, TH и TD, с column scope на ячейках заголовков |
THPDFDOMImage | Figure с альтернативным текстом |
| Колонтитулы, повторяющиеся заголовки таблиц, распорки и декоративные блоки | 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 перед рендерингом, когда нужен байтово-совместимый вывод без тегов