适配officexml20250925

This commit is contained in:
csh 2025-09-25 17:58:36 +08:00
parent 7da30f77ab
commit 7a46ccf838
4 changed files with 24 additions and 24 deletions

View File

@ -1,5 +1,5 @@
type TSDocxToPdf = class type TSDocxToPdf = class
uses TSPdfEnumerations, DocxML, DocxMLAdapter, DTPModules, DTPUtils, DTPAdvancedRanges; uses TSPdfEnumerations, DocxMLAdapters, DTPModules, DTPAdvancedRanges;
public public
function Create(alias: string; file: string); function Create(alias: string; file: string);
function Destroy(); function Destroy();
@ -48,7 +48,7 @@ private
font_module_: FontModule; // 字体模块 font_module_: FontModule; // 字体模块
sect_module_array_: array of SectModule; // 页面布局模块数组 sect_module_array_: array of SectModule; // 页面布局模块数组
current_sect_module_: SectModule; current_sect_module_: SectModule;
current_sect_pr_adapter_: SectPrAdapter; current_sect_pr_adapter_: SectPr; // DocxMLAdapters.SectPr
page_manager_module_: PageManagerModule; page_manager_module_: PageManagerModule;
current_page_: Page; current_page_: Page;
@ -113,7 +113,7 @@ begin
if current_sect_module_ <> sect_module then if current_sect_module_ <> sect_module then
begin begin
current_sect_module_ := sect_module; current_sect_module_ := sect_module;
current_sect_pr_adapter_ := new SectPrAdapter(current_sect_module_.SectPr); current_sect_pr_adapter_ := new DocxMLAdapters.SectPr(current_sect_module_.SectPr);
{self.}AddPage(true); {self.}AddPage(true);
end end
@ -232,7 +232,7 @@ begin
else if not even_and_odd_flag_ then else if not even_and_odd_flag_ then
type_name := "default"; type_name := "default";
else if not odd(current_page_.Index) then else if not odd(current_page_.Index) then
type_name := "even" type_name := "even";
else else
type_name := "default"; type_name := "default";
@ -273,7 +273,7 @@ begin
xml_file_ := rel.Target; xml_file_ := rel.Target;
w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left; w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left;
ftr_range := new FtrRange(self, ftr); ftr_range := new DTPAdvancedRanges.FtrRange(self, ftr);
ftr_range.Width := w; ftr_range.Width := w;
ftr_range.Parent := self; ftr_range.Parent := self;
ftr_range.LowerBound := 0; ftr_range.LowerBound := 0;
@ -304,7 +304,7 @@ begin
xml_file_ := rel.Target; xml_file_ := rel.Target;
w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left; w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left;
hdr_range := new HdrRange(self, hdr); hdr_range := new DTPAdvancedRanges.HdrRange(self, hdr);
hdr_range.Width := w; hdr_range.Width := w;
hdr_range.Parent := self; hdr_range.Parent := self;
hdr_range.LowerBound := 0; hdr_range.LowerBound := 0;
@ -322,7 +322,7 @@ function TSDocxToPdf.RangesSpacing(range: BasicRange);
begin begin
if last_range_ then if last_range_ then
begin begin
if last_range_ is class(PRange) and not ifnil(last_range_.P.PPr.OutlineLvl.Val) and (range is class(TblRange) or ifnil(range.P.PPr.OutlineLvl.Val)) then if last_range_ is class(DTPAdvancedRanges.PRange) and not ifnil(last_range_.P.PPr.OutlineLvl.Val) and (range is class(DTPAdvancedRanges.TblRange) or ifnil(range.P.PPr.OutlineLvl.Val)) then
begin begin
if last_range_.P.PPr.Spacing.AfterAutospacing then if last_range_.P.PPr.Spacing.AfterAutospacing then
begin begin
@ -332,7 +332,7 @@ begin
if y >= 0 then current_page_.TextPoint.Y := y; if y >= 0 then current_page_.TextPoint.Y := y;
end end
end end
if range is class(PRange) and not ifnil(range.P.PPr.OutlineLvl.Val) and (last_range_ is class(TblRange) or ifnil(last_range_.P.PPr.OutlineLvl.Val)) then if range is class(DTPAdvancedRanges.PRange) and not ifnil(range.P.PPr.OutlineLvl.Val) and (last_range_ is class(DTPAdvancedRanges.TblRange) or ifnil(last_range_.P.PPr.OutlineLvl.Val)) then
begin begin
if range.P.PPr.Spacing.BeforeAutospacing then if range.P.PPr.Spacing.BeforeAutospacing then
begin begin
@ -349,7 +349,7 @@ end;
function TSDocxToPdf.TransformP(p: P); function TSDocxToPdf.TransformP(p: P);
begin begin
w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left; w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left;
range := new PRange(self, p); range := new DTPAdvancedRanges.PRange(self, p);
range.Width := w; range.Width := w;
range.Parent := self; range.Parent := self;
range.LowerBound := current_page_.LowerBound; range.LowerBound := current_page_.LowerBound;
@ -366,7 +366,7 @@ end;
function TSDocxToPdf.TransformTbl(tbl: Tbl); function TSDocxToPdf.TransformTbl(tbl: Tbl);
begin begin
w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left; w := current_page_.SectPr.PgSz.W - current_page_.SectPr.PgMar.Right - current_page_.SectPr.PgMar.Left;
range := new TblRange(self, tbl); range := new DTPAdvancedRanges.TblRange(self, tbl);
range.Width := w; range.Width := w;
range.Parent := self; range.Parent := self;
range.LowerBound := current_page_.LowerBound; range.LowerBound := current_page_.LowerBound;

View File

@ -1,6 +1,6 @@
unit DTPAdvancedRanges; unit DTPAdvancedRanges;
interface interface
uses DTPPrimitiveRanges, DTPUtils, DTPModules, SharedML, DocxML, TSPdfEnumerations; uses DTPPrimitiveRanges, DTPUtils, DocxML, TSPdfEnumerations;
type AdvancedRange = class(BasicRange) type AdvancedRange = class(BasicRange)
public public
@ -172,7 +172,7 @@ public
function SetVAlign(); function SetVAlign();
function SetTop(); function SetTop();
property Tc Read tc_; property Tc read tc_;
public public
Row: integer; Row: integer;
@ -1003,6 +1003,7 @@ begin
begin begin
if fld_struct.Arabic then if fld_struct.Arabic then
begin begin
rpr := r.RPr;
if not rpr.Sz.Val then rpr.Sz.Val := rpr.SzCs.Val ? rpr.SzCs.Val : docx_to_pdf_.Font.GetDefaultSz(); if not rpr.Sz.Val then rpr.Sz.Val := rpr.SzCs.Val ? rpr.SzCs.Val : docx_to_pdf_.Font.GetDefaultSz();
font_name := rpr.RFonts.EastAsia ? rpr.RFonts.EastAsia : rpr.RFonts.Ascii; font_name := rpr.RFonts.EastAsia ? rpr.RFonts.EastAsia : rpr.RFonts.Ascii;
font_obj := docx_to_pdf_.Font.GetCNSFont(font_name, rpr.B.IsApplied, rpr.I.IsApplied); font_obj := docx_to_pdf_.Font.GetCNSFont(font_name, rpr.B.IsApplied, rpr.I.IsApplied);
@ -2046,7 +2047,7 @@ begin
for j,tc in tcs do for j,tc in tcs do
begin begin
if i = 0 then {self.}SetTcTcPr(tc, "firstRow"); if i = 0 then {self.}SetTcTcPr(tc, "firstRow");
else if i = length(trs)-1 then {self.}SetTcTcPr(tc, "lastRow") else if i = length(trs)-1 then {self.}SetTcTcPr(tc, "lastRow");
else if (i + 1) % 2 = 0 then {self.}SetTcTcPr(tc, "band1Horz"); else if (i + 1) % 2 = 0 then {self.}SetTcTcPr(tc, "band1Horz");
else {self.}SetTcTcPr(tc, "band2Horz"); else {self.}SetTcTcPr(tc, "band2Horz");

View File

@ -1,6 +1,6 @@
unit DTPModules; unit DTPModules;
interface interface
uses DTPAdvancedRanges, DocxMLAdapter, SharedMLAdapter; uses DTPAdvancedRanges, DocxMLAdapters, SharedMLAdapters;
type DocxComponentsModule = class(DocxComponents) type DocxComponentsModule = class(DocxComponents)
public public
@ -158,7 +158,7 @@ end;
type PageManagerModule = class type PageManagerModule = class
public public
function Create(pdf_file: PdfFile); function Create(pdf_file: PdfFile);
function Operator[](index: uinteger): Page; function operator[](index: uinteger): Page;
function NewPage(): Page; function NewPage(): Page;
function NextPage(page: Page): Page; function NextPage(page: Page): Page;
function Count(): integer; function Count(): integer;
@ -193,7 +193,7 @@ end;
function DocxComponentsModule.GetStylesAdapter(): StylesAdapter; function DocxComponentsModule.GetStylesAdapter(): StylesAdapter;
begin begin
if styles_adapter_ then return styles_adapter_; if styles_adapter_ then return styles_adapter_;
styles_adapter_ := new StylesAdapter({self.}GetStyles()); styles_adapter_ := new DocxMLAdapters.Styles({self.}GetStyles());
return styles_adapter_; return styles_adapter_;
end; end;
@ -201,7 +201,7 @@ function DocxComponentsModule.GetDocumentRelsAdapter(): RelationShipsAdapter;
begin begin
if document_rels_adapter_ then return document_rels_adapter_; if document_rels_adapter_ then return document_rels_adapter_;
{self.}DocumentRels.Deserialize(); {self.}DocumentRels.Deserialize();
document_rels_adapter_ := new RelationShipsAdapter({self.}DocumentRels); document_rels_adapter_ := new SharedMLAdapters.RelationShips({self.}DocumentRels);
return document_rels_adapter_; return document_rels_adapter_;
end; end;
@ -220,7 +220,7 @@ begin
if tbl_style_pr_hash_[style_id][type] then return tbl_style_pr_hash_[style_id][type]; if tbl_style_pr_hash_[style_id][type] then return tbl_style_pr_hash_[style_id][type];
styles_adapter := {self.}GetStylesAdapter(); styles_adapter := {self.}GetStylesAdapter();
style := styles_adapter.GetStyleByStyleId(style_id); style := styles_adapter.GetStyleByStyleId(style_id);
style := new StyleAdapter(style); style := new DocxMLAdapters.Style(style);
tbl_style_pr := style.GetTblStylePrByType(type); tbl_style_pr := style.GetTblStylePrByType(type);
tbl_style_pr_hash_[style_id][type] := tbl_style_pr; tbl_style_pr_hash_[style_id][type] := tbl_style_pr;
return tbl_style_pr; return tbl_style_pr;
@ -254,7 +254,7 @@ begin
index := replaceStr(replaceStr(target, "header", ""), ".xml", ""); index := replaceStr(replaceStr(target, "header", ""), ".xml", "");
obj := {self.}HeaderRels(strtoint(index)); obj := {self.}HeaderRels(strtoint(index));
obj.Deserialize(); obj.Deserialize();
rels_adapter := new RelationShipsAdapter(obj); rels_adapter := new SharedMLAdapters.RelationShips(obj);
hdr_rel_hash_[target] := rels_adapter; hdr_rel_hash_[target] := rels_adapter;
return rels_adapter; return rels_adapter;
end; end;
@ -265,7 +265,7 @@ begin
index := replaceStr(replaceStr(target, "footer", ""), ".xml", ""); index := replaceStr(replaceStr(target, "footer", ""), ".xml", "");
obj := {self.}FooterRels(strtoint(index)); obj := {self.}FooterRels(strtoint(index));
obj.Deserialize(); obj.Deserialize();
rels_adapter := new RelationShipsAdapter(obj); rels_adapter := new SharedMLAdapters.RelationShips(obj);
ftr_rel_hash_[target] := rels_adapter; ftr_rel_hash_[target] := rels_adapter;
return rels_adapter; return rels_adapter;
end; end;
@ -276,7 +276,7 @@ begin
obj := {self.}Footnotes; obj := {self.}Footnotes;
obj.Deserialize(); obj.Deserialize();
obj.ConvertToPoint(); obj.ConvertToPoint();
footnotes_adapter_ := new FootnotesAdapter(obj); footnotes_adapter_ := new DocxMLAdapters.Footnotes(obj);
return footnotes_adapter_; return footnotes_adapter_;
end; end;
@ -504,7 +504,7 @@ end;
// NumberingModule // NumberingModule
function NumberingModule.Create(number: NumberingAdapter); function NumberingModule.Create(number: NumberingAdapter);
begin begin
numbering_adapter_ := new NumberingAdapter(number); numbering_adapter_ := new DocxMLAdapters.Numbering(number);
num_hash_ := array(); num_hash_ := array();
end; end;
@ -656,7 +656,7 @@ begin
page_array_ := array(); page_array_ := array();
end; end;
function Operator PageManagerModule.[](index: uinteger): Page; function operator PageManagerModule.[](index: uinteger): Page;
begin begin
return page_array_[index]; return page_array_[index];
end; end;

View File

@ -128,7 +128,6 @@ begin
{self.}EndPage.PdfPage.SetRGBFill(0, 0, 0); {self.}EndPage.PdfPage.SetRGBFill(0, 0, 0);
end end
// println("image = {}, type = {}, x = {}, y = {}, w = {}, h = {}", {self.}image, {self.}Type, {self.}endx, {self.}endy, {self.}width, {self.}DynamicHeight);
if {self.}Type = "emf" then if {self.}Type = "emf" then
{self.}EndPage.PdfPage.DrawEmf({self.}Image, {self.}EndX, {self.}EndY, {self.}Width, {self.}DynamicHeight); {self.}EndPage.PdfPage.DrawEmf({self.}Image, {self.}EndX, {self.}EndY, {self.}Width, {self.}DynamicHeight);
else if {self.}Type = "wmf" then else if {self.}Type = "wmf" then