fpspreadsheet: xlsx reader supports scaling of header/footer images.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8338 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-07-04 20:27:06 +00:00
parent 802af455b3
commit 8355a48dfd

View File

@ -393,13 +393,15 @@ type
MediaName: String; MediaName: String;
FileName: String; FileName: String;
ImgIndex: Integer; ImgIndex: Integer;
IsHeaderFooter: Boolean;
Worksheet: TsBasicWorksheet; Worksheet: TsBasicWorksheet;
IsHeaderFooter: Boolean;
// This part is for images embedded in to worksheet // This part is for images embedded in to worksheet
FromRow, FromCol, ToRow, ToCol: Cardinal; FromRow, FromCol, ToRow, ToCol: Cardinal;
FromRowOffs, FromColOffs, ToRowOffs, ToColOffs: Double; FromRowOffs, FromColOffs, ToRowOffs, ToColOffs: Double;
// This part is for header/footer images. // This part is for header/footer images.
HFImgPosition: string; // 'LH', 'CH', 'RH', 'LF', 'CF', 'RF'; HFImgPosition: string; // 'LH', 'CH', 'RH', 'LF', 'CF', 'RF';
HFImgWidth: Double;
HFImgHeight: Double;
end; end;
THyperlinkListData = class THyperlinkListData = class
@ -2785,19 +2787,26 @@ begin
begin begin
if data.HFImgPosition <> '' then if data.HFImgPosition <> '' then
begin begin
scaleX := data.HFImgWidth / img.ImageWidth;
scaleY := data.HFImgHeight / img.ImageHeight;
// Scale factor calculation is very inaccurate. We try to round to integers
if (scaleX > 0.99) and SameValue(scaleX, round(scaleX), 0.01) then
scaleX := round(scaleX);
if (scaleY > 0.99) and SameValue(scaleY, round(scaleY), 0.01) then
scaleY := round(scaleY);
pageIdx := HEADER_FOOTER_INDEX_ALL; // wp: Don't know which is the correct index... pageIdx := HEADER_FOOTER_INDEX_ALL; // wp: Don't know which is the correct index...
case data.HFImgPosition[2] of case data.HFImgPosition[2] of
'H': 'H':
case data.HFImgPosition[1] of case data.HFImgPosition[1] of
'L': sheet.PageLayout.AddHeaderImage(pageIdx, hfsLeft, data.ImgIndex); 'L': sheet.PageLayout.AddHeaderImage(pageIdx, hfsLeft, data.ImgIndex, scaleX, scaleY);
'C': sheet.PageLayout.AddHeaderImage(pageIdx, hfsCenter, data.ImgIndex); 'C': sheet.PageLayout.AddHeaderImage(pageIdx, hfsCenter, data.ImgIndex, scaleX, scaleY);
'R': sheet.PageLayout.AddHeaderImage(pageIdx, hfsRight, data.ImgIndex); 'R': sheet.PageLayout.AddHeaderImage(pageIdx, hfsRight, data.ImgIndex, scaleX, scaleY);
end; end;
'F': 'F':
case data.HFImgPosition[1] of case data.HFImgPosition[1] of
'L': sheet.PageLayout.AddFooterImage(pageIdx, hfsLeft, data.ImgIndex); 'L': sheet.PageLayout.AddFooterImage(pageIdx, hfsLeft, data.ImgIndex, scaleX, scaleY);
'C': sheet.PageLayout.AddFooterImage(pageIdx, hfsCenter, data.ImgIndex); 'C': sheet.PageLayout.AddFooterImage(pageIdx, hfsCenter, data.ImgIndex, scaleX, scaleY);
'R': sheet.PageLayout.AddFooterImage(pageIdx, hfsRight, data.ImgIndex); 'R': sheet.PageLayout.AddFooterImage(pageIdx, hfsRight, data.ImgIndex, scaleX, scaleY);
end; end;
end; end;
end; end;
@ -4134,11 +4143,47 @@ end;
specified node which is in a vmlDrawingX.xml file. } specified node which is in a vmlDrawingX.xml file. }
procedure TsSpreadOOXMLReader.ReadVmlDrawing(ANode: TDOMNode; procedure TsSpreadOOXMLReader.ReadVmlDrawing(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet); AWorksheet: TsBasicWorksheet);
function ExtractFromStyle(AStyle, AKey: String): String;
var
sa: TStringArray;
i: Integer;
begin
sa := AStyle.Split(';');
for i := 0 to High(sa) do
if pos(AKey, sa[i]) = 1 then
begin
Result := Copy(sa[i], Length(AKey)+1, MaxInt);
exit;
end;
end;
function ExtractMMFromStyle(AStyle, AKey: String): Double;
var
s, sval, sunit: String;
i: Integer;
begin
s := ExtractFromStyle(AStyle, AKey);
sval := '';
for i := 1 to Length(s) do
if s[i] in ['0'..'9', '.', '+', '-'] then
sval := sval + s[i]
else
sunit := sunit + s[i];
Result := StrToFloat(sval, FPointSeparatorSettings);
case sunit of
'pt': Result := PtsToMM(Result);
'mm': ;
else raise Exception.Create('Unit not supported.');
end;
end;
var var
nodeName: String; nodeName: String;
node: TDOMNode; node: TDOMNode;
relID: String; relID: String;
title: String; title: String;
style: String;
data: TEmbeddedObjData; data: TEmbeddedObjData;
id: String; id: String;
sheetData: TSheetData; sheetData: TSheetData;
@ -4151,10 +4196,12 @@ begin
id := ''; id := '';
relID := ''; relID := '';
title := ''; title := '';
style := '';
nodeName := ANode.NodeName; nodeName := ANode.NodeName;
if nodeName = 'v:shape' then if nodeName = 'v:shape' then
begin begin
id := GetAttrValue(ANode, 'id'); id := GetAttrValue(ANode, 'id');
style := GetAttrValue(ANode, 'style');
node := ANode.FirstChild; node := ANode.FirstChild;
while Assigned(node) do while Assigned(node) do
begin begin
@ -4184,6 +4231,8 @@ begin
data.Worksheet := AWorksheet; data.Worksheet := AWorksheet;
data.IsHeaderFooter := true; data.IsHeaderFooter := true;
data.HFImgPosition := id; data.HFImgPosition := id;
data.HFImgWidth := ExtractMMFromStyle(style, 'width:');
data.HFImgHeight := ExtractMMFromStyle(style, 'height:');
FEmbeddedObjList.Add(data); FEmbeddedObjList.Add(data);
end; end;
end; end;