Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 141 additions & 2 deletions src/EPPlus.Export.Pdf.Tests/PdfTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
}
24 changes: 12 additions & 12 deletions src/EPPlus/Export/PdfExport/Layout/PdfLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
7 changes: 5 additions & 2 deletions src/EPPlus/Export/PdfExport/TextMapping/PdfTextMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public ExcelHeaderFooterTextItem AddCurrentTime()
/// <returns></returns>
public ExcelHeaderFooterTextItem AddImage(FileInfo pictureFile)
{
headerFooter.InsertPicture(pictureFile, (PictureAlignment)alignment);
Picture = headerFooter.InsertPicture(pictureFile, (PictureAlignment)alignment);
return AddFormatCode(ExcelHeaderFooterFormattingCodes.Image);
}
/// <summary>
Expand All @@ -199,7 +199,7 @@ public ExcelHeaderFooterTextItem AddImage(FileInfo pictureFile)
/// <returns></returns>
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)
Expand Down
Loading