From eb6e898ed70a3f345a1898a917311ee74129b4dc Mon Sep 17 00:00:00 2001 From: csh Date: Mon, 28 Oct 2024 13:23:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=20fix=E8=B7=A8=E9=A1=B5=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E7=BB=98=E5=88=B6=202.=20=E6=AE=B5=E8=90=BD=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E5=8F=B3=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSDocxToPdf.tsf | 5 +++-- range/Advanced/TSPdfCellRange.tsf | 2 +- range/Advanced/TSPdfLineRange.tsf | 13 +++++++++++++ range/Advanced/TSPdfParagraphRange.tsf | 21 +++++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/TSDocxToPdf.tsf b/TSDocxToPdf.tsf index 1334941..10c5e99 100644 --- a/TSDocxToPdf.tsf +++ b/TSDocxToPdf.tsf @@ -127,7 +127,7 @@ begin // println("_ = {}, xml_file_ = {}", _, xml_file_); 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 = "sdt" then {self.}TransformSdt(sect_ware, element); + else if element.LocalName = "sdt" then {self.}TransformSdt(text_point_, element, w, lb); end end {self.}ProcessNumpages(); @@ -215,6 +215,8 @@ begin "": "●", "": "■", + "": "●", + ); end; @@ -369,7 +371,6 @@ begin {self.}TransformP(point, p, w, lb); end; - function TSDocxToPdf.ProcessNumpages(); begin nums := page_array_[length(page_array_)-1].Number; diff --git a/range/Advanced/TSPdfCellRange.tsf b/range/Advanced/TSPdfCellRange.tsf index 95546e8..72987c1 100644 --- a/range/Advanced/TSPdfCellRange.tsf +++ b/range/Advanced/TSPdfCellRange.tsf @@ -106,7 +106,7 @@ begin end {self.}EndY := cell_y - 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 page_ := docx_to_pdf_.GetNextPage(page_); if ifnil(page_) then page_ := docx_to_pdf_.AddTSPage(); diff --git a/range/Advanced/TSPdfLineRange.tsf b/range/Advanced/TSPdfLineRange.tsf index ccc0155..f59f5c4 100644 --- a/range/Advanced/TSPdfLineRange.tsf +++ b/range/Advanced/TSPdfLineRange.tsf @@ -6,6 +6,7 @@ public function SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real); function Align(jc: string); function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); + function AlignRightBound(right_bound: real); private range_array_: array of TSPdfBasicRange; @@ -68,3 +69,15 @@ begin if not ifnil(y_offset) then range.EndY += y_offset; 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; diff --git a/range/Advanced/TSPdfParagraphRange.tsf b/range/Advanced/TSPdfParagraphRange.tsf index 7c9866d..219ff42 100644 --- a/range/Advanced/TSPdfParagraphRange.tsf +++ b/range/Advanced/TSPdfParagraphRange.tsf @@ -9,6 +9,7 @@ public function GetLastPage(): TSPage; function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); function GetLineRangeArr(): array of TSPdfLineRange; + function Empty(): boolean; private function SetPPr(var ppr: PPr); @@ -37,6 +38,7 @@ private function HyperlinkToToc(); function HyperlinkToTextRange(hyperlink: Hyperlink; ppr: PPrUnitDecorator); function GetXYCordinates(): array of real; + function AlignRightBound(); private [weakref]docx_to_pdf_: TSDocxToPdf; @@ -51,6 +53,8 @@ private placeholder_array_: tableArray; table_style_id_: string; table_style_type_: string; + empty_: boolean; + right_bound_: real; end; type FldStruct = class @@ -117,12 +121,14 @@ begin line_range_array_ := array(); hyperlink_array_ := array(); bookmark_array_ := array(); + empty_ := false; {self.}TSPage := page_; end; function TSPdfParagraphRange.Calc(): tableArray; begin // ppr.rpr是无效的,应该以ppr.pStyle为准 + right_bound_ := {self.}StartX + {self.}Width; if ifnil(paragraph_.XmlChildPPr) then paragraph_.XmlChildPPr := new PPr(); {self.}SetPPr(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); {self.}DynamicHeight += line_space; {self.}EndY -= {self.}DynamicHeight; + empty_ := true; end if placeholder_array_ then return false; {self.}RangesToLines(); @@ -424,6 +431,7 @@ begin end end {self.}SetLinesAlignment(); + {self.}AlignRightBound(); end; function TSPdfParagraphRange.SetLinesAlignment(); @@ -432,6 +440,14 @@ begin line_range.Align(ppr_unit_decorator_.Jc.Val); 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; begin if y - offset < {self.}LowerBound then @@ -855,3 +871,8 @@ function TSPdfParagraphRange.GetLineRangeArr(): array of TSPdfLineRange; begin return line_range_array_; end; + +function TSPdfParagraphRange.Empty(): boolean; +begin + return empty_; +end;