THPDFTable 表格布局与渲染

THPDFTable 是 v2.429.0 引入的轻量级表格布局与渲染引擎,由 HPDFTable 单元提供

v2.429.0 之前,生成方不得不用 Rectangle 加 TextOut 手绘单元格并硬编码列 X 坐标,行高、斑马纹和分页都要手工管理;THPDFTable 驱动既有的 THPDFPage 绘图原语,让表格以实测行高、合并单元格和自动分页延续的方式渲染

单元

HPDFTable

使用示例

uses
  HPDFTable;

var
  Tbl: THPDFTable;
  Row: THPDFTableRow;
begin
  Tbl:= THPDFTable.Create(HPDF);
  try
    Tbl.AddColumn(80); Tbl.AddColumn(200); Tbl.AddColumn(120);
    Tbl.SetBounds(50, 60);
    Row:= Tbl.AddRow; Row.IsHeader:= True;
    Row.Cells[0].Text:= 'No';
    Row.Cells[1].Text:= 'Description';
    Row:= Tbl.AddRow;
    Row.Cells[0].ColSpan:= 2;          // merged cell across columns 0..1
    Row.Cells[0].Text:= 'merged header';
    Tbl.Render;
  finally
    Tbl.Free;
  end;
end;

THPDFTable

THPDFTable 持有列布局、行集合和渲染过程;它通过传给 THPDFTable.Create 的 THotPDF 组件绘制,只使用公共的 THPDFPage 与 THotPDF 成员

方法

方法说明
THPDFTable.Create(ADoc: THotPDF)创建绑定到文档的表格,页面、字体和图像都由该文档提供
THPDFTable.Destroy释放表格及其拥有的所有行与单元格
THPDFTable.AddColumn(Width: Single): Integer以当前页面单位按给定宽度追加一列,并返回其索引
THPDFTable.AddRow: THPDFTableRow按当前列数追加一行并返回它
THPDFTable.SetBounds(AX, AY: Single)在当前页面上定位表格原点
THPDFTable.Render测量行高,绘制背景、边框和单元格内容,只要还有剩余行就延续到新页面

属性

属性说明
THPDFTable.Doc: THotPDF构造函数传入的绑定文档
THPDFTable.ColCount: Integer经 THPDFTable.AddColumn 添加的列数
THPDFTable.RowCount: Integer经 THPDFTable.AddRow 添加的行数
THPDFTable.Rows[Index: Integer]: THPDFTableRow按索引访问一行
THPDFTable.X: Single 和 THPDFTable.Y: Single表格在页面上的原点,按当前页面单位
THPDFTable.HeaderBgColor: TColor绘制在表头行背后的背景色
THPDFTable.AlternatingBg: TColor应用于交替非表头行的斑马纹背景色
THPDFTable.BorderColor: TColor 和 THPDFTable.BorderWidth: Single单元格边框使用的网格线颜色与宽度
THPDFTable.DefaultFontName: AnsiString, THPDFTable.DefaultFontSize: Single, THPDFTable.DefaultAlign: THPDFCellAlign未自行覆盖的单元格使用的回退字体与对齐
THPDFTable.Padding: Single单元格边框与其内容之间的内边距
THPDFTable.BottomMargin: Single渲染过程分页到新页面之前,在页面底部保留的空间
THPDFTable.RepeatHeader: Boolean为 true 时,每个延续页面顶部都会重新输出表头带
THPDFTable.TotalHeightRendered: Single上一次渲染过程在所有页面上消耗的总高度

THPDFTableRow

THPDFTableRow 保存一个表格行的单元格,以及测量与渲染期间使用的行级标志

成员说明
THPDFTableRow.Create(InitialColCount: Integer)创建该行并预先填充给定数量的单元格
THPDFTableRow.Destroy释放该行及其单元格
THPDFTableRow.AddCell: THPDFTableCell追加一个单元格并返回它
THPDFTableRow.EnsureCells(Count: Integer): Integer把该行扩充到至少给定数量的单元格,并返回新数量
THPDFTableRow.Cells[Index: Integer]: THPDFTableCell按索引访问单元格的默认数组属性
THPDFTableRow.Count: Integer该行当前持有的单元格数
THPDFTableRow.IsHeader: Boolean把该行标记为表头行,以 THPDFTable.HeaderBgColor 绘制,并在 THPDFTable.RepeatHeader 启用时重复输出
THPDFTableRow.MinHeight: Single施加到实测行高的下限

THPDFTableCell

THPDFTableCell 携带单元格内容,以及在表格默认值之上应用的逐单元格覆盖

属性说明
THPDFTableCell.Text: WideString单元格文本;THPDFTableCell.IsHTML 为 true 时经 THPDFPage.TextOutHTML 渲染,粗体、颜色、链接和上下标等内联标记都会生效
THPDFTableCell.Align: THPDFCellAlign 和 THPDFTableCell.VAlign: THPDFCellVAlign单元格内容的水平与垂直对齐
THPDFTableCell.ColSpan: Integer 和 THPDFTableCell.RowSpan: Integer水平与垂直合并数,默认都是 1
THPDFTableCell.BgColor: TColor 和 THPDFTableCell.HasBgColor: Boolean逐单元格背景色覆盖及其存在标志
THPDFTableCell.TextColor: TColor 和 THPDFTableCell.HasTextColor: Boolean逐单元格文本颜色覆盖及其存在标志
THPDFTableCell.FontName: AnsiString, THPDFTableCell.FontSize: Single, THPDFTableCell.FontStyle: TFontStyles, THPDFTableCell.HasFont: Boolean逐单元格字体覆盖及其存在标志
THPDFTableCell.WordWrap: Boolean在单元格内把长文本折行到多行,默认启用
THPDFTableCell.ImageIndex: Integer大于等于 0 时,单元格显示经 THotPDF.AddImage 以该索引注册的图像而不是文本,默认 -1
THPDFTableCell.ImageAspect: Single图像单元格的显示纵横比;图像缩放到单元格宽度,高度按该比例推导,默认 1.0
THPDFTableCell.IsHTML: Boolean让 THPDFTableCell.Text 经 THPDFPage.TextOutHTML 渲染内联标记

对齐枚举

THPDFCellAlign = (caLeft, caCenter, caRight) 选择单元格水平对齐,THPDFCellVAlign = (cvaTop, cvaMiddle, cvaBottom) 选择单元格垂直对齐

布局与分页行为

行高根据单元格内容测量,并遵循自动换行与 THPDFTableRow.MinHeight;跨行跨列单元格放到内部网格上,使 THPDFTableCell.ColSpan 与 THPDFTableCell.RowSpan 正确跨行合并;下一行在 THPDFTable.BottomMargin 之上放不下时,渲染过程会分页到新页面

THPDFTable.RepeatHeader 为 true 时,每个延续页面在绘制后续行之前先重新输出表头带

v2.432.0 引入的图像单元格按索引引用经 THotPDF.AddImage 注册的图像,缩放到单元格宽度,并按 THPDFTableCell.ImageAspect 推导高度,使图片保持源纵横比

另请参见