From 04379619535999f4e996fdc472e4d060edcbf2e1 Mon Sep 17 00:00:00 2001 From: csh Date: Wed, 20 Nov 2024 17:08:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9docx?= =?UTF-8?q?=E9=A1=B5=E7=A0=81=E6=8E=A5=E5=8F=A3`UpdateDocxPageNumpages`?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=8F=8A=E4=BF=9D=E5=AD=98=E4=BF=AE=E6=94=B9?= =?UTF-8?q?docx=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3`SaveDocxFile`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSDocxToPdf.tsf | 46 ++++++++++++++++++++++---- range/Advanced/TSPdfParagraphRange.tsf | 27 +++++++++++---- 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/TSDocxToPdf.tsf b/TSDocxToPdf.tsf index 7e03e33..bad9705 100644 --- a/TSDocxToPdf.tsf +++ b/TSDocxToPdf.tsf @@ -14,13 +14,17 @@ public function GetNextPage(page: TSPage): TSPage; function GetCurrentXmlFile(): string; function AddTSPage(flag: boolean): TSPage; - function AdjustPageNumber(page: TSPage; num: integer); function LinkToToc(anchor: string; page: TSPage; left: real; top: real); function AddToc(anchor: string; toc: TSToc); function SetHeaderAndFooter(); function ProcessNumpages(); function CalculateTextCoordinates(): array of real; function GetSymbol(symbol: string); + function AddDocxPage(pg: TSPage; r: R); + + function UpdateDocxPageNumpages(); + function SaveDocxFile();overload; + function SaveDocxFile(alias: string; file: string);overload; property Font read ReadFont; function ReadFont(); @@ -60,6 +64,9 @@ private even_and_odd_flag_: boolean; xml_file_: string; symbol_: tableArray; + + docx_page_arr_: tableArray; + update_docx_pages_: boolean; end; type Point = class @@ -94,6 +101,9 @@ begin settings := docx_components_ware_.Settings; settings.XmlChildEvenAndOddHeaders.Deserialize(); even_and_odd_flag_ := settings.EvenAndOddHeaders ? true : false; + + docx_page_arr_ := array(); + update_docx_pages_ := false; end; function TSDocxToPdf.Destroy(); @@ -380,12 +390,6 @@ begin end end; -function TSDocxToPdf.AdjustPageNumber(page: TSPage; num: integer); -begin - for i:=page.Index to length(page_array_)-1 do - page_array_[i].Number := num++; -end; - function TSDocxToPdf.GetNextPage(page: TSPage); begin return page_array_[page.Index + 1]; @@ -455,6 +459,13 @@ begin for _,toc in arr do toc.LinkAnnot(dst); toc.AddPageNumber(page); + + if update_docx_pages_ then + begin + r := docx_page_arr_[anchor]; + r.T.Text := page.Number; + r.Serialize(); + end end; function TSDocxToPdf.GetSymbol(symbol: string); @@ -462,3 +473,24 @@ begin // println("symbol = {}, symbol_ = {}", symbol, symbol_); return symbol_[symbol]; end; + +function TSDocxToPdf.AddDocxPage(anchor: string; r: R); +begin + docx_page_arr_[anchor] := r; +end; + +function TSDocxToPdf.UpdateDocxPageNumpages(); +begin + update_docx_pages_ := true; +end; + +function TSDocxToPdf.SaveDocxFile();overload; +begin + return docx_components_ware_.Save(); +end; + +function TSDocxToPdf.SaveDocxFile(alias: string; file: string);overload; +begin + return docx_components_ware_.SaveAs(alias, file); +end; + diff --git a/range/Advanced/TSPdfParagraphRange.tsf b/range/Advanced/TSPdfParagraphRange.tsf index 943ff85..fe4fd0e 100644 --- a/range/Advanced/TSPdfParagraphRange.tsf +++ b/range/Advanced/TSPdfParagraphRange.tsf @@ -316,15 +316,30 @@ function TSPdfParagraphRange.HyperlinkToTextRange(hyperlink: Hyperlink; ppr: PPr begin i := length(range_array_); rs := hyperlink.Rs(); + char_type := false; + separate := false; for _,r in rs do begin - if r.FldChar.FldCharType = "begin" then break; + if r.FldChar.FldCharType = "begin" then char_type := true; // TODO:officexml项目是否应该保留赋值接口,如何统一 - if ifnil(r.XmlChildRPr) then r.XmlChildRPr := new RPr(); - // r.RPr := new RPr(); - {self.}SetRPr(r.RPr, ppr_unit_decorator_); - r.RPr.Color.Val := nil; - {self.}RToTextRange(r, hyperlink.Anchor); + if char_type then + begin + if r.FldChar.FldCharType = "separate" then + begin + separate := true; + continue; + end + if r.FldChar.FldCharType = "end" then + separate := char_type := false; + if separate then + docx_to_pdf_.AddDocxPage(hyperlink.Anchor, r); + end + else begin + if ifnil(r.XmlChildRPr) then r.XmlChildRPr := new RPr(); + {self.}SetRPr(r.RPr, ppr_unit_decorator_); + r.RPr.Color.Val := nil; + {self.}RToTextRange(r, hyperlink.Anchor); + end end arr := array(); while i < length(range_array_) do