支持表格固定高度

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

View File

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