You've already forked lazarus-ccr
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:
@ -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;
|
||||||
|
Reference in New Issue
Block a user