完善对页眉页脚的支持

This commit is contained in:
csh 2024-08-27 15:59:44 +08:00
parent 4c6f4d6e09
commit ca18537538
3 changed files with 21 additions and 9 deletions

View File

@ -234,7 +234,7 @@ begin
page_array_[len] := current_page_; page_array_[len] := current_page_;
// 页眉页脚 // 页眉页脚
if current_page_.Index = 0 then if sect_ware_.SectPr.TitlePg and current_page_.Index = 0 then
type_name := "first"; type_name := "first";
else if not even_and_odd_flag_ then else if not even_and_odd_flag_ then
type_name := "default"; type_name := "default";
@ -267,7 +267,7 @@ function TSDocxToPdf.SetFtr(type: string);
begin begin
ftr_point_.X := sect_ware_.SectPr.PgMar.Left; ftr_point_.X := sect_ware_.SectPr.PgMar.Left;
ftr_point_.Y := sect_ware_.SectPr.PgMar.Bottom; ftr_point_.Y := sect_ware_.SectPr.PgMar.Bottom;
footer_reference := sect_pr_adapter_.GetFooterReferenceByType(type_name); footer_reference := sect_pr_adapter_.GetFooterReferenceByType(type);
if ifObj(footer_reference) then if ifObj(footer_reference) then
begin begin
rels_adapter := docx_components_ware_.GetDocumentRelsAdapter(); rels_adapter := docx_components_ware_.GetDocumentRelsAdapter();
@ -295,7 +295,7 @@ begin
rel := rels_adapter.GetRelationshipById(header_reference.Id); rel := rels_adapter.GetRelationshipById(header_reference.Id);
w := sect_ware_.SectPr.PgSz.W - sect_ware_.SectPr.PgMar.Right - sect_ware_.SectPr.PgMar.Left; w := sect_ware_.SectPr.PgSz.W - sect_ware_.SectPr.PgMar.Right - sect_ware_.SectPr.PgMar.Left;
lb := 0; lb := 0;
obj := docx_components_ware_.GetFtr(rel.Target); obj := docx_components_ware_.GetHdr(rel.Target);
xml_file_ := rel.Target; xml_file_ := rel.Target;
elements := obj.Elements(); elements := obj.Elements();
for _,element in elements do for _,element in elements do

View File

@ -85,13 +85,15 @@ begin
begin begin
empty_flag := false; empty_flag := false;
{self.}SetRPr(element.RPr, ppr_unit_decorator_); {self.}SetRPr(element.RPr, ppr_unit_decorator_);
if element.FldChar.FldCharType = "separate" then if element.FldChar.FldCharType = "begin" then
continue;
else if element.FldChar.FldCharType = "separate" then
fld := true; fld := true;
else if element.FldChar.FldCharType = "end" then else if element.FldChar.FldCharType = "end" then
fld := false; fld := false;
else if element.InstrText.Text = "PAGE \\* Arabic \\* MERGEFORMAT" then else if ifString(element.InstrText.Text) and trim(element.InstrText.Text) = "PAGE \\* Arabic \\* MERGEFORMAT" then
page_number := true; page_number := true;
else if element.InstrText.Text = " NUMPAGES " then else if ifString(element.InstrText.Text) and trim(element.InstrText.Text) = "NUMPAGES" then
numpages := true; numpages := true;
else if fld and page_number then else if fld and page_number then
begin begin
@ -112,6 +114,16 @@ begin
else if ifObj(element.AlternateContent.XmlNode) then {self.}RAlternateContentToRange(element); else if ifObj(element.AlternateContent.XmlNode) then {self.}RAlternateContentToRange(element);
else if not fld then {self.}RToTextRange(element, bookmark_name); else if not fld then {self.}RToTextRange(element, bookmark_name);
end end
else if element.LocalName = "fldSimple" then
begin
if ifString(element.Instr) and trim(element.Instr) = "NUMPAGES \\* Arabic \\* MERGEFORMAT" then
begin
rpr := new RPrUnitDecorator(element.Rs(0).RPr);
numpages_index := length(range_array_);
placeholder_array_ := array(numpages_index, rpr);
numpages := false;
end
end
else if element.LocalName = "hyperlink" then else if element.LocalName = "hyperlink" then
begin begin
empty_flag := false; empty_flag := false;

View File

@ -79,8 +79,8 @@ end;
function TSDocxComponentsWare.GetFtr(target: string): Ftr; function TSDocxComponentsWare.GetFtr(target: string): Ftr;
begin begin
if ftr_hash_[target] then return ftr_hash_[target]; if ftr_hash_[target] then return ftr_hash_[target];
index := replaceStr(replaceStr(target, "header", ""), ".xml", ""); index := replaceStr(replaceStr(target, "footer", ""), ".xml", "");
obj := {self.}Headers(strtoint(index)); obj := {self.}Footers(strtoint(index));
obj.Deserialize(); obj.Deserialize();
ftr_hash_[target] := obj; ftr_hash_[target] := obj;
return obj; return obj;
@ -90,7 +90,7 @@ function TSDocxComponentsWare.GetHdr(target: string): Hdr;
begin begin
if hdr_hash_[target] then return hdr_hash_[target]; if hdr_hash_[target] then return hdr_hash_[target];
index := replaceStr(replaceStr(target, "header", ""), ".xml", ""); index := replaceStr(replaceStr(target, "header", ""), ".xml", "");
obj := {self.}Footers(strtoint(index)); obj := {self.}Headers(strtoint(index));
obj.Deserialize(); obj.Deserialize();
hdr_hash_[target] := obj; hdr_hash_[target] := obj;
return obj; return obj;