Skip to content
Closed
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
4 changes: 3 additions & 1 deletion src/EPPlus.Export.Pdf/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,6 @@ Date Author Change
// The following GUID is for the ID of the typelib if this project is exposed to COM.

[assembly: Guid("60855b7d-19da-4dfa-90b2-78231d227d65")]
[assembly: InternalsVisibleTo("EPPlus.Export.Pdf.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100dd3a3466a88cbf5d374fe992cec433c48022414fe96608933e8e36782001213dd31bc454dc6f962a54a3a76cfb9e03a32cd4c658ecd49d1a98709971a080ab92d5c5b65346155f8d6422db4ffbf662f78913996a9a8b78ee11ff3cda7e585208cd4468fb3201f15bbb1dfc45c120703c9d6ad495bb9de66893ae5ab5ac8f40dc")]
[assembly: InternalsVisibleTo("EPPlus.Export.Pdf.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100dd3a3466a88cbf5d374fe992cec433c48022414fe96608933e8e36782001213dd31bc454dc6f962a54a3a76cfb9e03a32cd4c658ecd49d1a98709971a080ab92d5c5b65346155f8d6422db4ffbf662f78913996a9a8b78ee11ff3cda7e585208cd4468fb3201f15bbb1dfc45c120703c9d6ad495bb9de66893ae5ab5ac8f40dc")]
//
[assembly: InternalsVisibleTo("EPPlus.PdfExportPerformance, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f5398d389a44aacee243c9e73152fae942e9ede958ebd4b06651a749e6b2c0395a66bc0fc133dce1cf83cd667fe8f761b433063e603968f12b0b17e474233410f8fe933853d2344e89526414ef65ed7236a7a5c012e30275ec30d7fb665dbe1bd3435439bec55f431b9e69e943294fd474942d6bcb431c94ef653cbeee5b8a9e")]
244 changes: 125 additions & 119 deletions src/EPPlus.Export.Pdf/ExcelPdf.cs

Large diffs are not rendered by default.

156 changes: 95 additions & 61 deletions src/EPPlus.Export.Pdf/PdfCatalog/PdfCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
using EPPlus.Export.Pdf.PdfSettings;
using EPPlus.Graphics;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace EPPlus.Export.Pdf.PdfCatalog
{
internal class PdfCatalog
public class PdfCatalog
{
internal PdfDictionaries Dictionaries = new PdfDictionaries();
private bool AddTextForHeadings = true;
internal PdfDictionaries _dictionaries = new PdfDictionaries();
private bool _addTextForHeadings = true;

//Constructors
public PdfCatalog() { }
Expand Down Expand Up @@ -41,45 +43,71 @@ private void HandleWorksheetCollection(PdfPageSettings pageSettings, ExcelWorksh
}

public PdfCatalog(PdfPageSettings pageSettings, ExcelWorksheet worksheet, string fileName)
{
BuildPdf(pageSettings, worksheet, (excelPdf, layout) =>
excelPdf.CreatePdf(pageSettings, _dictionaries, layout, fileName));
}

public PdfCatalog(PdfPageSettings pageSettings, ExcelWorksheet worksheet, Stream stream)
{
BuildPdf(pageSettings, worksheet, (excelPdf, layout) =>
excelPdf.CreatePdf(pageSettings, _dictionaries, layout, stream));
}

private void BuildPdf(PdfPageSettings pageSettings, ExcelWorksheet worksheet, Action<ExcelPdf, Transform> writePdf)
{
pageSettings.defaultFontName = worksheet.Workbook.ThemeManager.CurrentTheme.FontScheme.MinorFont[0].Typeface;

Stopwatch sw = Stopwatch.StartNew();
PdfWorksheet pdfSheet = null;
try
{
Stopwatch sw = Stopwatch.StartNew();

//Collect Text
PdfWorksheet pdfSheet = GetPdfWorksheet(pageSettings, worksheet);
sw.Stop();
var CollectTextTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();
//Collect Text
pdfSheet = GetPdfWorksheet(pageSettings, worksheet);
sw.Stop();
var CollectTextTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Shape Text
ShapeTextInPdfWorksheet(pageSettings, pdfSheet);
sw.Stop();
var ShapeTextTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Auto-Fit Rows
PdfCalculateRowHeight.ResizeRowHeights(pdfSheet); //call a method that does this so we can use it for comments sheet aswell!
sw.Stop();
var AutoFitRowTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Create Layout
var Layout = GetLayout(pageSettings, pdfSheet);
sw.Stop();
var CreateLayoutTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Create Pdf
ExcelPdf excelPdf = new ExcelPdf();
excelPdf.CreatePdf(pageSettings, Dictionaries, Layout, fileName);
sw.Stop();
var CreatePdfTime = sw.ElapsedMilliseconds;
sw.Reset();
//Shape Text
ShapeTextInPdfWorksheet(pageSettings, pdfSheet);
sw.Stop();
var ShapeTextTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Auto-Fit Rows
PdfCalculateRowHeight.ResizeRowHeights(pdfSheet);
sw.Stop();
var AutoFitRowTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Create Layout
var Layout = GetLayout(pageSettings, pdfSheet);
sw.Stop();
var CreateLayoutTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();

//Create Pdf
ExcelPdf excelPdf = new ExcelPdf();
writePdf(excelPdf, Layout);
sw.Stop();
var CreatePdfTime = sw.ElapsedMilliseconds;
sw.Reset();
}
finally
{
//Clean up the temporary worksheet used to build the comments/notes pages,
//so the source workbook isn't permanently mutated by the PDF export.
if (pdfSheet != null && pdfSheet.CommentsAndNotesSheet != null)
{
worksheet.Workbook.Worksheets.Delete(pdfSheet.CommentsAndNotesSheet);
pdfSheet.CommentsAndNotesSheet = null;
}
}
}

public PdfCatalog(PdfPageSettings pageSettings, ExcelRangeBase range)
Expand All @@ -88,7 +116,7 @@ public PdfCatalog(PdfPageSettings pageSettings, ExcelRangeBase range)
ShapeTextInPdfWorksheet(pageSettings, pdfSheet);
}

public PdfCellCollection GetCellCollectionFromRange(PdfPageSettings pageSettings, ExcelRangeBase range)
internal PdfCellCollection GetCellCollectionFromRange(PdfPageSettings pageSettings, ExcelRangeBase range)
{
PdfWorksheet pdfSheet = GetPdfWorksheet(pageSettings, range);
ShapeTextInPdfWorksheet(pageSettings, pdfSheet);
Expand All @@ -99,43 +127,50 @@ public PdfCellCollection GetCellCollectionFromRange(PdfPageSettings pageSettings
//Create Layout Methods
private Transform GetLayout(PdfPageSettings pageSettings, PdfWorksheet pdfSheet)
{
PdfWorksheet[] pdfSheets = new PdfWorksheet[1]{ pdfSheet };
var Layout = PdfLayout.GetLayout(pageSettings, Dictionaries, pdfSheets);
PdfWorksheet[] pdfSheets = new PdfWorksheet[1] { pdfSheet };
var Layout = PdfLayout.GetLayout(pageSettings, _dictionaries, pdfSheets);
return Layout;
}

//Shape Text Methods
private void ShapeTextInPdfWorksheet(PdfPageSettings pageSettings, PdfWorksheet pdfSheet)
internal void ShapeTextInPdfWorksheet(PdfPageSettings pageSettings, PdfWorksheet pdfSheet)
{
// Pass 1: collect text per font
IterateCells(pdfSheet, cell => PdfTextShaper.CollectText(_dictionaries, cell));

// Pass 2: build one provider per font
foreach (var kvp in _dictionaries.Fonts)
{
_dictionaries.ShapedProviders[kvp.Key] = kvp.Value.fontSubsetManager.CreateSubsettedProvider();
}

// Pass 3: shape text using the pre-built providers
IterateCells(pdfSheet, cell => PdfTextShaper.ShapeText(pageSettings, _dictionaries, cell));
}

private void IterateCells(PdfWorksheet pdfSheet, System.Action<PdfCell> action)
{
foreach (var range in pdfSheet.Ranges)
{
for (int i = range.Map.FromRow; i <= range.Map.ToRow; i++)
{
for (int j = range.Map.FromColumn; j <= range.Map.ToColumn; j++)
{
var cell = range.Map[i, j];
PdfTextShaper.LayoutAndShapeText(pageSettings, Dictionaries, cell);
action(range.Map[i, j]);
}
}
}

if (pdfSheet.CommentsAndNotes.Map != null)
{
for (int i = pdfSheet.CommentsAndNotes.Map.FromRow; i <= pdfSheet.CommentsAndNotes.Map.ToRow; i++)
{
for (int j = pdfSheet.CommentsAndNotes.Map.FromColumn; j <= pdfSheet.CommentsAndNotes.Map.ToColumn; j++)
{
var cell = pdfSheet.CommentsAndNotes.Map[i, j];
PdfTextShaper.LayoutAndShapeText(pageSettings, Dictionaries, cell);
action(pdfSheet.CommentsAndNotes.Map[i, j]);
}
}
}
//if (pdfSheet.HeaderFooters != null)
//{
// foreach (var hf in pdfSheet.HeaderFooters.PdfHeaderFooterEntries)
// {
// PdfTextShaper.LayoutAndShapeText(pageSettings, Dictionaries, hf.Content);
// }
//}
}

//Collect Text Methods
Expand All @@ -149,15 +184,14 @@ private PdfWorksheet[] GetPdfWorksheets(PdfPageSettings pageSettings, ExcelWorks
return pdfSheets;
}

private PdfWorksheet GetPdfWorksheet(PdfPageSettings pageSettings, ExcelWorksheet worksheet)
internal PdfWorksheet GetPdfWorksheet(PdfPageSettings pageSettings, ExcelWorksheet worksheet)
{
PdfWorksheet pdfSheet = new PdfWorksheet();
pdfSheet.Ranges = new List<PdfRange>();
pdfSheet.Worksheet = worksheet;
pdfSheet.Ranges = GetRanges(pdfSheet.Worksheet);
//pdfSheet.HeaderFooters = new PdfHeaderFooterCollection(pageSettings, Dictionaries, pdfSheet, pdfSheet.Worksheet.HeaderFooter);
if(pageSettings.ShowHeadings && AddTextForHeadings) Dictionaries.AddFont(pageSettings, pdfSheet.NormalStyle.Style.Font.Name, pdfSheet.GetSubFamilyFromNormalStyle, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
AddTextForHeadings = false;
if (pageSettings.ShowHeadings && _addTextForHeadings) _dictionaries.AddFont(pageSettings, pdfSheet.NormalStyle.Style.Font.Name, pdfSheet.GetSubFamilyFromNormalStyle, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
_addTextForHeadings = false;
GetMaps(pageSettings, pdfSheet, pdfSheet.Ranges);
GetHeaderFooter(pageSettings, pdfSheet);
GetCommentsAndNotes(pageSettings, pdfSheet);
Expand All @@ -170,8 +204,8 @@ private PdfWorksheet GetPdfWorksheet(PdfPageSettings pageSettings, ExcelRangeBas
pdfSheet.Ranges = new List<PdfRange>();
pdfSheet.Worksheet = excelRange.Worksheet;
pdfSheet.Ranges.Add(new PdfRange(excelRange, false));
if (pageSettings.ShowHeadings && AddTextForHeadings) Dictionaries.AddFont(pageSettings, pdfSheet.NormalStyle.Style.Font.Name, pdfSheet.GetSubFamilyFromNormalStyle, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
AddTextForHeadings = false;
if (pageSettings.ShowHeadings && _addTextForHeadings) _dictionaries.AddFont(pageSettings, pdfSheet.NormalStyle.Style.Font.Name, pdfSheet.GetSubFamilyFromNormalStyle, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
_addTextForHeadings = false;
pdfSheet.Ranges[0] = GetMaps(pageSettings, pdfSheet, pdfSheet.Ranges[0]);
GetHeaderFooter(pageSettings, pdfSheet);
GetCommentsAndNotes(pageSettings, pdfSheet);
Expand Down Expand Up @@ -210,14 +244,14 @@ private void GetMaps(PdfPageSettings pageSettings, PdfWorksheet pdfSheet, List<P
private PdfRange GetMaps(PdfPageSettings pageSettings, PdfWorksheet pdfSheet, PdfRange range)
{
var temp = range;
temp.Map = PdfTextMap.SetTextMap(pageSettings, Dictionaries, pdfSheet, ref temp);
temp.Map = PdfTextMap.SetTextMap(pageSettings, _dictionaries, pdfSheet, ref temp);
range = temp;
return range;
}

private void GetHeaderFooter(PdfPageSettings pageSettings, PdfWorksheet pdfSheet)
{
pdfSheet.HeaderFooters = new PdfHeaderFooterCollection(pageSettings, Dictionaries, pdfSheet, pdfSheet.Worksheet.HeaderFooter);
pdfSheet.HeaderFooters = new PdfHeaderFooterCollection(pageSettings, _dictionaries, pdfSheet, pdfSheet.Worksheet.HeaderFooter);
}

private void GetCommentsAndNotes(PdfPageSettings pageSettings, PdfWorksheet pdfSheet)
Expand All @@ -232,4 +266,4 @@ private void GetCommentsAndNotes(PdfPageSettings pageSettings, PdfWorksheet pdfS
}
}
}
}
}
Loading
Loading