PDFium Delphi Component Docs

FPdfLayout 单元

构建可度量的流式布局计划,包含页面附属元素、分栏、跨页表格、链接、可复用节点、标记输入和 Tagged PDF 语义

异常与枚举

类型取值或用途
EPdfLayoutError因无效的布局输入、超出限制和语义结构不一致而引发的异常
TPdfLayoutAlignmentplaLeft, plaCenter, plaRight
TPdfLayoutCommandKindplcText, plcRule, plcImage, plcPageXObject, plcCachedNode, plcLink, plcRectangle
TPdfLayoutItemKindpliText, pliSpacer, pliRule, pliImage, pliPageXObject, pliPageBreak, pliCachedNode, pliLink, pliSemanticNode, pliTable
TPdfLayoutSemanticRoleplsrArtifact, plsrParagraph, plsrHeading1, plsrHeading2, plsrHeading3, plsrHeading4, plsrHeading5, plsrHeading6, plsrList, plsrListItem, plsrListLabel, plsrListBody, plsrTable, plsrTableRow, plsrTableHeader, plsrTableData, plsrFigure, plsrCaption, plsrLink, plsrSection, plsrDivision
TPdfLayoutTableScopepltsNone, pltsRow, pltsColumn, pltsBoth
TPdfLayoutListNumberingplnNone, plnDisc, plnCircle, plnSquare, plnDecimal, plnUpperRoman, plnLowerRoman, plnUpperAlpha, plnLowerAlpha
TPdfLayoutGridTrackKindplgtkFixed, plgtkFraction, plgtkAuto
TPdfMarkupFormatpmfMarkdown, pmfHtml

布局记录

类型公开成员
TPdfLayoutSemanticsRole, ParentID, ElementID, AlternateText, ActualText, Language, HeaderIDs, TableScope, ColumnSpan, RowSpan, ListNumbering, Artifact, Paragraph, Figure
TPdfLayoutTextStyleFontName, FontSize, Color, Alpha, LineHeight, Alignment, KeepTogether, BreakLongWords, SpaceBefore, SpaceAfter, Default
TPdfLayoutConstraintsKeepTogether, KeepWithNext, PageBreakBefore, PageBreakAfter, OrphanLines, WidowLines, Default
TPdfLayoutPageSettingsWidth, Height, MarginLeft, MarginTop, MarginRight, MarginBottom, HeaderHeight, FooterHeight, A4, Letter
TPdfLayoutRectLeft, Top, Width, Height
TPdfLayoutGridTrackKind, Value, Minimum, Maximum, MeasuredContent
TPdfLayoutGridTracksTPdfLayoutGridTrack 的动态数组
TPdfLayoutGridSizes已解析轨道大小的动态数组
TPdfLayoutTableOptionsCellPadding, BorderWidth, BorderColor, BorderAlpha, RepeatHeaderRows, AllowRowSpanContinuation, MaxContinuationRegions, ContinuationBefore, ContinuationAfter, ContinuationStyle, Default
TPdfLayoutTableTextRunText, Style
TPdfLayoutTableTextRunsTPdfLayoutTableTextRun 的动态数组
TPdfMarkupOptionsBaseStyle, HeadingScale, MaxInputCharacters, MaxNodes, Default
TPdfLayoutSemanticElementSemantics, ParentElementIndex
TPdfLayoutSemanticElementsTPdfLayoutSemanticElement 的动态数组
TPdfLayoutCommandKind, PageNumber, Bounds, Text, FontName, FontSize, Color, Alpha, Alignment, Thickness, FileName, Uri, Source, SourcePageIndex, SemanticElementIndex, MarkedContentID, AnnotationIndex
TPdfLayoutCommandsTPdfLayoutCommand 的动态数组
TPdfLayoutPlanPageSettings, PageCount, Commands, SemanticElements, TextLineCount, RuleCount, RectangleCount, ImageCount, PageXObjectCount, CachedNodeCount, LinkCount, TaggedContentCount, ArtifactCount, MeasuredTextCount, TotalPageReferenceCount, ReservedPageDigits, CacheHitCount, CacheMissCount, ReusedXObjectCount, ColumnCount, ColumnGap

布局类

类型公开成员
TPdfLayoutMeasurerMeasureTextWidth, CacheIdentity
TPdfLayoutItemKind
TPdfLayoutTableCellText, Uri, Style, AddTextRun, TextRuns, SetImage, ColumnSpan, RowSpan, Header, ElementID, HeaderIDs, Scope
TPdfLayoutTableRowAddCell, Cells, Header, AllowSplit, MinimumHeight, KeepWithPrevious
TPdfLayoutTableCreate, Destroy, AddRow, AddSubtotalRow, SetCaption, Columns, Rows, Options, Caption, CaptionStyle, ElementID, ParentID
TPdfLayoutPagedPlanCreate, Destroy, ClearPageCache, MaterializePage, Reset, Summary, CommandCount, StorageByteCount, SourceCount, Completed,MaxCommandCount、MaxStorageBytes、MaxPageCommands、MaxSourceCount 和 MaxCachedPages 预算,以及 CachedPageCount、CacheHitCount、CacheMissCount 和 PeakCachedPageCount 缓存统计
TPdfLayoutDocumentCreate, Destroy, Clear, AddText, AddSpacer, AddRule, AddImage, AddPageXObject, AddCachedNode, AddLink, AddSemanticNode, SetLastItemSemantics, SetLastItemConstraints, AddTable, AddPageBreak, LoadMarkup, InvalidateCache, BuildPlan, BuildPagedPlan, PageSettings, HeaderText, FooterText, HeaderStyle, FooterStyle, ReservedPageDigits, ColumnCount, ColumnGap, Items
TPdfLayoutCachedNodeCreate, Destroy, Invalidate, BeginEmission, EndEmission, Content, Width, Height, Built

分页约束

在添加任何可见流式条目之后调用 SetLastItemConstraints,使该条目保持完整、与下一个条目的开头保持在一起,或在其之前或之后强制物理分页

OrphanLines 是区域底部保留的段落行数下限,WidowLines 是放置在下一区域顶部的行数下限;两者默认均为 1,以保持既有的分页行为

约束同等适用于段落、链接、列表、图形和表格角色条目,而纯语义容器没有几何信息,因此拒绝分页约束

pliTable 条目仅接受 PageBreakBefore 和 PageBreakAfter;行拆分与表格起始保留由表格模型控制

规划器在构建期间缓存换行结果,因此与下一段保持在一起的预测和最终命令输出不会对同一文本测量两次

分页命令计划

在专用的可寻址、可调整大小的 TStream 上创建 TPdfLayoutPagedPlan,然后调用 BuildPagedPlan 或将其传递给 TPdf.GeneratePagedLayout

规划器立即序列化命令,释放每个完成的换行文本结果,并让 Plan.Commands 保持为空,同时在摘要中保留页面设置、语义元素、计数和稳定的页面总数

正文命令与后续页眉或页脚命令以链接页面段的形式建立索引,因此 MaterializePage 可以还原完整页面,而无需扫描其他页面的命令

MaxCachedPages 仅约束计划保留的页面数组;继续持有返回数组的调用方会延长其存活期,且 PDFium 会保留原生生成的页面,直到目标文档被保存或关闭

存储格式是私有会话状态而非可移植的文件格式,该流不得在外部共享或修改,且页面 XObject 或缓存节点引用的源对象的存活期必须长于分页计划

当命令应在内存中保留至选定阈值、之后溢出到关闭即删除的临时存储时,请使用 TPdfRandomAccessStore

跨页表格

以固定、比例或内容尺寸的网格轨道创建 TPdfLayoutTable,添加行和单元格,然后调用 AddTable;文档会存储一个自持有的快照,因此调用方后续的修改不会使现有的计划缓存失效

表头行必须连续位于表格开头,且当 RepeatHeaderRows 为 true 时在页面或分栏切换后重复;表头行的跨度不能延伸到正文行

AllowSplit 为 true 时,正文行可以拆分;默认情况下,经传递关系相连的跨行组作为一个原子单元移动,普通拆分行中的单元格共用行带、内边距和边框几何

将 AllowRowSpanContinuation 设为 True,可让跨行组跨页面或列区域续排;规划器将额外跨行高度分配到各行,选择不穿过文本行或图像的切分位置

AllowSplit=False 仍表示整行不可拆;行约束不兼容或原子块在新区域中也放不下时,会抛出 EPdfLayoutError,不会裁掉或重复内容

表题与初始表头块及首个正文组的最小起始内容保持在一起;重复表头复用原始表头元素

无论页数多少,规划器都输出一个 Table 元素、可选的 Caption、TR 子元素以及 TH 或 TD 单元格;重复的表头命令复用原始语义索引,除非提供了显式的有效 ID,TD 单元格会自动获得重叠的表头 ID

表格边框是工件(artifact)plcRectangle 命令,通过原生 PDFium 路径对象渲染,而标题和单元格文本保持为标记内容

混合文本与图像单元格

AddTextRun 在单元格原始 Text 后追加行内文本;每个 run 独立拥有字体、字号、颜色、alpha、行高和长单词拆分策略

混合文本按测量宽度换行,拆分长单词时保留 UTF-16 代理对,并生成共用基线的独立原生文本对象;水平对齐来自单元格基础 Style

run 级段落间距和保持完整标志不会新增段落块;需要这些约束时,应使用独立行或普通布局项

SetImage 为每单元格配置一个来自文件的图像,放在文本上方并对齐左侧内边距;再次调用会替换该图像

须明确提供正数高度和适合单元格内部宽度的宽度;宽度为零时使用全部内部宽度,图像宽高比由调用方传入的尺寸控制

续排时图像不可拆分,只在原位置输出一次;文件须在生成时仍然可用,缺失文件或不支持图像会使生成过程回滚追加页面

替代描述不能为空;图像成为原 TH 或 TD 下的 Figure 子元素,所有文本片段仍关联该单元格

跨页后,原 TH 或 TD 接收续排的 marked-content 引用,保留 RowSpan、ColumnSpan 和表头关联,不会创建重复逻辑单元格

小计与续排标签

AddSubtotalRow 使用调用方标签、格式化值和样式创建不可拆分的正文行;多列时标签跨越除最后数值列以外的所有列

辅助函数设置 KeepWithPrevious=True,避免小计孤立成为续排区域的首行;值由调用方提供,不进行数字汇总

ContinuationAfter 显示在仍需续排的区域末尾,ContinuationBefore 显示在下一区域的重复表头之后

两种标签默认均为空,使用 ContinuationStyle,须在单行内显示并独立预留高度;首区域无 before 标签,末区域无 after 标签

标签和边框属于 artifact,保持表格语义层次不变;{page} 和 {pages} 等页码占位符使用普通布局文本解析器

高级表格声明与上限

procedure TPdfLayoutTableCell.AddTextRun(const Text: WideString;
  const Style: TPdfLayoutTextStyle);

procedure TPdfLayoutTableCell.SetImage(const FileName: string;
  Width, Height: Single; const AlternateText: WideString);

function TPdfLayoutTable.AddSubtotalRow(const LabelText, ValueText: WideString;
  const Style: TPdfLayoutTextStyle): TPdfLayoutTableRow;

覆盖选项前先使用 TPdfLayoutTableOptions.Default;AllowRowSpanContinuation 默认为 False,MaxContinuationRegions 默认为 10,000 个页面或列区域,可配置上限为 100,000

表格仍限制为 256 列、100,000 行和 100,000 个语义元素;单元格文本总量限制为 8,000,000 个 UTF-16 代码单元

混合文本单元格最多接受 1,024 个追加 run、1,000,000 个 UTF-16 代码单元、100,000 行和 100,000 个片段;单个字符,或关闭长单词拆分后仍超出可用宽度的单词,会被拒绝

续排行组最多含 10,000 个单元格;区域预算和受限切分搜索避免无界分页,图像须能放入扣除表头、标签和内边距后的正文区域

库拥有的表格快照和计划缓存包含 run 样式、图像尺寸、替代文本、小计保留及续排设置;调用方之后修改表格不会改变该快照

顶层例程

函数或过程说明
ResolveLayoutText使用预留的数字宽度展开页码占位符
PdfLayoutSemanticRoleName返回语义角色对应的 Tagged PDF 结构名称
BuildTaggedLayoutPdf将完成的布局计划和标记结构应用到源 PDF 字节
ResolvePdfLayoutGridTracks在可用宽度内解析固定、比例和内容尺寸的网格轨道

参见