diff --git a/components/fpspreadsheet/examples/other/header_footer_images/demo_write_headerfooter_images.lpr b/components/fpspreadsheet/examples/other/header_footer_images/demo_write_headerfooter_images.lpr
index da1230a7b..17edabe8f 100644
--- a/components/fpspreadsheet/examples/other/header_footer_images/demo_write_headerfooter_images.lpr
+++ b/components/fpspreadsheet/examples/other/header_footer_images/demo_write_headerfooter_images.lpr
@@ -10,16 +10,14 @@ var
MyWorkbook: TsWorkbook;
MyWorksheet: TsWorksheet;
MyDir: string;
- cell: PCell;
- i, r, c: Integer;
const
image1 = '../../../images/components/TSWORKBOOKSOURCE.png';
image2 = '../../../images/components/TSWORKSHEETGRID.png';
- image3 = '../../../images/components/TSCELLEDIT.png';
begin
Writeln('Starting program "demo_write_headerfooter_images"...');
+
if not FileExists(image1) then
begin
WriteLn(ExpandFilename(image1) + ' not found.');
@@ -32,12 +30,6 @@ begin
Halt;
end;
- if not FileExists(image3) then
- begin
- WriteLn(ExpandFilename(image3) + ' not found.');
- Halt;
- end;
-
// Create the spreadsheet
MyWorkbook := TsWorkbook.Create;
try
@@ -50,8 +42,8 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet('Sheet 2');
MyWorksheet.WriteText(0, 0, 'The footer of this sheet contains an image');
- MyWorksheet.PageLayout.Footers[HEADER_FOOTER_INDEX_ALL] := '&CFooter with image!';
- MyWorksheet.PageLayout.AddFooterImage(HEADER_FOOTER_INDEX_ALL, hfsRight, image2);
+ MyWorksheet.PageLayout.Footers[HEADER_FOOTER_INDEX_ALL] := '&CFooter with image, scaled by factor 2!';
+ MyWorksheet.PageLayout.AddFooterImage(HEADER_FOOTER_INDEX_ALL, hfsRight, image2, 2.0, 2.0);
// Save the spreadsheet to files
MyDir := ExtractFilePath(ParamStr(0));
diff --git a/components/fpspreadsheet/source/common/fpspagelayout.pas b/components/fpspreadsheet/source/common/fpspagelayout.pas
index 334e6f976..ac53a9b0d 100644
--- a/components/fpspreadsheet/source/common/fpspagelayout.pas
+++ b/components/fpspreadsheet/source/common/fpspagelayout.pas
@@ -55,18 +55,18 @@ type
{ Images embedded in header and/or footer }
function AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
- const AFilename: String): Integer; overload;
+ const AFilename: String; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
function AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
- AStream: TStream): Integer; overload;
+ AStream: TStream; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
procedure AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
- AImageIndex: Integer); overload;
+ AImageIndex: Integer; AScaleX: Double = 1.0; AScaleY: Double = 1.0); overload;
function AddFooterImage(AFooterIndex: Integer; ASection: TsHeaderFooterSectionIndex;
- const AFilename: String): Integer; overload;
+ const AFilename: String; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
function AddFooterImage(AFooterIndex: integer; ASection: TsHeaderFooterSectionIndex;
- AStream: TStream): Integer; overload;
- procedure AddFooterImage(AFooterIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer); overload;
+ AStream: TStream; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
+ procedure AddFooterImage(AFooterIndex: Integer; ASection: TsHeaderFooterSectionIndex;
+ AImageIndex: Integer; AScaleX: Double = 1.0; AScaleY: Double = 1.0); overload;
function JoinHeaderFooterText(const ALeft, ACenter, ARight: String): String;
procedure SplitHeaderFooterText(const AText: String; out ALeft, ACenter, ARight: String);
@@ -277,12 +277,15 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AFileName Name of the file containing the image
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; const AFilename: String): Integer;
+ ASection: TsHeaderFooterSectionIndex; const AFilename: String;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer;
var
book: TsWorkbook;
begin
@@ -293,7 +296,7 @@ begin
if Result = -1 then
Result := book.AddEmbeddedObj(AFilename);
if Result > -1 then
- AddHeaderImage(AHeaderIndex, ASection, Result);
+ AddHeaderImage(AHeaderIndex, ASection, Result, AScaleX, AScaleY);
end;
{@@ ----------------------------------------------------------------------------
@@ -305,12 +308,15 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AStream Stream from which the image is read and copied
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; AStream: TStream): Integer;
+ ASection: TsHeaderFooterSectionIndex; AStream: TStream;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer;
var
book: TsWorkbook;
begin
@@ -319,7 +325,7 @@ begin
book := TsWorksheet(FWorksheet).Workbook;
Result := book.AddEmbeddedObj(AStream);
if Result > -1 then
- AddHeaderImage(AHeaderIndex, ASection, Result);
+ AddHeaderImage(AHeaderIndex, ASection, Result, AScaleX, AScaleY);
end;
{@@ ----------------------------------------------------------------------------
@@ -331,13 +337,18 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AImageIndex Index of the image data into the workbooks EmbeddedObjList
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
-------------------------------------------------------------------------------}
procedure TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer);
+ ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0);
var
s: Array[TsHeaderFooterSectionIndex] of string;
begin
FHeaderImages[ASection].Index := AImageIndex;
+ FHeaderImages[ASection].ScaleX := AScaleX;
+ FHeaderImages[ASection].ScaleY := AScaleY;
SplitHeaderFooterText(FHeaders[AHeaderIndex], s[hfsLeft], s[hfsCenter], s[hfsRight]);
// Add the symbol &G only once!
if (pos('&G', s[ASection]) < 1) or (pos('&g', s[ASection]) < 1) then begin
@@ -355,11 +366,14 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AFilename Name of the file containing the image
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddFooterImage(AFooterIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; const AFileName: String): Integer;
+ ASection: TsHeaderFooterSectionIndex; const AFileName: String;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer;
var
book: TsWorkbook;
begin
@@ -371,7 +385,7 @@ begin
Result := book.AddEmbeddedObj(AFilename);
if Result = -1 then // Image not found? Unsupported file format?
exit;
- AddFooterImage(AFooterIndex, ASection, Result);
+ AddFooterImage(AFooterIndex, ASection, Result, AScaleX, AScaleY);
end;
{@@ ----------------------------------------------------------------------------
@@ -383,11 +397,14 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AStream Stream from which the image is copied
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddFooterImage(AFooterIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; AStream: TStream): Integer;
+ ASection: TsHeaderFooterSectionIndex; AStream: TStream;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer;
var
book: TsWorkbook;
begin
@@ -396,7 +413,7 @@ begin
book := TsWorksheet(FWorksheet).Workbook;
Result := book.AddEmbeddedObj(AStream);
if Result > -1 then
- AddFooterImage(AFooterIndex, ASection, Result);
+ AddFooterImage(AFooterIndex, ASection, Result, AScaleX, AScaleY);
end;
{@@ ----------------------------------------------------------------------------
@@ -408,13 +425,18 @@ end;
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AImageIndex Index of the image data into the workbooks EmbeddedObjList
+ @param AScaleX Horizontal scaling factor of the image
+ @param AScaleY Vertical scaling factor of the image
-------------------------------------------------------------------------------}
procedure TsPageLayout.AddFooterImage(AFooterIndex: Integer;
- ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer);
+ ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer;
+ AScaleX: Double = 1.0; AScaleY: Double = 1.0);
var
s: Array[TsHeaderFooterSectionIndex] of string;
begin
FFooterImages[ASection].Index := AImageIndex;
+ FFooterImages[ASection].ScaleX := AScaleX;
+ FFooterImages[ASection].ScaleY := AScaleY;
SplitHeaderFooterText(FFooters[AFooterIndex], s[hfsLeft], s[hfsCenter], s[hfsRight]);
// Add the symbol &G only once!
if (pos('&G', s[ASection]) < 1) or (pos('&g', s[ASection]) < 1) then begin
diff --git a/components/fpspreadsheet/source/common/fpstypes.pas b/components/fpspreadsheet/source/common/fpstypes.pas
index eca1f8551..4798accd5 100644
--- a/components/fpspreadsheet/source/common/fpstypes.pas
+++ b/components/fpspreadsheet/source/common/fpstypes.pas
@@ -1088,9 +1088,13 @@ type
PsImage = ^TsImage;
{@@ Image embedded in header or footer
- @member Index Index of the image in the workbook's embedded streams list }
+ @member Index Index of the image in the workbook's embedded streams list
+ @member ScaleX Scaling factor in horizontal direction
+ @member ScaleY Scaling factor in vertical direction }
TsHeaderFooterImage = record
- Index: Integer;
+ Index: Integer;
+ ScaleX: Double;
+ ScaleY: Double;
end;
{@@ Page orientation for printing
diff --git a/components/fpspreadsheet/source/common/xlsxooxml.pas b/components/fpspreadsheet/source/common/xlsxooxml.pas
index b32561d5a..5ce65364f 100644
--- a/components/fpspreadsheet/source/common/xlsxooxml.pas
+++ b/components/fpspreadsheet/source/common/xlsxooxml.pas
@@ -215,7 +215,7 @@ type
procedure WriteSheetViews(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteStyle(AStream: TStream; ANodeName: String; AFormat: PsCellFormat);
procedure WriteStyleList(AStream: TStream; ANodeName: String);
- procedure WriteVmlDrawings(AWorksheet: TsBasicWorksheet);
+ procedure WriteVMLDrawings(AWorksheet: TsBasicWorksheet);
procedure WriteVMLDrawings_Comments(AWorksheet: TsBasicWorksheet);
procedure WriteVMLDrawings_HeaderFooterImages(AWorksheet: TsBasicWorksheet);
procedure WriteVMLDrawingRels(AWorksheet: TsBasicWorksheet);
@@ -6380,32 +6380,6 @@ begin
AppendToStream(FSDrawingsRels[FCurSheetNum],
'');
end;
- (*
-procedure TsSpreadOOXMLWriter.WriteDrawingsOfSheet(AStream: TStream;
- AWorksheet: TsWorksheet; rId: Integer);
-// Use stream FSDrawingS[sheetindex]
-var
- i: Integer;
- AVLNode: TAVLTreeNode;
- hyperlink: PsHyperlink;
- target, bookmark: String;
-begin
- // Keep in sync with WriteWorksheetRels !
- FNext_rID := IfThen(AWorksheet.Comments.Count = 0, 1, 3);
-
- AVLNode := AWorksheet.Hyperlinks.FindLowest;
- while AVLNode <> nil do begin
- inc(FNext_rID);
- AVLNode := AWorksheet.Hyperlinks.FindSuccessor(AVLNode);
- end;
-
- for i:=0 to AWorksheet.GetImageCount-1 do
- begin
- AppendToStream(AStream, Format(
- '', [FNext_rId]));
- inc(FNext_rId);
- end;
-end; *)
{@ -----------------------------------------------------------------------------
Writes a VmlDrawings file for the specified worksheet.
@@ -6556,6 +6530,8 @@ var
AImage: TsHeaderFooterImage; var id, index: Integer);
var
fn: String;
+ w, h: Double;
+ img: TsEmbeddedObj;
begin
if AImage.Index = -1 then
exit;
@@ -6569,19 +6545,28 @@ var
book.AddErrorMsg(rsIncorrectPositionOfImageInHeaderFooter, [AName]);
exit;
end;
- fn := ChangeFileExt(book.GetEmbeddedObj(AImage.Index).FileName, '');
+
+ img := book.GetEmbeddedObj(AImage.Index);
+ if img = nil then
+ exit;
+
+ fn := ChangeFileExt(img.FileName, '');
if fn = '' then fn := 'image';
+ w := mmToPts(img.ImageWidth * AImage.ScaleX);
+ h := mmToPts(img.ImageHeight * AImage.ScaleY);
AppendToStream(AStream, Format(
' ' + LineEnding +
- // e.g. z-index:1
+ ' style=''position:absolute;margin-left:0;margin-top:0;width:%.1fpt;height:%.1fpt;z-index:%d''>' + LineEnding +
+ // e.g. width height z-index:1
' ' + LineEnding +
// e.g. "rId1" "arrow_down"
' ' + LineEnding +
' ' + LineEnding, [
- ATag + AChar, id, index, index, fn
- ]));
+ ATag + AChar, id,
+ w, h, index,
+ index, fn
+ ], FPointSeparatorSettings));
inc(id);
inc(index);
end;