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)