1. 重构部分表格代码
2. 支持表格的边框样式`single`和`dashed` 3. 遇到不支持的项目符号采用数字代替
This commit is contained in:
parent
da65b2b6c3
commit
003268fd40
|
|
@ -6,67 +6,75 @@ public
|
||||||
function SetTSPage(page: TSPage);
|
function SetTSPage(page: TSPage);
|
||||||
function GetLastPage();
|
function GetLastPage();
|
||||||
function AlignHeight(height: real);
|
function AlignHeight(height: real);
|
||||||
function IsSamePage(): boolean;
|
|
||||||
function FirstValidTSPage(): TSPage;
|
|
||||||
function SetVAlign();
|
function SetVAlign();
|
||||||
function IsReComputeByCantSplit(): boolean;
|
function IsReComputeByCantSplit(): boolean;
|
||||||
function IfRemoveEmptyRectangle(): boolean;
|
function IfRemoveEmptyRectangle(): boolean;
|
||||||
|
function SetTop();
|
||||||
|
|
||||||
|
property Tc read tc_;
|
||||||
|
|
||||||
private
|
private
|
||||||
function GetCellPrType(): string;
|
function GetCellPrType(): string;
|
||||||
|
function SetBorderRange(range: TSPdfBordersRange);
|
||||||
|
|
||||||
public
|
public
|
||||||
VMerge;
|
RemoveFlag: boolean;
|
||||||
RemoveFlag;
|
Row: integer;
|
||||||
Row;
|
Col: integer;
|
||||||
Col;
|
VMerge: integer;
|
||||||
[weakref]TSTrPr: TSTrProperty;
|
[weakref]TSTrPr: TSTrProperty;
|
||||||
|
|
||||||
private
|
private
|
||||||
[weakref]parent_: TSPdfTableRange;
|
[weakref]parent_: TSPdfTableRange;
|
||||||
[weakref]docx_to_pdf_: TSDocxToPdf;
|
[weakref]docx_to_pdf_: TSDocxToPdf;
|
||||||
[weakref]page_: TSPage;
|
[weakref]last_page_: TSPage;
|
||||||
[weakref]docx_components_ware_: TSDocxComponentsWare;
|
[weakref]docx_components_ware_: TSDocxComponentsWare;
|
||||||
[weakref]tc_: Tc;
|
[weakref]tc_: Tc;
|
||||||
[weakref]tbl_pr_: TblPr;
|
[weakref]tbl_pr_: TblPr;
|
||||||
|
tc_pr_unit_decorator_: TcPrUnitDecorator;
|
||||||
region_array_: array of Region; // 单元格可能跨页,所以可能存在多个
|
region_array_: array of Region; // 单元格可能跨页,所以可能存在多个
|
||||||
|
top_: boolean;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
type Region = class
|
type Region = class
|
||||||
function Create();
|
function Create();
|
||||||
begin
|
begin
|
||||||
RectangleRange := new TSPdfRectangleRange();
|
BordersRange := new TSPdfBordersRange();
|
||||||
RangeArr := array();
|
RangeArr := array();
|
||||||
end
|
end
|
||||||
|
|
||||||
RectangleRange: TSPdfRectangleRange;
|
BordersRange: TSPdfBordersRange;
|
||||||
RangeArr: array of TSPdfAbstractRange;
|
RangeArr: array of TSPdfBasicRange;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.Create(table_range: TSPdfTableRange; docx_to_pdf: TSDocxToPdf; pg: TSPage; components: TSDocxComponentsWare; tc: Tc; tbl_pr: TblPr; trp: TSTrProperty);
|
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;
|
||||||
page_ := pg;
|
last_page_ := pg;
|
||||||
docx_components_ware_ := components;
|
docx_components_ware_ := components;
|
||||||
tc_ := tc;
|
tc_ := tc;
|
||||||
tbl_pr_ := tbl_pr;
|
tbl_pr_ := tbl_pr;
|
||||||
region_array_ := array();
|
region_array_ := array();
|
||||||
|
top_ := false;
|
||||||
|
tc_pr_unit_decorator_ := new TcPrUnitDecorator(tc_.TcPr);
|
||||||
{self.}TSTrPr := trp;
|
{self.}TSTrPr := trp;
|
||||||
{self.}TSPage := page_;
|
{self.}Tc := tc;
|
||||||
{self.}VMerge := 0;
|
{self.}VMerge := 1;
|
||||||
|
{self.}TSPage := last_page_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.Calc();
|
function TSPdfCellRange.Calc();
|
||||||
begin
|
begin
|
||||||
region_array_ := array();
|
region_array_ := array();
|
||||||
region := new Region();
|
region := new Region();
|
||||||
region.RectangleRange.EndX := {self.}StartX;
|
region.BordersRange.EndX := {self.}StartX;
|
||||||
region.RectangleRange.EndY := {self.}StartY;
|
region.BordersRange.EndY := {self.}StartY;
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.BordersRange.Width := {self.}Width;
|
||||||
region.RectangleRange.FixedHeight := {self.}FixedHeight;
|
region.BordersRange.FixedHeight := {self.}FixedHeight;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.BordersRange.TSPage := last_page_;
|
||||||
region.RectangleRange.TcPr := tc_.TcPr;
|
region.BordersRange.TcPr := tc_pr_unit_decorator_;
|
||||||
|
{self.}SetBorderRange(region.BordersRange);
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
|
|
||||||
{self.}EndX := {self.}StartX;
|
{self.}EndX := {self.}StartX;
|
||||||
|
|
@ -82,12 +90,12 @@ begin
|
||||||
range := nil;
|
range := nil;
|
||||||
if element.LocalName = "p" then
|
if element.LocalName = "p" then
|
||||||
begin
|
begin
|
||||||
range := new TSPdfParagraphRange(docx_to_pdf_, page_, docx_components_ware_, element);
|
range := new TSPdfParagraphRange(docx_to_pdf_, last_page_, docx_components_ware_, element);
|
||||||
range.SetTblStyleIdAndType(tbl_pr_.TblStyle.Val, {self.}GetCellPrType());
|
range.SetTblStyleIdAndType(tbl_pr_.TblStyle.Val, {self.}GetCellPrType());
|
||||||
end
|
end
|
||||||
else if element.LocalName = "tbl" then
|
else if element.LocalName = "tbl" then
|
||||||
begin
|
begin
|
||||||
range := new TSPdfTableRange(docx_to_pdf_, page_, docx_components_ware_, element);
|
range := new TSPdfTableRange(docx_to_pdf_, last_page_, docx_components_ware_, element);
|
||||||
continue; // TODO:表中表存在不可靠问题
|
continue; // TODO:表中表存在不可靠问题
|
||||||
end
|
end
|
||||||
if ifObj(range) then
|
if ifObj(range) then
|
||||||
|
|
@ -101,25 +109,26 @@ begin
|
||||||
region.RangeArr[length(region.RangeArr)] := range;
|
region.RangeArr[length(region.RangeArr)] := range;
|
||||||
{self.}DynamicHeight += range.DynamicHeight;
|
{self.}DynamicHeight += range.DynamicHeight;
|
||||||
cell_y := range.EndY;
|
cell_y := range.EndY;
|
||||||
page_ := range.GetLastPage();
|
last_page_ := range.GetLastPage();
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
{self.}EndY := cell_y - tbl_pr_.TblCellMar.Bottom.W;
|
{self.}EndY := cell_y - tbl_pr_.TblCellMar.Bottom.W;
|
||||||
{self.}DynamicHeight += tbl_pr_.TblCellMar.Top.W + tbl_pr_.TblCellMar.Bottom.W;
|
{self.}DynamicHeight += tbl_pr_.TblCellMar.Top.W + tbl_pr_.TblCellMar.Bottom.W;
|
||||||
|
|
||||||
if {self.}EndY < {self.}LowerBound and not range.Empty() then
|
if {self.}EndY < {self.}LowerBound and not range.Empty() then
|
||||||
begin
|
begin
|
||||||
page_ := docx_to_pdf_.GetNextPage(page_);
|
last_page_ := docx_to_pdf_.GetNextPage(last_page_);
|
||||||
if ifnil(page_) then page_ := docx_to_pdf_.AddTSPage();
|
if ifnil(last_page_) then last_page_ := docx_to_pdf_.AddTSPage();
|
||||||
point := docx_to_pdf_.GetCurrentTextPoint();
|
point := docx_to_pdf_.GetCurrentTextPoint();
|
||||||
{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
|
if {self.}TSTrPr.TrPr.TrHeight.HRule <> "exact" and {self.}DynamicHeight > {self.}FixedHeight then
|
||||||
begin
|
begin
|
||||||
region.RectangleRange.FixedHeight := {self.}DynamicHeight;
|
region.BordersRange.FixedHeight := {self.}DynamicHeight;
|
||||||
{self.}FixedHeight := {self.}DynamicHeight;
|
{self.}FixedHeight := {self.}DynamicHeight;
|
||||||
end
|
end
|
||||||
if not {self.}VMerge and {self.}DynamicHeight > {self.}TSTrPr.Height then
|
if not {self.}Tc.TcPr.VMerge and {self.}DynamicHeight > {self.}TSTrPr.Height then
|
||||||
{self.}TSTrPr.Height := {self.}DynamicHeight;
|
{self.}TSTrPr.Height := {self.}DynamicHeight;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -128,7 +137,8 @@ begin
|
||||||
for _,region in region_array_ do
|
for _,region in region_array_ do
|
||||||
begin
|
begin
|
||||||
if _ = 0 and {self.}RemoveFlag then continue;
|
if _ = 0 and {self.}RemoveFlag then continue;
|
||||||
region.RectangleRange.Do();
|
// println("Row = {}, Col = {}", {self.}Row, {self.}Col);
|
||||||
|
region.BordersRange.Do();
|
||||||
for _,range in region.RangeArr do
|
for _,range in region.RangeArr do
|
||||||
range.Do();
|
range.Do();
|
||||||
end
|
end
|
||||||
|
|
@ -136,57 +146,62 @@ end;
|
||||||
|
|
||||||
function TSPdfCellRange.SetTSPage(page: TSPage);
|
function TSPdfCellRange.SetTSPage(page: TSPage);
|
||||||
begin
|
begin
|
||||||
page_ := page;
|
last_page_ := page;
|
||||||
{self.}TSPage := page;
|
{self.}TSPage := page;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.AlignHeight(height: real);
|
function TSPdfCellRange.AlignHeight(height: real);
|
||||||
begin
|
begin
|
||||||
if {self.}TSTrPr.Height > height then height := {self.}TSTrPr.Height;
|
|
||||||
region := region_array_[0];
|
region := region_array_[0];
|
||||||
surplus := height - ({self.}StartY - {self.}LowerBound);
|
y_lowerbound := {self.}StartY - {self.}LowerBound;
|
||||||
|
surplus := height - y_lowerbound;
|
||||||
if surplus < 1e-6 then
|
if surplus < 1e-6 then
|
||||||
begin
|
begin
|
||||||
region.RectangleRange.DynamicHeight := height;
|
region.BordersRange.DynamicHeight := height;
|
||||||
if {self.}TSTrPr.Height then region.RectangleRange.DynamicHeight := {self.}TSTrPr.Height;
|
{self.}SetBorderRange(region.BordersRange);
|
||||||
{self.}EndY := {self.}StartY - region.RectangleRange.DynamicHeight;
|
{self.}EndY := {self.}StartY - region.BordersRange.DynamicHeight;
|
||||||
return;
|
return;
|
||||||
end
|
end
|
||||||
region.RectangleRange.DynamicHeight := {self.}StartY - {self.}LowerBound;
|
region.BordersRange.DynamicHeight := y_lowerbound;
|
||||||
arr := region.RangeArr;
|
arr := region.RangeArr;
|
||||||
region.RangeArr := array();
|
region.RangeArr := array();
|
||||||
hash := array(region.RectangleRange.TSPage.Index: region);
|
hash := array(region.BordersRange.TSPage.Index: region);
|
||||||
page_ := {self.}TSPage;
|
last_page_ := {self.}TSPage;
|
||||||
[x, y] := docx_to_pdf_.CalculateTextCoordinates();
|
[x, y] := docx_to_pdf_.CalculateTextCoordinates();
|
||||||
ftr_point := docx_to_pdf_.GetCurrentFtrPoint();
|
ftr_point := docx_to_pdf_.GetCurrentFtrPoint();
|
||||||
span := y - ftr_point.Y;
|
span := y - ftr_point.Y;
|
||||||
while surplus > span do
|
while surplus > span do
|
||||||
begin
|
begin
|
||||||
page_ := docx_to_pdf_.GetNextPage(page_);
|
last_page_ := docx_to_pdf_.GetNextPage(last_page_);
|
||||||
region := new Region();
|
region := new Region();
|
||||||
region.RectangleRange.EndX := {self.}StartX;
|
region.BordersRange.EndX := {self.}StartX;
|
||||||
region.RectangleRange.EndY := y;
|
region.BordersRange.EndY := y;
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.BordersRange.Width := {self.}Width;
|
||||||
region.RectangleRange.DynamicHeight := span;
|
region.BordersRange.DynamicHeight := span;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.BordersRange.TSPage := last_page_;
|
||||||
region.RectangleRange.TcPr := tc_.TcPr;
|
region.BordersRange.TcPr := tc_pr_unit_decorator_;
|
||||||
|
region.BordersRange.Top := true;
|
||||||
|
region.BordersRange.Bottom := true;
|
||||||
|
{self.}SetBorderRange(region.BordersRange);
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
surplus -= span;
|
surplus -= span;
|
||||||
hash[region.RectangleRange.TSPage.Index] := region;
|
hash[region.BordersRange.TSPage.Index] := region;
|
||||||
end
|
end
|
||||||
if surplus > 1e-6 then
|
if surplus > 1e-6 then
|
||||||
begin
|
begin
|
||||||
page_ := docx_to_pdf_.GetNextPage(page_);
|
last_page_ := docx_to_pdf_.GetNextPage(last_page_);
|
||||||
region := new Region();
|
region := new Region();
|
||||||
region.RectangleRange.EndX := {self.}StartX;
|
region.BordersRange.EndX := {self.}StartX;
|
||||||
region.RectangleRange.EndY := y;
|
region.BordersRange.EndY := y;
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.BordersRange.Width := {self.}Width;
|
||||||
region.RectangleRange.DynamicHeight := surplus;
|
region.BordersRange.DynamicHeight := surplus;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.BordersRange.TSPage := last_page_;
|
||||||
region.RectangleRange.TcPr := tc_.TcPr;
|
region.BordersRange.TcPr := tc_pr_unit_decorator_;
|
||||||
|
region.BordersRange.Top := true;
|
||||||
|
{self.}SetBorderRange(region.BordersRange);
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
hash[region.RectangleRange.TSPage.Index] := region;
|
hash[region.BordersRange.TSPage.Index] := region;
|
||||||
{self.}EndY := region.RectangleRange.EndY - surplus;
|
{self.}EndY := region.BordersRange.EndY - surplus;
|
||||||
end
|
end
|
||||||
for _,range in arr do
|
for _,range in arr do
|
||||||
begin
|
begin
|
||||||
|
|
@ -204,7 +219,7 @@ end;
|
||||||
|
|
||||||
function TSPdfCellRange.GetLastPage();
|
function TSPdfCellRange.GetLastPage();
|
||||||
begin
|
begin
|
||||||
return page_;
|
return last_page_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.SetVAlign();
|
function TSPdfCellRange.SetVAlign();
|
||||||
|
|
@ -214,31 +229,21 @@ begin
|
||||||
arr := region.RangeArr;
|
arr := region.RangeArr;
|
||||||
if length(arr) = 0 then return;
|
if length(arr) = 0 then return;
|
||||||
last_y := arr[length(arr)-1].EndY;
|
last_y := arr[length(arr)-1].EndY;
|
||||||
offset := last_y - (region.RectangleRange.EndY - region.RectangleRange.DynamicHeight) - tbl_pr_.TblCellMar.Bottom.W;
|
offset := last_y - (region.BordersRange.EndY - region.BordersRange.DynamicHeight) - tbl_pr_.TblCellMar.Bottom.W;
|
||||||
case val of
|
case val of
|
||||||
"center":
|
"center":
|
||||||
begin
|
begin
|
||||||
offset /= 2;
|
offset /= 2;
|
||||||
for _,range in arr do
|
for _,range in arr do
|
||||||
range.AdjustRangeOffset(region.RectangleRange.TSPage, nil, -offset);
|
range.AdjustRangeOffset(region.BordersRange.TSPage, nil, -offset);
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.IsSamePage(): boolean;
|
|
||||||
begin
|
|
||||||
return page_ = {self.}TSPage;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfCellRange.FirstValidTSPage(): TSPage;
|
|
||||||
begin
|
|
||||||
return region_array_[0].RangeArr[0].TSPage;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfCellRange.IsReComputeByCantSplit(): boolean;
|
function TSPdfCellRange.IsReComputeByCantSplit(): boolean;
|
||||||
begin
|
begin
|
||||||
if {self.}VMerge then return false;
|
if {self.}Tc.TcPr.VMerge then return false;
|
||||||
return {self.}TSTrPr.TrPr.CantSplit and page_ <> {self.}TSPage;
|
return {self.}TSTrPr.TrPr.CantSplit and last_page_ <> {self.}TSPage;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.IfRemoveEmptyRectangle(): boolean;
|
function TSPdfCellRange.IfRemoveEmptyRectangle(): boolean;
|
||||||
|
|
@ -253,3 +258,92 @@ begin
|
||||||
else if ({self.}Row + 1) % 2 = 0 then return "band1Horz";
|
else if ({self.}Row + 1) % 2 = 0 then return "band1Horz";
|
||||||
else return "band2Horz";
|
else return "band2Horz";
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TSPdfCellRange.SetBorderRange(range: TSPdfBordersRange);
|
||||||
|
begin
|
||||||
|
if top_ then range.Top := true;
|
||||||
|
if ifObj(tbl_pr_.TblBorders) then
|
||||||
|
begin
|
||||||
|
if {self.}Row = 0 then
|
||||||
|
begin
|
||||||
|
if tbl_pr_.TblBorders.Top then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Top.Copy(tbl_pr_.TblBorders.Top);
|
||||||
|
range.Top := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.InsideH and {self.}VMerge <> parent_.Rows()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Bottom.Copy(tbl_pr_.TblBorders.InsideH);
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.InsideV and {self.}Col <> parent_.Cols()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Right.Copy(tbl_pr_.TblBorders.InsideV);
|
||||||
|
range.Right := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.Bottom and {self.}VMerge = parent_.Rows()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Bottom.Copy(tbl_pr_.TblBorders.Bottom);
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if {self.}Row = parent_.Rows()-1 then
|
||||||
|
begin
|
||||||
|
if tbl_pr_.TblBorders.Bottom then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Bottom.Copy(tbl_pr_.TblBorders.Bottom);
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.InsideV and {self.}Col <> parent_.Cols()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Right.Copy(tbl_pr_.TblBorders.InsideV);
|
||||||
|
range.Right := true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if tbl_pr_.TblBorders.Bottom and {self.}VMerge = parent_.Rows()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Bottom.Copy(tbl_pr_.TblBorders.Bottom);
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.InsideH and {self.}VMerge <> parent_.Rows()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Bottom.Copy(tbl_pr_.TblBorders.InsideH);
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
if tbl_pr_.TblBorders.InsideV and {self.}Col <> parent_.Cols()-1 then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Right.Copy(tbl_pr_.TblBorders.InsideV);
|
||||||
|
range.Right := true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if {self.}Col = 0 then
|
||||||
|
begin
|
||||||
|
if tbl_pr_.TblBorders.Left then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Left.Copy(tbl_pr_.TblBorders.Left);
|
||||||
|
range.Left := true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if {self.}Col = parent_.Cols()-1 then
|
||||||
|
begin
|
||||||
|
if tbl_pr_.TblBorders.Right then
|
||||||
|
begin
|
||||||
|
tc_pr_unit_decorator_.TcBorders.Right.Copy(tbl_pr_.TblBorders.Right);
|
||||||
|
range.Right := true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
range.Left := {self.}Col = 0;
|
||||||
|
range.Top := {self.}Row = 0;
|
||||||
|
range.Right := true;
|
||||||
|
range.Bottom := true;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfCellRange.SetTop();
|
||||||
|
begin
|
||||||
|
top_ := true;
|
||||||
|
end;
|
||||||
|
|
|
||||||
|
|
@ -3,47 +3,51 @@ public
|
||||||
function Create(docx_to_pdf: TSDocxToPdf; pg: TSPage; components: Components; table: Tbl);
|
function Create(docx_to_pdf: TSDocxToPdf; pg: TSPage; components: Components; table: Tbl);
|
||||||
function Do();override;
|
function Do();override;
|
||||||
function Calc();
|
function Calc();
|
||||||
function FirstValidTSPage(): TSPage;
|
|
||||||
function IsSamePage(): boolean;
|
|
||||||
function GetLastPage(): TSPage;
|
function GetLastPage(): TSPage;
|
||||||
|
function Rows(): integer;
|
||||||
|
function Cols(): integer;
|
||||||
|
|
||||||
private
|
private
|
||||||
function GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
function GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
||||||
function CreateTableMatrix(grid_cols: array of GridColUnitDecorator; trs: array of Tr);
|
function CreateTableMatrix(grid_cols: array of GridColUnitDecorator; trs: array of Tr);
|
||||||
function ComputeMatrixCells();
|
function ComputeMatrixCells();
|
||||||
function ResetCoordinates(tbl_pr: TblPr; grid_cols: array of GridCol);
|
function ResetCoordinates(tbl_pr: TblPrUnitDecorator; grid_cols: array of GridCol);
|
||||||
function SetTblPr(tbl_pr: TblPr);
|
function SetTblTblPr(var table: Tbl);
|
||||||
function SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
function SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
||||||
function SetTrPr(var tr_pr: TrPr);
|
function SetTrTrPr(var tr_pr: TrPr);
|
||||||
function SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
function SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
||||||
function SetTcPr(var tc_pr: TcPr);
|
function SetTcTcPr(var tc: Tc);
|
||||||
function SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
function SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
||||||
function SetTblStylePr(var tc_pr: TcPr; type: string);
|
function OverrideTcPrByTblStylePrType(var tc_pr: TcPr; type: string);
|
||||||
|
|
||||||
private
|
private
|
||||||
[weakref]docx_to_pdf_: TSDocxToPdf;
|
[weakref]docx_to_pdf_: TSDocxToPdf;
|
||||||
|
[weakref]last_page_: TSPage;
|
||||||
[weakref]docx_components_ware_: Components;
|
[weakref]docx_components_ware_: Components;
|
||||||
[weakref]table_: Tbl;
|
[weakref]table_: Tbl;
|
||||||
[weakref]page_: TSPage;
|
|
||||||
tbl_pr_unit_decorator_: TblPrUnitDecorator;
|
tbl_pr_unit_decorator_: TblPrUnitDecorator;
|
||||||
cell_range_array_: tableArray;
|
ts_trpr_array_: array of TSTrProperty;
|
||||||
tr_array_: array of TSTrProperty;
|
cell_range_matrix_: array of TSPdfCellRange;
|
||||||
|
rows_: integer;
|
||||||
|
cols_: integer;
|
||||||
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);
|
||||||
begin
|
begin
|
||||||
docx_to_pdf_ := docx_to_pdf;
|
docx_to_pdf_ := docx_to_pdf;
|
||||||
page_ := pg;
|
last_page_ := pg;
|
||||||
docx_components_ware_ := Components;
|
docx_components_ware_ := Components;
|
||||||
table_ := table;
|
table_ := table;
|
||||||
cell_range_array_ := array();
|
ts_trpr_array_ := array();
|
||||||
tr_array_ := array();
|
cell_range_matrix_ := array();
|
||||||
{self.}TSPage := page_;
|
rows_ := 0;
|
||||||
|
cols_ := 0;
|
||||||
|
{self.}TSPage := last_page_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.Calc();
|
function TSPdfTableRange.Calc();
|
||||||
begin
|
begin
|
||||||
{self.}SetTblPr(table_.TblPr);
|
{self.}SetTblTblPr(table_);
|
||||||
tbl_pr_unit_decorator_ := new TblPrUnitDecorator(table_.TblPr);
|
tbl_pr_unit_decorator_ := new TblPrUnitDecorator(table_.TblPr);
|
||||||
grid_cols := table_.TblGrid.GridCols();
|
grid_cols := table_.TblGrid.GridCols();
|
||||||
for i:=0 to length(grid_cols)-1 do
|
for i:=0 to length(grid_cols)-1 do
|
||||||
|
|
@ -57,13 +61,14 @@ end;
|
||||||
|
|
||||||
function TSPdfTableRange.Do();override;
|
function TSPdfTableRange.Do();override;
|
||||||
begin
|
begin
|
||||||
for _,row in cell_range_array_ do
|
for _,row in cell_range_matrix_ do
|
||||||
begin
|
begin
|
||||||
flag := nil;
|
flag := nil;
|
||||||
for __,range in row do
|
for __,range in row do
|
||||||
begin
|
begin
|
||||||
if ifnil(flag) and ifObj(range) then flag := range.IfRemoveEmptyRectangle();
|
if ifnil(flag) and ifObj(range) then flag := range.IfRemoveEmptyRectangle();
|
||||||
if not ifObj(range) or flag <> range.IfRemoveEmptyRectangle() then
|
if ifnil(range) then continue;
|
||||||
|
if flag <> range.IfRemoveEmptyRectangle() then
|
||||||
begin
|
begin
|
||||||
flag := false;
|
flag := false;
|
||||||
break;
|
break;
|
||||||
|
|
@ -83,6 +88,9 @@ end;
|
||||||
function TSPdfTableRange.GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
function TSPdfTableRange.GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
||||||
begin
|
begin
|
||||||
trs := table_.Trs();
|
trs := table_.Trs();
|
||||||
|
rows_ := length(trs);
|
||||||
|
cols_ := length(grid_cols);
|
||||||
|
cell_range_matrix_ := nils(rows_, cols_);
|
||||||
// 先构建一个矩阵
|
// 先构建一个矩阵
|
||||||
{self.}CreateTableMatrix(grid_cols, trs);
|
{self.}CreateTableMatrix(grid_cols, trs);
|
||||||
// 遍历矩阵后进行计算合并
|
// 遍历矩阵后进行计算合并
|
||||||
|
|
@ -91,159 +99,150 @@ end;
|
||||||
|
|
||||||
function TSPdfTableRange.CreateTableMatrix(grid_cols: array of GridColUnitDecorator; trs: array of Tr);
|
function TSPdfTableRange.CreateTableMatrix(grid_cols: array of GridColUnitDecorator; trs: array of Tr);
|
||||||
begin
|
begin
|
||||||
vmerge_arr := array();
|
|
||||||
for i,tr in trs do
|
for i,tr in trs do
|
||||||
begin
|
begin
|
||||||
{self.}SetTrPr(tr.TrPr);
|
{self.}SetTrTrPr(tr);
|
||||||
tr_pr := new TrPrUnitDecorator(tr.TrPr);
|
tr_pr := new TrPrUnitDecorator(tr.TrPr);
|
||||||
tc_h := tr_pr.TrHeight.Val;
|
|
||||||
tc_x := {self.}EndX;
|
tc_x := {self.}EndX;
|
||||||
tcs := tr.Tcs();
|
tcs := tr.Tcs();
|
||||||
pos := 0;
|
|
||||||
trp := new TSTrProperty();
|
trp := new TSTrProperty();
|
||||||
trp.TrPr := tr_pr;
|
trp.TrPr := tr_pr;
|
||||||
tr_array_[i] := trp;
|
ts_trpr_array_[i] := trp;
|
||||||
|
pos := 0;
|
||||||
for j,tc in tcs do
|
for j,tc in tcs do
|
||||||
begin
|
begin
|
||||||
{self.}SetTcPr(tc.TcPr);
|
{self.}SetTcTcPr(tc);
|
||||||
if i = 0 then {self.}SetTblStylePr(tc.TcPr, "firstRow");
|
if i = 0 then {self.}OverrideTcPrByTblStylePrType(tc.TcPr, "firstRow");
|
||||||
else if (i + 1) % 2 = 0 then {self.}SetTblStylePr(tc.TcPr, "band1Horz");
|
else if i = length(trs)-1 then {self.}OverrideTcPrByTblStylePrType(tc.TcPr, "lastRow")
|
||||||
else {self.}SetTblStylePr(tc.TcPr, "band2Horz");
|
else if (i + 1) % 2 = 0 then {self.}OverrideTcPrByTblStylePrType(tc.TcPr, "band1Horz");
|
||||||
vmerge := tc.TcPr.XmlChildVMerge.Val ? tc.TcPr.XmlChildVMerge.Val : tc.TcPr.VMerge;
|
else {self.}OverrideTcPrByTblStylePrType(tc.TcPr, "band2Horz");
|
||||||
if vmerge = "restart" then
|
|
||||||
|
grid_span := new GridSpanUnitDecorator(tc.TcPr.GridSpan);
|
||||||
|
if tc.TcPr.VMerge and tc.TcPr.VMerge <> "restart" then
|
||||||
begin
|
begin
|
||||||
if ifarray(vmerge_arr[pos]) then cell_range_array_[vmerge_arr[pos][0]][pos].VMerge := vmerge_arr[pos][1];
|
tc_x += grid_cols[pos++].W;
|
||||||
vmerge_arr[pos] := array(i, 0);
|
|
||||||
end
|
|
||||||
else if vmerge then
|
|
||||||
begin
|
|
||||||
vmerge_arr[pos][1]++;
|
|
||||||
cell_range_array_[i][pos] := 0;
|
|
||||||
tc_x += grid_cols[pos].W;
|
|
||||||
grid_span := new GridSpanUnitDecorator(tc.TcPr.GridSpan);
|
|
||||||
pos++;
|
|
||||||
for k:=grid_span.Val-1 downto 1 do
|
for k:=grid_span.Val-1 downto 1 do
|
||||||
tc_x += grid_cols[pos++].W;
|
tc_x += grid_cols[pos++].W;
|
||||||
continue;
|
continue;
|
||||||
end
|
end
|
||||||
else if ifarray(vmerge_arr[pos]) then
|
cell_range := new TSPdfCellRange(self, docx_to_pdf_, last_page_, docx_components_ware_, tc, tbl_pr_unit_decorator_, trp);
|
||||||
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_, 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;
|
||||||
cell_range.FixedHeight := tc_h;
|
cell_range.FixedHeight := tr_pr.TrHeight.Val;
|
||||||
cell_range.Row := i;
|
cell_range.Row := i;
|
||||||
cell_range.Col := j;
|
cell_range.Col := pos;
|
||||||
cell_range_array_[i][pos] := cell_range;
|
cell_range_matrix_[i][pos] := cell_range;
|
||||||
grid_span := new GridSpanUnitDecorator(tc.TcPr.GridSpan);
|
|
||||||
pos++;
|
pos++;
|
||||||
for k:=grid_span.Val-1 downto 1 do
|
for k:=grid_span.Val-1 downto 1 do
|
||||||
cell_range.Width += grid_cols[pos++].W;
|
cell_range.Width += grid_cols[pos++].W;
|
||||||
tc_x += cell_range.Width;
|
tc_x += cell_range.Width;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for pos,arr in vmerge_arr do
|
|
||||||
if ifarray(arr) then
|
|
||||||
cell_range_array_[arr[0]][pos].VMerge := arr[1];
|
|
||||||
|
|
||||||
// for i,arr in cell_range_array_ do
|
// for i,arr in cell_range_matrix_ do
|
||||||
// begin
|
// println("i = {}, arr = {}", i, arr);
|
||||||
// println("i = {}, tr = {}", i, tr_array_[i]);
|
// println("\n");
|
||||||
// println("i = {}, len = {}, arr = {}", i, length(arr), arr);
|
|
||||||
// end
|
|
||||||
return;
|
return;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.ComputeMatrixCells();
|
function TSPdfTableRange.ComputeMatrixCells();
|
||||||
begin
|
begin
|
||||||
i := 0;
|
i := 0;
|
||||||
vmerge_arr := array();
|
merge_arr := array();
|
||||||
row_height := array();
|
vmerge_height := array();
|
||||||
while i < length(cell_range_array_) do
|
while i < rows_ do
|
||||||
begin
|
begin
|
||||||
|
j := 0;
|
||||||
tc_y := {self.}EndY;
|
tc_y := {self.}EndY;
|
||||||
max_height := 0;
|
|
||||||
recompute_flag := false;
|
recompute_flag := false;
|
||||||
vmerge_flag_arr := array();
|
while j < cols_ do
|
||||||
for j,range in cell_range_array_[i] do
|
|
||||||
begin
|
begin
|
||||||
if range = 0 then
|
range := cell_range_matrix_[i][j];
|
||||||
|
if ifnil(range) then
|
||||||
begin
|
begin
|
||||||
vmerge_arr[j][1]--;
|
j++;
|
||||||
if vmerge_arr[j][1] = 0 then vmerge_flag_arr[length(vmerge_flag_arr)] := j;
|
|
||||||
continue;
|
continue;
|
||||||
end
|
end
|
||||||
range.StartY := tc_y;
|
range.StartY := tc_y;
|
||||||
range.SetTSPage(page_);
|
range.SetTSPage(last_page_);
|
||||||
range.Calc();
|
range.Calc();
|
||||||
if range.IsReComputeByCantSplit() then
|
if range.IsReComputeByCantSplit() then
|
||||||
begin
|
begin
|
||||||
// 调整上一行的下边界
|
// 调整上一行的下边界
|
||||||
arr := cell_range_array_[i - 1];
|
arr := cell_range_matrix_[i-1];
|
||||||
if ifarray then
|
for _,r in arr do
|
||||||
begin
|
begin
|
||||||
for k,range in arr do
|
if ifnil(r) then
|
||||||
begin
|
begin
|
||||||
if range = 0 then
|
pos := i-2;
|
||||||
|
while pos > 0 do
|
||||||
begin
|
begin
|
||||||
pos := i - 2;
|
rr := cell_range_matrix_[pos][_];
|
||||||
while pos > 0 do
|
pos--;
|
||||||
begin
|
if ifnil(rr) then continue;
|
||||||
r := cell_range_array_[pos][k];
|
rr.LowerBound := tc_y;
|
||||||
if r = 0 then continue;
|
break;
|
||||||
r.LowerBound := tc_y;
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
range.LowerBound := tc_y;
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if not ifnil(r) then r.LowerBound := tc_y;
|
||||||
end
|
end
|
||||||
page_ := docx_to_pdf_.GetNextPage(page_);
|
last_page_ := docx_to_pdf_.GetNextPage(last_page_);
|
||||||
[x, y] := docx_to_pdf_.CalculateTextCoordinates();
|
[x, y] := docx_to_pdf_.CalculateTextCoordinates();
|
||||||
{self.}EndY := y;
|
{self.}EndY := y;
|
||||||
|
j := 0;
|
||||||
recompute_flag := true;
|
recompute_flag := true;
|
||||||
|
arr := cell_range_matrix_[i];
|
||||||
|
for _,r in arr do
|
||||||
|
if not ifnil(r) then r.SetTop();
|
||||||
break;
|
break;
|
||||||
end
|
end
|
||||||
if range.VMerge then vmerge_arr[j] := array(i, range.VMerge);
|
if range.Tc.TcPr.VMerge then
|
||||||
if not range.VMerge and range.DynamicHeight > max_height then max_height := range.DynamicHeight;
|
begin
|
||||||
|
b_merge_index := i;
|
||||||
|
e_merge_index := i + 1;
|
||||||
|
while ifnil(cell_range_matrix_[e_merge_index+1][j]) and e_merge_index < rows_-1 do
|
||||||
|
e_merge_index++;
|
||||||
|
merge_arr[e_merge_index][j] := b_merge_index;
|
||||||
|
range.VMerge := e_merge_index;
|
||||||
|
if ifnil(vmerge_height[e_merge_index]) or range.DynamicHeight > vmerge_height[e_merge_index] then
|
||||||
|
vmerge_height[e_merge_index] := range.DynamicHeight;
|
||||||
|
end
|
||||||
|
j++;
|
||||||
end
|
end
|
||||||
if recompute_flag then continue;
|
if recompute_flag then continue;
|
||||||
row_height[i] := max_height;
|
i_height := 0;
|
||||||
for _,col_index in vmerge_flag_arr do
|
for k,v in merge_arr[i] do
|
||||||
begin
|
begin
|
||||||
total_height := max_height;
|
i_height := ts_trpr_array_[i].Height;
|
||||||
row_index := vmerge_arr[col_index][0];
|
r := cell_range_matrix_[v][k];
|
||||||
r := cell_range_array_[row_index][col_index];
|
total_height := 0;
|
||||||
// 统计总高度
|
for index:=v to i-1 do
|
||||||
while row_index <= i-1 do
|
total_height += ts_trpr_array_[index].Height;
|
||||||
total_height += row_height[row_index++];
|
h := vmerge_height[i];
|
||||||
r_height := total_height;
|
if h > total_height + i_height then
|
||||||
if r.DynamicHeight > r_height then r_height := r.DynamicHeight;
|
i_height := h - total_height;
|
||||||
r.AlignHeight(r_height);
|
else
|
||||||
|
h := total_height + i_height;
|
||||||
|
r.AlignHeight(h);
|
||||||
r.SetVAlign();
|
r.SetVAlign();
|
||||||
max_height := r_height - total_height + max_height;
|
|
||||||
end
|
end
|
||||||
for j,range in cell_range_array_[i] do
|
if i_height then ts_trpr_array_[i].Height := i_height;
|
||||||
|
for _,range in cell_range_matrix_[i] do
|
||||||
begin
|
begin
|
||||||
if not ifObj(range) or range.VMerge then continue;
|
if not ifObj(range) or range.Tc.TcPr.VMerge then continue;
|
||||||
range.AlignHeight(max_height);
|
range.AlignHeight(ts_trpr_array_[i].Height);
|
||||||
range.SetVAlign();
|
range.SetVAlign();
|
||||||
{self.}EndY := range.EndY;
|
{self.}EndY := range.EndY;
|
||||||
page_ := range.GetLastPage();
|
last_page_ := range.GetLastPage();
|
||||||
end
|
end
|
||||||
i++;
|
i++;
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTblStylePr(var tc_pr: TcPr; type: string);
|
function TSPdfTableRange.OverrideTcPrByTblStylePrType(var tc_pr: TcPr; type: string);
|
||||||
begin
|
begin
|
||||||
{self.}SetTcPr(tc_pr);
|
// tc_pr应该是经过外层copy的
|
||||||
tbl_style_pr := docx_components_ware_.GetTblStylePrByType(tbl_pr_unit_decorator_.TblStyle.Val, type);
|
tbl_style_pr := docx_components_ware_.GetTblStylePrByType(tbl_pr_unit_decorator_.TblStyle.Val, type);
|
||||||
if tbl_style_pr then tc_pr.Copy(tbl_style_pr.TcPr);
|
if tbl_style_pr then tc_pr.Copy(tbl_style_pr.TcPr);
|
||||||
end;
|
end;
|
||||||
|
|
@ -268,12 +267,12 @@ begin
|
||||||
{self.}Width := total_width;
|
{self.}Width := total_width;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTblPr(var tbl_pr: TblPr);
|
function TSPdfTableRange.SetTblTblPr(var tbl: Tbl);
|
||||||
begin
|
begin
|
||||||
new_tbl_pr := new TblPr();
|
new_tbl_pr := new TblPr();
|
||||||
{self.}SetTblPrByStyleId(new_tbl_pr, tbl_pr.TblStyle.Val);
|
{self.}SetTblPrByStyleId(new_tbl_pr, tbl.TblPr.TblStyle.Val);
|
||||||
new_tbl_pr.Copy(tbl_pr);
|
new_tbl_pr.Copy(tbl.TblPr);
|
||||||
tbl_pr.Copy(new_tbl_pr);
|
tbl.TblPr.Copy(new_tbl_pr);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
function TSPdfTableRange.SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
||||||
|
|
@ -288,15 +287,12 @@ begin
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTrPr(var tr_pr: TrPr);
|
function TSPdfTableRange.SetTrTrPr(var tr: Tr);
|
||||||
begin
|
begin
|
||||||
new_tr_pr := new TrPr();
|
new_tr_pr := new TrPr();
|
||||||
{self.}SetTrPrByStyleId(new_tr_pr, tbl_pr_unit_decorator_.TblStyle.Val);
|
{self.}SetTrPrByStyleId(new_tr_pr, tbl_pr_unit_decorator_.TblStyle.Val);
|
||||||
if ifObj(tr_pr) then
|
new_tr_pr.Copy(tr.TrPr);
|
||||||
begin
|
tr.TrPr.Copy(new_tr_pr);
|
||||||
new_tr_pr.Copy(tr_pr);
|
|
||||||
tr_pr.Copy(new_tr_pr);
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
function TSPdfTableRange.SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
||||||
|
|
@ -311,15 +307,12 @@ begin
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTcPr(var tc_pr: TcPr);
|
function TSPdfTableRange.SetTcTcPr(var tc: Tc);
|
||||||
begin
|
begin
|
||||||
new_tc_pr := new TcPr();
|
new_tc_pr := new TcPr();
|
||||||
{self.}SetTcPrByStyleId(new_tc_pr, tbl_pr_unit_decorator_.TblStyle.Val);
|
{self.}SetTcPrByStyleId(new_tc_pr, tbl_pr_unit_decorator_.TblStyle.Val);
|
||||||
if ifObj(tc_pr) then
|
new_tc_pr.Copy(tc.TcPr);
|
||||||
begin
|
tc.TcPr.Copy(new_tc_pr);
|
||||||
new_tc_pr.Copy(tc_pr);
|
|
||||||
tc_pr.Copy(new_tc_pr);
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
function TSPdfTableRange.SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
||||||
|
|
@ -334,18 +327,17 @@ begin
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.FirstValidTSPage(): TSPage;
|
|
||||||
begin
|
|
||||||
range := cell_range_array_[0][0];
|
|
||||||
return ifObj(range) ? range.TSPage : page_;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfTableRange.IsSamePage(): boolean;
|
|
||||||
begin
|
|
||||||
return page_ = {self.}TSPage;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfTableRange.GetLastPage(): TSPage;
|
function TSPdfTableRange.GetLastPage(): TSPage;
|
||||||
begin
|
begin
|
||||||
return page_;
|
return last_page_;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfTableRange.Rows(): integer;
|
||||||
|
begin
|
||||||
|
return rows_;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfTableRange.Cols(): integer;
|
||||||
|
begin
|
||||||
|
return cols_;
|
||||||
end;
|
end;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
type TSPdfBordersRange = class(TSPdfBasicRange)
|
||||||
|
uses TSColorToolKit;
|
||||||
|
public
|
||||||
|
function Create();
|
||||||
|
function Do();override;
|
||||||
|
public
|
||||||
|
TcPr: TcPr;
|
||||||
|
Left: boolean;
|
||||||
|
Top: boolean;
|
||||||
|
Right: boolean;
|
||||||
|
Bottom: boolean;
|
||||||
|
|
||||||
|
private
|
||||||
|
function SetDash(val: string);
|
||||||
|
function DrawLine(border: Border; x1: real; y1: real; x2: real; y2: real);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfBordersRange.Create();
|
||||||
|
begin
|
||||||
|
class(TSPdfBasicRange).Create();
|
||||||
|
{self.}TcPr := nil;
|
||||||
|
{self.}Left := false;
|
||||||
|
{self.}Top := false;
|
||||||
|
{self.}Right := false;
|
||||||
|
{self.}Bottom := false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfBordersRange.Do();override;
|
||||||
|
begin
|
||||||
|
// println("Left = {}, Top = {}, Right = {}, Bottom = {}, Tl2Br = {}, Tr2Bl = {}", Left, Top, Right, Bottom, Tl2Br, Tr2Bl);
|
||||||
|
if {self.}TcPr.Shd.Fill then
|
||||||
|
begin
|
||||||
|
[r, g, b] := array(0, 0, 0);
|
||||||
|
if {self.}TcPr.Shd.Fill <> "auto" then [r, g, b] := TSColorToolKit.HexToRGB({self.}TcPr.Shd.Fill);
|
||||||
|
{self.}TSPage.PdfPage.SetRGBFill(r/255, g/255, b/255);
|
||||||
|
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
||||||
|
{self.}TSPage.PdfPage.Fill();
|
||||||
|
{self.}TSPage.PdfPage.SetRGBFill(0, 0, 0);
|
||||||
|
{self.}Left := true;
|
||||||
|
end
|
||||||
|
borders := {self.}TcPr.TcBorders;
|
||||||
|
if {self.}Left then
|
||||||
|
{self.}DrawLine(borders.Left, {self.}EndX, {self.}EndY, {self.}EndX, {self.}EndY - {self.}DynamicHeight);
|
||||||
|
if {self.}Top then
|
||||||
|
{self.}DrawLine(borders.Top, {self.}EndX, {self.}EndY, {self.}EndX + {self.}Width, {self.}EndY);
|
||||||
|
if {self.}Right then
|
||||||
|
{self.}DrawLine(borders.Right, {self.}EndX + {self.}Width, {self.}EndY, {self.}EndX + {self.}Width, {self.}EndY - {self.}DynamicHeight);
|
||||||
|
if {self.}Bottom then
|
||||||
|
{self.}DrawLine(borders.Bottom, {self.}EndX, {self.}EndY - {Self.}DynamicHeight, {self.}EndX + {self.}Width, {self.}EndY - {self.}DynamicHeight);
|
||||||
|
if borders.Tl2Br then
|
||||||
|
{self.}DrawLine(borders.Tl2Br, {self.}EndX, {self.}Y, {self.}EndX + {self.}Width, {self.}EndY - {self.}DynamicHeight);
|
||||||
|
if borders.Tr2Bl then
|
||||||
|
{self.}DrawLine(borders.Tr2Bl, {self.}EndX + {self.}Width, {self.}Y, {self.}EndX, {self.}EndY - {self.}DynamicHeight);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfBordersRange.SetDash(val: string);
|
||||||
|
begin
|
||||||
|
if val = "single" or ifnil(val) then
|
||||||
|
{self.}TSPage.PdfPage.SetDash(array(), 0, 0);
|
||||||
|
if val = "dashed" then
|
||||||
|
{self.}TSPage.PdfPage.SetDash(array(1), 1, 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfBordersRange.DrawLine(border: Border; x1: real; y1: real; x2: real; y2: real);
|
||||||
|
begin
|
||||||
|
[r, g, b] := array(0, 0, 0);
|
||||||
|
line_width := border.Sz ?: 0.5;
|
||||||
|
{self.}SetDash(border.Val);
|
||||||
|
if border.Color and border.Color <> "auto" then [r, g, b] := TSColorToolKit.HexToRGB(border.Color);
|
||||||
|
{self.}TSPage.PdfPage.SetRGBStroke(r, g, b);
|
||||||
|
{self.}TSPage.PdfPage.SetLineWidth(line_width);
|
||||||
|
{self.}TSPage.PdfPage.MoveTo(x1, y1);
|
||||||
|
{self.}TSPage.PdfPage.LineTo(x2, y2);
|
||||||
|
{self.}TSPage.PdfPage.Stroke();
|
||||||
|
{self.}TSPage.PdfPage.SetRGBStroke(0, 0, 0);
|
||||||
|
end;
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
type TSPdfRectangleRange = class(TSPdfBasicRange)
|
|
||||||
uses TSColorToolKit;
|
|
||||||
public
|
|
||||||
function Create();
|
|
||||||
function Do();override;
|
|
||||||
public
|
|
||||||
TcPr: TcPr;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfRectangleRange.Create();
|
|
||||||
begin
|
|
||||||
class(TSPdfBasicRange).Create();
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSPdfRectangleRange.Do();override;
|
|
||||||
begin
|
|
||||||
// {self.}Page.SetRGBStroke(1.0, 0.0, 0.0);
|
|
||||||
// println("page = {}, endx = {}, endy = {}, DynamicHeight = {}, Width = {}", {self.}Page, {self.}EndX, {self.}EndY, {self.}DynamicHeight, {self.}Width);
|
|
||||||
if {self.}TcPr.Shd.Fill then
|
|
||||||
begin
|
|
||||||
[r, g, b] := array(0, 0, 0);
|
|
||||||
if {self.}TcPr.Shd.Fill <> "auto" then [r, g, b] := TSColorToolKit.HexToRGB({self.}TcPr.Shd.Fill);
|
|
||||||
{self.}TSPage.PdfPage.SetRGBFill(r/255, g/255, b/255);
|
|
||||||
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
|
||||||
{self.}TSPage.PdfPage.Fill();
|
|
||||||
{self.}TSPage.PdfPage.SetRGBFill(0, 0, 0);
|
|
||||||
end
|
|
||||||
{self.}TSPage.PdfPage.SetGrayStroke(0.5);
|
|
||||||
{self.}TSPage.PdfPage.SetLineWidth(0.25);
|
|
||||||
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
|
||||||
{self.}TSPage.PdfPage.Stroke();
|
|
||||||
{self.}TSPage.PdfPage.SetGrayStroke(0);
|
|
||||||
end;
|
|
||||||
|
|
@ -65,6 +65,8 @@ begin
|
||||||
return format("%d", num);
|
return format("%d", num);
|
||||||
else if num_fmt = "chineseCountingThousand" then
|
else if num_fmt = "chineseCountingThousand" then
|
||||||
return {self.}ChineseCountingThousand(num);
|
return {self.}ChineseCountingThousand(num);
|
||||||
|
else
|
||||||
|
return format("%d", num);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSNumberingWare.ChineseCountingThousand(n: integer): string;
|
function TSNumberingWare.ChineseCountingThousand(n: integer): string;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue