1. fix跨页表格绘制

2. 段落支持对齐右边界
This commit is contained in:
csh 2024-10-28 13:23:46 +08:00
parent 4de1484ec3
commit eb6e898ed7
4 changed files with 38 additions and 3 deletions

View File

@ -127,7 +127,7 @@ begin
// println("_ = {}, xml_file_ = {}", _, xml_file_); // println("_ = {}, xml_file_ = {}", _, xml_file_);
if element.LocalName = "p" then {self.}TransformP(text_point_, element, w, lb); if element.LocalName = "p" then {self.}TransformP(text_point_, element, w, lb);
else if element.LocalName = "tbl" then {self.}TransformTbl(text_point_, element, w, lb); else if element.LocalName = "tbl" then {self.}TransformTbl(text_point_, element, w, lb);
else if element.LocalName = "sdt" then {self.}TransformSdt(sect_ware, element); else if element.LocalName = "sdt" then {self.}TransformSdt(text_point_, element, w, lb);
end end
end end
{self.}ProcessNumpages(); {self.}ProcessNumpages();
@ -215,6 +215,8 @@ begin
"": "●", "": "●",
"": "■", "": "■",
"": "●",
); );
end; end;
@ -369,7 +371,6 @@ begin
{self.}TransformP(point, p, w, lb); {self.}TransformP(point, p, w, lb);
end; end;
function TSDocxToPdf.ProcessNumpages(); function TSDocxToPdf.ProcessNumpages();
begin begin
nums := page_array_[length(page_array_)-1].Number; nums := page_array_[length(page_array_)-1].Number;

View File

@ -106,7 +106,7 @@ begin
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 then if {self.}EndY < {self.}LowerBound and not range.Empty() then
begin begin
page_ := docx_to_pdf_.GetNextPage(page_); page_ := docx_to_pdf_.GetNextPage(page_);
if ifnil(page_) then page_ := docx_to_pdf_.AddTSPage(); if ifnil(page_) then page_ := docx_to_pdf_.AddTSPage();

View File

@ -6,6 +6,7 @@ public
function SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real); function SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real);
function Align(jc: string); function Align(jc: string);
function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real);
function AlignRightBound(right_bound: real);
private private
range_array_: array of TSPdfBasicRange; range_array_: array of TSPdfBasicRange;
@ -68,3 +69,15 @@ begin
if not ifnil(y_offset) then range.EndY += y_offset; if not ifnil(y_offset) then range.EndY += y_offset;
end; end;
end; end;
function TSPdfLineRange.AlignRightBound(right_bound: real);
begin
last := range_array_[length(range_array_)-1];
diff := right_bound - (last.EndX + last.Width);
if diff > 1e-6 then
begin
avg := diff / (length(range_array_) - 1);
for i:=1 to length(range_array_)-1 do
range_array_[i].EndX += avg * i;
end
end;

View File

@ -9,6 +9,7 @@ public
function GetLastPage(): TSPage; function GetLastPage(): TSPage;
function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real);
function GetLineRangeArr(): array of TSPdfLineRange; function GetLineRangeArr(): array of TSPdfLineRange;
function Empty(): boolean;
private private
function SetPPr(var ppr: PPr); function SetPPr(var ppr: PPr);
@ -37,6 +38,7 @@ private
function HyperlinkToToc(); function HyperlinkToToc();
function HyperlinkToTextRange(hyperlink: Hyperlink; ppr: PPrUnitDecorator); function HyperlinkToTextRange(hyperlink: Hyperlink; ppr: PPrUnitDecorator);
function GetXYCordinates(): array of real; function GetXYCordinates(): array of real;
function AlignRightBound();
private private
[weakref]docx_to_pdf_: TSDocxToPdf; [weakref]docx_to_pdf_: TSDocxToPdf;
@ -51,6 +53,8 @@ private
placeholder_array_: tableArray; placeholder_array_: tableArray;
table_style_id_: string; table_style_id_: string;
table_style_type_: string; table_style_type_: string;
empty_: boolean;
right_bound_: real;
end; end;
type FldStruct = class type FldStruct = class
@ -117,12 +121,14 @@ begin
line_range_array_ := array(); line_range_array_ := array();
hyperlink_array_ := array(); hyperlink_array_ := array();
bookmark_array_ := array(); bookmark_array_ := array();
empty_ := false;
{self.}TSPage := page_; {self.}TSPage := page_;
end; end;
function TSPdfParagraphRange.Calc(): tableArray; function TSPdfParagraphRange.Calc(): tableArray;
begin begin
// ppr.rpr是无效的应该以ppr.pStyle为准 // ppr.rpr是无效的应该以ppr.pStyle为准
right_bound_ := {self.}StartX + {self.}Width;
if ifnil(paragraph_.XmlChildPPr) then paragraph_.XmlChildPPr := new PPr(); if ifnil(paragraph_.XmlChildPPr) then paragraph_.XmlChildPPr := new PPr();
{self.}SetPPr(paragraph_.PPr); {self.}SetPPr(paragraph_.PPr);
ppr_unit_decorator_ := new PPrUnitDecorator(paragraph_.PPr); ppr_unit_decorator_ := new PPrUnitDecorator(paragraph_.PPr);
@ -200,6 +206,7 @@ begin
line_space := {self.}GetParagraphLineSpace(ppr_unit_decorator_.RPr.Sz.Val, ppr_unit_decorator_.Spacing.Line); line_space := {self.}GetParagraphLineSpace(ppr_unit_decorator_.RPr.Sz.Val, ppr_unit_decorator_.Spacing.Line);
{self.}DynamicHeight += line_space; {self.}DynamicHeight += line_space;
{self.}EndY -= {self.}DynamicHeight; {self.}EndY -= {self.}DynamicHeight;
empty_ := true;
end end
if placeholder_array_ then return false; if placeholder_array_ then return false;
{self.}RangesToLines(); {self.}RangesToLines();
@ -424,6 +431,7 @@ begin
end end
end end
{self.}SetLinesAlignment(); {self.}SetLinesAlignment();
{self.}AlignRightBound();
end; end;
function TSPdfParagraphRange.SetLinesAlignment(); function TSPdfParagraphRange.SetLinesAlignment();
@ -432,6 +440,14 @@ begin
line_range.Align(ppr_unit_decorator_.Jc.Val); line_range.Align(ppr_unit_decorator_.Jc.Val);
end; end;
function TSPdfParagraphRange.AlignRightBound();
begin
len := length(line_range_array_);
if len = 1 then return;
for i:=0 to len-2 do
line_range_array_[i].AlignRightBound(right_bound_);
end;
function TSPdfParagraphRange.CheckAndAddPage(y: real; offset: real): boolean; function TSPdfParagraphRange.CheckAndAddPage(y: real; offset: real): boolean;
begin begin
if y - offset < {self.}LowerBound then if y - offset < {self.}LowerBound then
@ -855,3 +871,8 @@ function TSPdfParagraphRange.GetLineRangeArr(): array of TSPdfLineRange;
begin begin
return line_range_array_; return line_range_array_;
end; end;
function TSPdfParagraphRange.Empty(): boolean;
begin
return empty_;
end;