diff --git a/src/EPPlus.Export.Pdf.Tests/PdfTests.cs b/src/EPPlus.Export.Pdf.Tests/PdfTests.cs
index 3141943b8b..4b78180d42 100644
--- a/src/EPPlus.Export.Pdf.Tests/PdfTests.cs
+++ b/src/EPPlus.Export.Pdf.Tests/PdfTests.cs
@@ -15,12 +15,14 @@ Date Author Change
using EPPlus.Export.Pdf.Tests;
using OfficeOpenXml;
using OfficeOpenXml.Export.PdfExport;
-using OfficeOpenXml.Interfaces.Fonts;
using OfficeOpenXml.Export.PdfExport.Data;
using OfficeOpenXml.Export.PdfExport.Layout;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using OfficeOpenXml.Export.PdfExport.Settings;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
+using OfficeOpenXml.Interfaces.Fonts;
using OfficeOpenXml.Style;
+using OfficeOpenXml.Table;
+using System.Data;
using System.Diagnostics;
using System.Globalization;
using System.Reflection.Metadata;
@@ -966,5 +968,142 @@ public void headerFooterImage()
string path = _pdfPath + "EPPlus Sample 3.pdf";
ws.SaveAsPdf(path);
}
+
+ [TestMethod]
+ public void headerFooterImage2()
+ {
+ using var p = CreateWorkbook();
+ var ws = p.Workbook.Worksheets[0];
+ string path = _pdfPath + "EPPlus Sample 3.pdf";
+ ws.SaveAsPdf(path);
+ }
+ public ExcelPackage CreateWorkbook()
+ {
+ InitDataTable();
+ var package = new ExcelPackage();
+ var sheet = package.Workbook.Worksheets.Add("Html export sample 2");
+ var tableRange = sheet.Cells["A1"].LoadFromDataTable(_dataTable, true, TableStyles.Dark3);
+
+ //Configure the table
+ var table = sheet.Tables.GetFromRange(tableRange);
+ table.Sort(x => x.SortBy.ColumnNamed("Population", eSortOrder.Descending));
+ table.ShowTotal = true;
+ table.Columns[0].TotalsRowLabel = "Total";
+ table.Columns[1].TotalsRowFunction = RowFunctions.Sum;
+ table.Columns[2].TotalsRowFunction = RowFunctions.Sum;
+
+ //Add column for population density
+ table.Columns.Add(1);
+ tableRange = table.Range;
+ table.Columns[3].CalculatedColumnFormula = $"{table.Name}[[#This Row],[Population]]/{table.Name}[[#This Row],[Area (km2)]]";
+ table.Columns[3].Name = "Density";
+ table.Columns[3].TotalsRowFunction = RowFunctions.Average;
+ sheet.Calculate();
+
+ //// format the header
+ table.Range.TakeColumnsBetween(1, 3).SkipRows(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
+
+ // format the rows
+ var lastDataRow = tableRange.End.Row - 1;
+ sheet.Cells[tableRange.Start.Row, 1, lastDataRow, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
+ sheet.Cells[tableRange.Start.Row, 2, lastDataRow, 2].Style.Numberformat.Format = "#,##0";
+ sheet.Cells[tableRange.Start.Row, 3, lastDataRow, 3].Style.Numberformat.Format = "#,##0 \"km2\"";
+ sheet.Cells[tableRange.Start.Row, 4, lastDataRow, 4].Style.Numberformat.Format = "#,##0.0";
+
+ // format the total row
+ var totalRow = tableRange.End.Row;
+ sheet.Cells[totalRow, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
+ sheet.Cells[totalRow, 2].Style.Numberformat.Format = "#,##0";
+ sheet.Cells[totalRow, 3].Style.Numberformat.Format = "#,##0 \"km2\"";
+ sheet.Cells[totalRow, 4].Style.Numberformat.Format = "\"Avg: \"#,##0.0 ";
+ sheet.Cells.AutoFitColumns();
+
+ //Set the header and footer values
+ var text = sheet.HeaderFooter.OddHeader.Centered.AddText("EPPlus Sample 3");
+ text.FontSize = 18;
+ var imageFile = Path.Combine(_imagePath, "EPPlus-logo-small.jpg");
+ if (File.Exists(imageFile))
+ {
+ //sheet.HeaderFooter.OddHeader.LeftAligned.AddText("Logo:");
+ sheet.HeaderFooter.OddHeader.LeftAligned.AddImage(new FileInfo(imageFile));
+ }
+
+ sheet.HeaderFooter.OddFooter.Centered.AddPageNumber();
+ sheet.HeaderFooter.OddFooter.Centered.AddText(" of ");
+ sheet.HeaderFooter.OddFooter.Centered.AddNumberOfPages();
+ return package;
+ }
+ private DataTable _dataTable = null;
+
+ private void InitDataTable()
+ {
+ if (_dataTable != null) return;
+ _dataTable = new DataTable();
+ _dataTable.Columns.Add("Country", typeof(string));
+ _dataTable.Columns.Add("Population", typeof(int));
+ var areaCol = _dataTable.Columns.Add("Area", typeof(int));
+ areaCol.Caption = "Area (km2)";
+
+
+ _dataTable.Rows.Add("Sweden", 10409248, 450295);
+ _dataTable.Rows.Add("Norway", 5402171, 385178);
+ _dataTable.Rows.Add("Netherlands", 17553530, 41198);
+ _dataTable.Rows.Add("Finland", 5541806, 338145);
+ _dataTable.Rows.Add("Belgium", 11521238, 30510);
+ _dataTable.Rows.Add("Denmark", 5850189, 44493);
+ _dataTable.Rows.Add("Lithuania", 2801264, 65300);
+ _dataTable.Rows.Add("Greece", 10718565, 131940);
+ _dataTable.Rows.Add("Russia", 145734038, 3972400);
+ _dataTable.Rows.Add("Germany", 83124418, 357386);
+ _dataTable.Rows.Add("France", 64990511, 551695);
+ _dataTable.Rows.Add("Czech Republic", 10665677, 78866);
+ _dataTable.Rows.Add("Slovakia", 5459781, 49036);
+ _dataTable.Rows.Add("Spain", 47394223, 498468);
+ _dataTable.Rows.Add("Portugal", 10256193, 91568);
+ _dataTable.Rows.Add("United Kingdom", 67141684, 242495);
+ _dataTable.Rows.Add("Poland", 37921592, 312685);
+ _dataTable.Rows.Add("Albania", 2882740, 28748);
+ _dataTable.Rows.Add("Estonia", 1322920, 45339);
+ _dataTable.Rows.Add("Hungary", 9707499, 93030);
+ _dataTable.Rows.Add("Romania", 19186000, 238397);
+ _dataTable.Rows.Add("Italy", 60627291, 301338);
+ _dataTable.Rows.Add("Bulgaria", 7051608, 110994);
+ _dataTable.Rows.Add("Belarus", 9452617, 207600);
+ _dataTable.Rows.Add("Austria", 8891388, 83858);
+ _dataTable.Rows.Add("Switzerland", 8525611, 41290);
+ _dataTable.Rows.Add("Ireland", 4818690, 70273);
+ _dataTable.Rows.Add("Ukraine", 44246156, 603628);
+ _dataTable.Rows.Add("Iceland", 336713, 102775);
+ _dataTable.Rows.Add("Serbia", 6871547, 77453);
+ _dataTable.Rows.Add("Croatia", 4156405, 56594);
+ _dataTable.Rows.Add("Latvia", 1928459, 64589);
+ _dataTable.Rows.Add("Bosnia and Herzegovina", 3323925, 51129);
+ _dataTable.Rows.Add("Montenegro", 627809, 13812);
+ _dataTable.Rows.Add("Cyrprus", 1189265, 9251);
+ _dataTable.Rows.Add("Kosovo", 1798506, 10908);
+ _dataTable.Rows.Add("Slovenia", 2055496, 20273);
+ _dataTable.Rows.Add("Moldova", 4033963, 33846);
+ _dataTable.Rows.Add("North Macedonia", 2083374, 25713);
+ _dataTable.Rows.Add("United States", 331002651, 9833517);
+ _dataTable.Rows.Add("China", 1412600000, 9596961);
+ _dataTable.Rows.Add("India", 1417173173, 3287263);
+ _dataTable.Rows.Add("Japan", 125681593, 377975);
+ _dataTable.Rows.Add("Brazil", 214326223, 8515767);
+ _dataTable.Rows.Add("Canada", 38246108, 9984670);
+ _dataTable.Rows.Add("Australia", 25788215, 7692024);
+ _dataTable.Rows.Add("Mexico", 126014024, 1964375);
+ _dataTable.Rows.Add("South Africa", 59308690, 1221037);
+ _dataTable.Rows.Add("Egypt", 104258327, 1001450);
+ _dataTable.Rows.Add("Nigeria", 218541212, 923768);
+ _dataTable.Rows.Add("Argentina", 45808747, 2780400);
+ _dataTable.Rows.Add("Indonesia", 273523615, 1904569);
+ _dataTable.Rows.Add("South Korea", 51780579, 100210);
+ _dataTable.Rows.Add("Turkey", 84339067, 783562);
+ _dataTable.Rows.Add("Saudi Arabia", 34813871, 2149690);
+ _dataTable.Rows.Add("Israel", 9053300, 20770);
+ _dataTable.Rows.Add("New Zealand", 5084300, 268838);
+ _dataTable.Rows.Add("Thailand", 69950850, 513120);
+ _dataTable.Rows.Add("Vietnam", 98168833, 331212);
+ }
}
}
diff --git a/src/EPPlus/Export/PdfExport/Layout/PdfLayout.cs b/src/EPPlus/Export/PdfExport/Layout/PdfLayout.cs
index 1db4a60683..151ab96395 100644
--- a/src/EPPlus/Export/PdfExport/Layout/PdfLayout.cs
+++ b/src/EPPlus/Export/PdfExport/Layout/PdfLayout.cs
@@ -245,9 +245,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
{
var hfType = page.HeaderFooters.GetPageType(physicalPageIndex);
var leftH = page.HeaderFooters.Get(hfType, HeaderFooterSection.Header, HeaderFooterAlignment.Left);
- if (leftH != null && !leftH.HasImage)
+ if (leftH != null && !leftH.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, leftH, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, leftH, displayedPageNumber, totalPages);
var ascent = leftH.Content.TextLines[0].LargestAscent;
var hfx = pageSettings.Margins.LeftPu;
var hfy = pageSettings.PageSize.HeightPu - pageSettings.Margins.HeaderPu - ascent;
@@ -258,9 +257,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
pageLayout.AddChild(text);
}
var centerH = page.HeaderFooters.Get(hfType, HeaderFooterSection.Header, HeaderFooterAlignment.Center);
- if (centerH != null && !centerH.HasImage)
+ if (centerH != null && !centerH.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, centerH, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, centerH, displayedPageNumber, totalPages);
var ascent = centerH.Content.TextLines[0].LargestAscent;
var hfx = pageSettings.Margins.LeftPu;
var hfy = pageSettings.PageSize.HeightPu - pageSettings.Margins.HeaderPu - ascent;
@@ -272,9 +270,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
pageLayout.AddChild(text);
}
var rightH = page.HeaderFooters.Get(hfType, HeaderFooterSection.Header, HeaderFooterAlignment.Right);
- if (rightH != null && !rightH.HasImage)
+ if (rightH != null && !rightH.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, rightH, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, rightH, displayedPageNumber, totalPages);
var ascent = rightH.Content.TextLines[0].LargestAscent;
var hfx = pageSettings.PageSize.WidthPu - pageSettings.Margins.RightPu;
var hfy = pageSettings.PageSize.HeightPu - pageSettings.Margins.HeaderPu - ascent;
@@ -285,9 +282,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
pageLayout.AddChild(text);
}
var leftF = page.HeaderFooters.Get(hfType, HeaderFooterSection.Footer, HeaderFooterAlignment.Left);
- if (leftF != null && !leftF.HasImage)
+ if (leftF != null && !leftF.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, leftF, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, leftF, displayedPageNumber, totalPages);
int last = leftF.Content.TextLines.Count - 1;
var descent = leftF.Content.TextLines[last].LargestDescent;
var hfx = pageSettings.Margins.LeftPu;
@@ -299,9 +295,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
pageLayout.AddChild(text);
}
var centerF = page.HeaderFooters.Get(hfType, HeaderFooterSection.Footer, HeaderFooterAlignment.Center);
- if (centerF != null && !centerF.HasImage)
+ if (centerF != null && !centerF.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, centerF, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, centerF, displayedPageNumber, totalPages);
int last = centerF.Content.TextLines.Count - 1;
var descent = centerF.Content.TextLines[last].LargestDescent;
var hfx = pageSettings.PageSize.WidthPu / 2d;
@@ -313,9 +308,8 @@ internal static Transform GetCatalog(int firstPageNumber, PdfDictionaries dictio
pageLayout.AddChild(text);
}
var rightF = page.HeaderFooters.Get(hfType, HeaderFooterSection.Footer, HeaderFooterAlignment.Right);
- if (rightF != null && !rightF.HasImage)
+ if (rightF != null && !rightF.HasImage && ShapeHeaderFooterText(pageSettings, dictionaries, rightF, displayedPageNumber, totalPages))
{
- SubstitutePageNumbers(pageSettings, dictionaries, rightF, displayedPageNumber, totalPages);
int last = rightF.Content.TextLines.Count - 1;
var descent = rightF.Content.TextLines[last].LargestDescent;
var hfx = pageSettings.PageSize.WidthPu - pageSettings.Margins.RightPu;
@@ -1703,6 +1697,12 @@ private static void SubstitutePageNumbers(PdfPageSettings pageSettings, PdfDicti
PdfTextShaper.ShapeText(pageSettings, dictionaries, hf.Content);
}
+ private static bool ShapeHeaderFooterText(PdfPageSettings pageSettings, PdfDictionaries dictionaries, PdfHeaderFooter hf, int pageNumber, int totalPages)
+ {
+ SubstitutePageNumbers(pageSettings, dictionaries, hf, pageNumber, totalPages);
+ return hf.Content != null && hf.Content.TextLines != null && hf.Content.TextLines.Count > 0;
+ }
+
private static void ApplyPageNumbers(PdfHeaderFooter hf, int pageNumber, int totalPages)
{
if (hf == null) return;
diff --git a/src/EPPlus/Export/PdfExport/TextMapping/PdfTextMap.cs b/src/EPPlus/Export/PdfExport/TextMapping/PdfTextMap.cs
index b7a9d809e8..afa4bc6209 100644
--- a/src/EPPlus/Export/PdfExport/TextMapping/PdfTextMap.cs
+++ b/src/EPPlus/Export/PdfExport/TextMapping/PdfTextMap.cs
@@ -26,6 +26,7 @@ Date Author Change
using OfficeOpenXml.Style.HeaderFooterTextFormat;
using OfficeOpenXml.Style.Table;
using OfficeOpenXml.Table;
+using OfficeOpenXml.Drawing.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -684,9 +685,11 @@ internal static PdfHeaderFooter GetTextFormats(PdfPageSettings pageSettings, Pdf
if (hf.FormatCode == ExcelHeaderFooterFormattingCodes.Image)
{
var pic = textCollection.Picture;
- if (pic?.Image?.ImageBytes != null)
+ var picUri = pic == null ? null : ((IPictureContainer)pic).UriPic;
+ var picBytes = picUri == null ? null : ws._package.PictureStore.GetImageBytes(picUri);
+ if (picBytes != null)
{
- imageBytes = pic.Image.ImageBytes;
+ imageBytes = picBytes;
imageWidth = pic.Width;
imageHeight = pic.Height;
imageFragmentIndex = textFragments.Count;
diff --git a/src/EPPlus/Style/HeaderFooterTextFormat/ExcelHeaderFooterTextCollection.cs b/src/EPPlus/Style/HeaderFooterTextFormat/ExcelHeaderFooterTextCollection.cs
index f6e45ba7df..cf69383373 100644
--- a/src/EPPlus/Style/HeaderFooterTextFormat/ExcelHeaderFooterTextCollection.cs
+++ b/src/EPPlus/Style/HeaderFooterTextFormat/ExcelHeaderFooterTextCollection.cs
@@ -188,7 +188,7 @@ public ExcelHeaderFooterTextItem AddCurrentTime()
///
public ExcelHeaderFooterTextItem AddImage(FileInfo pictureFile)
{
- headerFooter.InsertPicture(pictureFile, (PictureAlignment)alignment);
+ Picture = headerFooter.InsertPicture(pictureFile, (PictureAlignment)alignment);
return AddFormatCode(ExcelHeaderFooterFormattingCodes.Image);
}
///
@@ -199,7 +199,7 @@ public ExcelHeaderFooterTextItem AddImage(FileInfo pictureFile)
///
public ExcelHeaderFooterTextItem AddImage (Stream pictureStream, ePictureType pictureType)
{
- headerFooter.InsertPicture(pictureStream, pictureType, (PictureAlignment)alignment);
+ Picture = headerFooter.InsertPicture(pictureStream, pictureType, (PictureAlignment)alignment);
return AddFormatCode(ExcelHeaderFooterFormattingCodes.Image);
}
private ExcelHeaderFooterTextItem AddFormatCode(ExcelHeaderFooterFormattingCodes formatCode)