支持表格固定高度

This commit is contained in:
csh 2024-11-04 15:42:29 +08:00
parent 535bdb20d4
commit 2d6632895b
3 changed files with 33 additions and 9 deletions

View File

@ -1,6 +1,6 @@
type TSPdfCellRange = class(TSPdfBasicRange) type TSPdfCellRange = class(TSPdfBasicRange)
public public
function Create(table_range: TSPdfTableRange; docx_to_pdf: TSDocxToPdf; pg: TSPage; components: TSDocxComponentsWare; tc: Tc; tbl_pr: TblPr; tr_pr: TrPr); function Create(table_range: TSPdfTableRange; docx_to_pdf: TSDocxToPdf; pg: TSPage; components: TSDocxComponentsWare; tc: Tc; tbl_pr: TblPr; trp: TSTrProperty);
function Calc(); function Calc();
function Do();override; function Do();override;
function SetTSPage(page: TSPage); function SetTSPage(page: TSPage);
@ -20,6 +20,7 @@ public
RemoveFlag; RemoveFlag;
Row; Row;
Col; Col;
[weakref]TSTrPr: TSTrProperty;
private private
[weakref]parent_: TSPdfTableRange; [weakref]parent_: TSPdfTableRange;
@ -28,7 +29,6 @@ private
[weakref]docx_components_ware_: TSDocxComponentsWare; [weakref]docx_components_ware_: TSDocxComponentsWare;
[weakref]tc_: Tc; [weakref]tc_: Tc;
[weakref]tbl_pr_: TblPr; [weakref]tbl_pr_: TblPr;
[weakref]tr_pr_: TrPr;
region_array_: array of Region; // 单元格可能跨页,所以可能存在多个 region_array_: array of Region; // 单元格可能跨页,所以可能存在多个
end; end;
@ -43,7 +43,7 @@ type Region = class
RangeArr: array of TSPdfAbstractRange; RangeArr: array of TSPdfAbstractRange;
end; end;
function TSPdfCellRange.Create(table_range: TSPdfTableRange; docx_to_pdf: TSDocxToPdf; pg: TSPage; components: TSDocxComponentsWare; tc: Tc; tbl_pr: TblPr; tr_pr: TrPr); function TSPdfCellRange.Create(table_range: TSPdfTableRange; docx_to_pdf: TSDocxToPdf; pg: TSPage; components: TSDocxComponentsWare; tc: Tc; tbl_pr: TblPr; trp: TSTrProperty);
begin begin
parent_ := table_range; parent_ := table_range;
docx_to_pdf_ := docx_to_pdf; docx_to_pdf_ := docx_to_pdf;
@ -51,8 +51,8 @@ begin
docx_components_ware_ := components; docx_components_ware_ := components;
tc_ := tc; tc_ := tc;
tbl_pr_ := tbl_pr; tbl_pr_ := tbl_pr;
tr_pr_ := tr_pr;
region_array_ := array(); region_array_ := array();
{self.}TSTrPr := trp;
{self.}TSPage := page_; {self.}TSPage := page_;
{self.}VMerge := 0; {self.}VMerge := 0;
end; end;
@ -114,6 +114,13 @@ begin
{self.}StartY := point.Y; {self.}StartY := point.Y;
{self.}Calc(); {self.}Calc();
end end
if not {self.}VMerge and {self.}TSTrPr.TrPr.TrHeight.HRule <> "exact" and {self.}DynamicHeight > {self.}FixedHeight then
begin
region.RectangleRange.FixedHeight := {self.}DynamicHeight;
{self.}FixedHeight := {self.}DynamicHeight;
end
if not {self.}VMerge and {self.}DynamicHeight > {self.}TSTrPr.Height then
{self.}TSTrPr.Height := {self.}DynamicHeight;
end; end;
function TSPdfCellRange.Do();override; function TSPdfCellRange.Do();override;
@ -135,13 +142,13 @@ end;
function TSPdfCellRange.AlignHeight(height: real); function TSPdfCellRange.AlignHeight(height: real);
begin begin
if {self.}FixedHeight > height then height := {self.}FixedHeight; if {self.}TSTrPr.Height > height then height := {self.}TSTrPr.Height;
region := region_array_[0]; region := region_array_[0];
surplus := height - ({self.}StartY - {self.}LowerBound); surplus := height - ({self.}StartY - {self.}LowerBound);
if surplus < 1e-6 then if surplus < 1e-6 then
begin begin
region.RectangleRange.DynamicHeight := height; region.RectangleRange.DynamicHeight := height;
if {self.}FixedHeight then region.RectangleRange.DynamicHeight := {self.}FixedHeight; if {self.}TSTrPr.Height then region.RectangleRange.DynamicHeight := {self.}TSTrPr.Height;
{self.}EndY := {self.}StartY - region.RectangleRange.DynamicHeight; {self.}EndY := {self.}StartY - region.RectangleRange.DynamicHeight;
return; return;
end end
@ -231,7 +238,7 @@ end;
function TSPdfCellRange.IsReComputeByCantSplit(): boolean; function TSPdfCellRange.IsReComputeByCantSplit(): boolean;
begin begin
if {self.}VMerge then return false; if {self.}VMerge then return false;
return tr_pr_.CantSplit and page_ <> {self.}TSPage; return {self.}TSTrPr.TrPr.CantSplit and page_ <> {self.}TSPage;
end; end;
function TSPdfCellRange.IfRemoveEmptyRectangle(): boolean; function TSPdfCellRange.IfRemoveEmptyRectangle(): boolean;

View File

@ -27,6 +27,7 @@ private
[weakref]page_: TSPage; [weakref]page_: TSPage;
tbl_pr_unit_decorator_: TblPrUnitDecorator; tbl_pr_unit_decorator_: TblPrUnitDecorator;
cell_range_array_: tableArray; cell_range_array_: tableArray;
tr_array_: array of TSTrProperty;
end; end;
function TSPdfTableRange.Create(docx_to_pdf: TSDocxToPdf; pg: PdfPage; components: Components; table: Tbl); function TSPdfTableRange.Create(docx_to_pdf: TSDocxToPdf; pg: PdfPage; components: Components; table: Tbl);
@ -36,6 +37,7 @@ begin
docx_components_ware_ := Components; docx_components_ware_ := Components;
table_ := table; table_ := table;
cell_range_array_ := array(); cell_range_array_ := array();
tr_array_ := array();
{self.}TSPage := page_; {self.}TSPage := page_;
end; end;
@ -98,6 +100,9 @@ begin
tc_x := {self.}EndX; tc_x := {self.}EndX;
tcs := tr.Tcs(); tcs := tr.Tcs();
pos := 0; pos := 0;
trp := new TSTrProperty();
trp.TrPr := tr_pr;
tr_array_[i] := trp;
for j,tc in tcs do for j,tc in tcs do
begin begin
{self.}SetTcPr(tc.TcPr); {self.}SetTcPr(tc.TcPr);
@ -126,7 +131,7 @@ begin
cell_range_array_[vmerge_arr[pos][0]][pos].VMerge := vmerge_arr[pos][1]; cell_range_array_[vmerge_arr[pos][0]][pos].VMerge := vmerge_arr[pos][1];
vmerge_arr[pos] := nil; vmerge_arr[pos] := nil;
end end
cell_range := new TSPdfCellRange(self, docx_to_pdf_, page_, docx_components_ware_, tc, tbl_pr_unit_decorator_, tr.TrPr); cell_range := new TSPdfCellRange(self, docx_to_pdf_, page_, docx_components_ware_, tc, tbl_pr_unit_decorator_, trp);
cell_range.StartX := tc_x; cell_range.StartX := tc_x;
cell_range.Width := grid_cols[pos].W; cell_range.Width := grid_cols[pos].W;
cell_range.LowerBound := {self.}LowerBound; cell_range.LowerBound := {self.}LowerBound;
@ -147,6 +152,7 @@ begin
// for i,arr in cell_range_array_ do // for i,arr in cell_range_array_ do
// begin // begin
// println("i = {}, tr = {}", i, tr_array_[i]);
// println("i = {}, len = {}, arr = {}", i, length(arr), arr); // println("i = {}, len = {}, arr = {}", i, length(arr), arr);
// end // end
return; return;
@ -206,7 +212,6 @@ begin
end end
if range.VMerge then vmerge_arr[j] := array(i, range.VMerge); if range.VMerge then vmerge_arr[j] := array(i, range.VMerge);
if not range.VMerge and range.DynamicHeight > max_height then max_height := range.DynamicHeight; if not range.VMerge and range.DynamicHeight > max_height then max_height := range.DynamicHeight;
if range.FixedHeight > max_height then max_height := tc_h;
end end
if recompute_flag then continue; if recompute_flag then continue;
row_height[i] := max_height; row_height[i] := max_height;

12
utils/TSTrProperty.tsf Normal file
View File

@ -0,0 +1,12 @@
type TSTrProperty = class
function Create();
public
TrPr: TrPrUnitDecorator;
Height: real;
end;
function TSTrProperty.Create();
begin
{self.}TrPr := nil;
{self.}Height := 0;
end;