从布局树自动生成 PDF/UA 结构

THPDFDOMRenderer 可以将视觉布局树转换为匹配的逻辑结构树,而无需手动分配 MCID

THPDFDOMDocument.GenerateStructure 默认为 True,启用标记 PDF 输出,为每个部分创建一个 Document 根和一个 Sect,并在目标没有文档语言时使用 THPDFDOMDocument.Language

语义默认值和覆盖

布局内容生成的结构
THPDFDOMTextP,或分配了 HeadingLevel 时的 H1 到 H6
THPDFDOMStack 和 THPDFDOMContainerDiv
THPDFDOMList带 LI、Lbl 和 LBody 后代以及 ListNumbering 的 L
THPDFDOMTableTable、TR、TH 和 TD,表头单元格带列范围
THPDFDOMImage带替代文本的 Figure
页眉、页脚、重复表头、间隔符和装饰框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 的第一个标题、跳过的标题级别、孤立列表或表格角色,以及没有替代文本的 PDF/UA 图形

跨页身份和阅读顺序

逻辑组件在跨页拆分时保持一个结构元素

每个可见延续接收页面本地 MCID 和 MCR 字典,该字典从现有结构元素指向正确的页面

页面 ParentTree 将每个 MCID 映射回同一结构元素,而延续克隆保留逻辑身份而不复制源文本或表格行

延续页面上的重复表头是工件,因此其视觉重复不会将逻辑表头重新排序到较早的正文行之前

直接延续安全的创作 API

BeginTaggedContentForStructure 为已存在的结构元素分配 MCID 并打开标记内容

AppendStructureMarkedContent 将显式页面和 MCID 作为 MCR 追加,并更新页面 ParentTree

当自定义布局渲染器在 HPDFLayoutDOM 之外拥有延续逻辑时,使用这些较低级别的方法

统计与兼容性

THPDFDOMRenderStatistics 报告结构元素、标记内容和工件计数,以及页面、放置、拆分和延续深度

当需要字节兼容的未标记输出时,在渲染前将 GenerateStructure 设为 False

相关 API