From 448bbfc7e2c66686bcf92001afc1adb2b758b82e Mon Sep 17 00:00:00 2001 From: csh Date: Thu, 19 Sep 2024 10:48:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E4=BE=9D=E8=B5=96=E7=9A=84OfficeXml?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC=E5=81=9A?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- TSDocxToPdf.tsf | 4 +-- range/Advanced/TSPdfParagraphRange.tsf | 35 +++++++++++++++++++++----- range/Advanced/TSPdfTableRange.tsf | 29 +++++++++++++-------- ware/TSDocxComponentsWare.tsf | 11 ++++++++ 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 169d5e4..b4a1065 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,4 @@ TSDocxToPdf中的[Font](./ware/TSFontWare.tsf)属性是设置转PDF时的一些 1. `office_plugin.dll` 2. [PDF](https://git.mytsl.cn/tinysoft/Pdf)相关包 -3. [Office](https://git.mytsl.cn/tinysoft/Office)相关包 +3. [Office](https://git.mytsl.cn/tinysoft/OfficeXml)相关包 diff --git a/TSDocxToPdf.tsf b/TSDocxToPdf.tsf index 02e7c93..c4c17f7 100644 --- a/TSDocxToPdf.tsf +++ b/TSDocxToPdf.tsf @@ -118,8 +118,8 @@ begin elements := sect_ware.Elements(); for _,element in elements do begin - // if _ = 3 then break; - // if _ <> 4 then continue; + // if _ = 4 then break; + // if _ = 624 then // 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); diff --git a/range/Advanced/TSPdfParagraphRange.tsf b/range/Advanced/TSPdfParagraphRange.tsf index 4ba1206..28c5121 100644 --- a/range/Advanced/TSPdfParagraphRange.tsf +++ b/range/Advanced/TSPdfParagraphRange.tsf @@ -24,10 +24,11 @@ private function BasicRangesToLineRange(): tableArray; function CheckAndAddPage(y: real; offset: real): boolean; function GetUtf8CharLength(byte: string): integer; - function RToTextRange(r: R; link: string); function SplitTextToTextRange(text: string; rpr: RPrUnitDecorator; link: string); + function RToTextRange(r: R; link: string); function RToDrawingRange(r: R); function RAlternateContentToRange(r: R); + function RFootnoteReference(r: R); function SetLinesAlignment(); function ResetCoordinates(); function NewLineRange(): TSPdfLineRange; @@ -118,6 +119,7 @@ begin {self.}CheckAndAddPage({self.}LowerBound, 1); else if ifObj(element.Drawing.XmlNode) then {self.}RToDrawingRange(element); else if ifObj(element.AlternateContent.XmlNode) then {self.}RAlternateContentToRange(element); + else if ifObj(element.FootnoteReference.XmlNode) then {self.}RFootnoteReference(element); else if not fld then {self.}RToTextRange(element, bookmark_name); end else if element.LocalName = "fldSimple" then @@ -261,8 +263,11 @@ begin for _,r in rs do begin if r.FldChar.FldCharType = "begin" then break; - r.RPr := new RPr(); + // TODO:officexml项目是否应该保留赋值接口,如何统一 + r.RPr.Lang.Val := "zh-CN"; + // r.RPr := new RPr(); {self.}SetRPr(r.RPr, ppr_unit_decorator_); + r.RPr.Color.Val := nil; {self.}RToTextRange(r, hyperlink.Anchor); end arr := array(); @@ -502,6 +507,18 @@ begin end end; +function TSPdfParagraphRange.RFootnoteReference(r: R); +begin + id := R.FootnoteReference.Id; + footnotes_adapter := docx_components_ware_.GetFootnotesAdapter(); + footnote := footnotes_adapter.GetFootnoteById(id); + sect_ware := docx_to_pdf_.GetCurrentSectWare(); + w := sect_ware.SectPr.PgSz.W - sect_ware.SectPr.PgMar.Right - sect_ware.SectPr.PgMar.Left; + lb := 0; + [x, y] := docx_to_pdf_.CalculateTextCoordinates(); + // range := new TSPdfParagraphRange(self, page_, docx_components_ware_, ); +end; + function TSPdfParagraphRange.GetXYCordinates(): array of real; begin xml_file := docx_to_pdf_.GetCurrentXmlFile(); @@ -585,8 +602,11 @@ begin new_ppr.RPr.Copy(styles.DocDefaults.RPrDefault.RPr); {self.}SetPPrByStyleId(new_ppr, extra_style_id_); {self.}SetPPrByStyleId(new_ppr, ppr.PStyle.Val); - new_ppr.Copy(ppr); - ppr.Copy(new_ppr); + if ifObj(ppr) then + begin + new_ppr.Copy(ppr); + ppr.Copy(new_ppr); + end end; function TSPdfParagraphRange.SetPPrByStyleId(var ppr: PPr; style_id: string); @@ -609,8 +629,11 @@ begin new_rpr.Copy(styles.DocDefaults.RPrDefault.RPr); {self.}SetRPrByStyleId(new_rpr, ppr.PStyle.Val); {self.}SetRPrByStyleId(new_rpr, rpr.RStyle.Val); - new_rpr.Copy(rpr); - rpr.Copy(new_rpr); + if ifObj(rpr) then + begin + new_rpr.Copy(rpr); + rpr.Copy(new_rpr); + end end; function TSPdfParagraphRange.SetRPrByStyleId(var rpr: RPr; style_id: string); diff --git a/range/Advanced/TSPdfTableRange.tsf b/range/Advanced/TSPdfTableRange.tsf index 467c38a..8447160 100644 --- a/range/Advanced/TSPdfTableRange.tsf +++ b/range/Advanced/TSPdfTableRange.tsf @@ -25,6 +25,7 @@ private [weakref]docx_components_ware_: Components; [weakref]table_: Tbl; [weakref]page_: TSPage; + tbl_pr_unit_decorator_: TblPrUnitDecorator; cell_range_array_: tableArray; end; @@ -41,11 +42,11 @@ end; function TSPdfTableRange.Calc(); begin {self.}SetTblPr(table_.TblPr); - table_.TblPr := new TblPrUnitDecorator(table_.TblPr); + tbl_pr_unit_decorator_ := new TblPrUnitDecorator(table_.TblPr); grid_cols := table_.TblGrid.GridCols(); for i:=0 to length(grid_cols)-1 do grid_cols[i] := new GridColUnitDecorator(grid_cols[i]); - {self.}ResetCoordinates(table_.TblPr, grid_cols); + {self.}ResetCoordinates(tbl_pr_unit_decorator_, grid_cols); {self.}EndX := {self.}StartX; {self.}EndY := {self.}StartY; // 如果是根据内容自适应,应该计算并调整grid_cols的值 @@ -123,7 +124,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, table_.TblPr, tr.TrPr); + cell_range := new TSPdfCellRange(self, docx_to_pdf_, page_, docx_components_ware_, tc, tbl_pr_unit_decorator_, tr.TrPr); cell_range.StartX := tc_x; cell_range.Width := grid_cols[pos].W; cell_range.LowerBound := {self.}LowerBound; @@ -234,7 +235,7 @@ end; function TSPdfTableRange.SetTblStylePr(var tc_pr: TcPr; type: string); begin {self.}SetTcPr(tc_pr); - tbl_style_pr := docx_components_ware_.GetTblStylePrByType(table_.TblPr.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); end; @@ -244,7 +245,7 @@ begin for _,grid_col in grid_cols do total_width += grid_col.W; diff := total_width - {self.}Width; - case tbl_pr.jc.Val of + case tbl_pr.Jc.Val of "center": begin offset := diff/2; @@ -281,9 +282,12 @@ end; function TSPdfTableRange.SetTrPr(var tr_pr: TrPr); begin new_tr_pr := new TrPr(); - {self.}SetTrPrByStyleId(new_tr_pr, table_.TblPr.TblStyle.Val); - new_tr_pr.Copy(tr_pr); - tr_pr.Copy(new_tr_pr); + {self.}SetTrPrByStyleId(new_tr_pr, tbl_pr_unit_decorator_.TblStyle.Val); + if ifObj(tr_pr) then + begin + new_tr_pr.Copy(tr_pr); + tr_pr.Copy(new_tr_pr); + end end; function TSPdfTableRange.SetTrPrByStyleId(var tr_pr: TrPr; style_id: string); @@ -301,9 +305,12 @@ end; function TSPdfTableRange.SetTcPr(var tc_pr: TcPr); begin new_tc_pr := new TcPr(); - {self.}SetTcPrByStyleId(new_tc_pr, table_.TblPr.TblStyle.Val); - new_tc_pr.Copy(tc_pr); - tc_pr.Copy(new_tc_pr); + {self.}SetTcPrByStyleId(new_tc_pr, tbl_pr_unit_decorator_.TblStyle.Val); + if ifObj(tc_pr) then + begin + new_tc_pr.Copy(tc_pr); + tc_pr.Copy(new_tc_pr); + end end; function TSPdfTableRange.SetTcPrByStyleId(var tc_pr: TcPr; style_id: string); diff --git a/ware/TSDocxComponentsWare.tsf b/ware/TSDocxComponentsWare.tsf index b5e6798..2ca7f5e 100644 --- a/ware/TSDocxComponentsWare.tsf +++ b/ware/TSDocxComponentsWare.tsf @@ -10,6 +10,7 @@ public function GetHdr(target: string): Hdr; function GetFtrRelsAdapter(target: string): RelationShipsAdapter; function GetHdrRelsAdapter(target: string): RelationShipsAdapter; + function GetFootnotesAdapter(): FootnotesAdapter; private styles_deserialize_flag_: boolean; @@ -21,6 +22,7 @@ private hdr_hash_: array of Hdr; hdr_rel_hash_: array of RelationShipsAdapter; ftr_rel_hash_: array of RelationShipsAdapter; + footnotes_adapter_: FootnotesAdapter; end; function TSDocxComponentsWare.Create(); @@ -117,3 +119,12 @@ begin ftr_rel_hash_[target] := rels_adapter; return rels_adapter; end; + +function TSDocxComponentsWare.GetFootnotesAdapter(): FootnotesAdapter; +begin + if footnotes_adapter_ then return footnotes_adapter_; + obj := {self.}Footnotes; + obj.Deserialize(); + footnotes_adapter_ := new FootnotesAdapter(); + return footnotes_adapter_; +end;