diff --git a/src/EPPlus.Export.Pdf/DocumentObjects/PdfInfoObject.cs b/src/EPPlus.Export.Pdf/DocumentObjects/PdfInfoObject.cs index 4937c84fb..077f60f8c 100644 --- a/src/EPPlus.Export.Pdf/DocumentObjects/PdfInfoObject.cs +++ b/src/EPPlus.Export.Pdf/DocumentObjects/PdfInfoObject.cs @@ -10,6 +10,7 @@ Date Author Change ************************************************************************************************* 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 *************************************************************************************************/ +using EPPlus.Export.Pdf.Settings; using System; using System.IO; using System.Text; @@ -18,11 +19,17 @@ namespace EPPlus.Export.Pdf.DocumentObjects { internal class PdfInfoObject : PdfObject { - public string Title; + internal string Title; + internal string LicenseType; + internal string LicenseHolder; + internal string Author; - public PdfInfoObject(int objectNumber, string Title, int version = 0) : base(objectNumber, version) + public PdfInfoObject(int objectNumber, PdfDocumentSettings documentSettings, int version = 0) : base(objectNumber, version) { - this.Title = Title; + Title = documentSettings.Title; + Author = documentSettings.Author; + LicenseType = documentSettings.LicenseType; + LicenseHolder = documentSettings.LicenseHolder; } internal override string RenderDictionary() @@ -34,10 +41,10 @@ internal override string RenderDictionary() string pdfDate = string.Format("D:{0:yyyyMMddHHmmss}{1}{2:00}'{3:00}'", now, sign, offset.Hours, offset.Minutes); var sb = new StringBuilder(); sb.AppendFormat($"<< /Title ({Title})\n" + - $" /Author (EPPlus)\n" + - $" /Subject (EPPlus PDF Export)\n" + - $" /Keywords (EPPlus, EPPlus Software)" + - $" /Creator (EPPlus Software)\n" + + $" /Author ({Author})\n" + + $" /Subject (EPPlus PDF Export with {LicenseType} for {LicenseHolder})\n" + + $" /Keywords (EPPlus, EPPlus Software, PDF, Export, {LicenseType}, {LicenseHolder})" + + $" /Creator (EPPlus Software {LicenseType}, {LicenseHolder})\n" + $" /Producer (EPPlus Software PDF Exporter)\n" + $" /CreationDate ({pdfDate})\n" + $" /ModDate ({pdfDate})\n" + @@ -53,14 +60,14 @@ internal override void RenderDictionary(BinaryWriter bw) offset = offset.Duration(); string pdfDate = string.Format("D:{0:yyyyMMddHHmmss}{1}{2:00}'{3:00}'", now, sign, offset.Hours, offset.Minutes); WriteAscii(bw, $"<< /Title ({Title})\n" + - $" /Author (EPPlus)\n" + - $" /Subject (EPPlus PDF Export)\n" + - $" /Keywords (EPPlus, EPPlus Software)\n" + - $" /Creator (EPPlus Software)\n" + + $" /Author ({Author})\n" + + $" /Subject (EPPlus PDF Export with {LicenseType} for {LicenseHolder})\n" + + $" /Keywords (EPPlus, EPPlus Software, PDF, Export, {LicenseType}, {LicenseHolder})" + + $" /Creator (EPPlus Software {LicenseType}, {LicenseHolder})\n" + $" /Producer (EPPlus Software PDF Exporter)\n" + $" /CreationDate ({pdfDate})\n" + $" /ModDate ({pdfDate})\n" + $" /Trapped /False >>"); } } -} +} \ No newline at end of file diff --git a/src/EPPlus.Export.Pdf/ExcelPdf.cs b/src/EPPlus.Export.Pdf/ExcelPdf.cs index 4616a1b06..3ec3f38ac 100644 --- a/src/EPPlus.Export.Pdf/ExcelPdf.cs +++ b/src/EPPlus.Export.Pdf/ExcelPdf.cs @@ -283,9 +283,9 @@ private void AddContent(PdfPageLayout pageLayout, PdfPage page) } //Add Info - private PdfInfoObject AddInfoObject(string workBookName = "") + private PdfInfoObject AddInfoObject() { - var info = new PdfInfoObject(_document.Count + 1, workBookName); + var info = new PdfInfoObject(_document.Count + 1, _documentSettings); _document.Add(info); return info; } diff --git a/src/EPPlus.Export.Pdf/Settings/PdfDocumentSettings.cs b/src/EPPlus.Export.Pdf/Settings/PdfDocumentSettings.cs index 490ae39dd..45485e53a 100644 --- a/src/EPPlus.Export.Pdf/Settings/PdfDocumentSettings.cs +++ b/src/EPPlus.Export.Pdf/Settings/PdfDocumentSettings.cs @@ -25,6 +25,10 @@ internal class PdfDocumentSettings internal int FirstPageNumber; internal bool Debug; internal bool PrintAsText; + internal string LicenseType; + internal string LicenseHolder; + internal string Title; + internal string Author; internal static PdfDocumentSettings From(PdfPageSettings s) { @@ -38,6 +42,10 @@ internal static PdfDocumentSettings From(PdfPageSettings s) FirstPageNumber = s.FirstPageNumber, Debug = s.Debug, PrintAsText = s.PrintAsText, + LicenseType = s.LicenseType, + LicenseHolder = s.LicenseHolder, + Title = s.Title, + Author = s.Author, }; } diff --git a/src/EPPlus.Export.Pdf/Settings/PdfPageSettings.cs b/src/EPPlus.Export.Pdf/Settings/PdfPageSettings.cs index fe96ac403..6f182a9b1 100644 --- a/src/EPPlus.Export.Pdf/Settings/PdfPageSettings.cs +++ b/src/EPPlus.Export.Pdf/Settings/PdfPageSettings.cs @@ -22,6 +22,11 @@ namespace EPPlus.Export.Pdf.Settings /// public class PdfPageSettings { + internal string Author { get; set; } + internal string Title { get; set; } + internal string LicenseType { get; set; } + internal string LicenseHolder { get; set; } + private OpenTypeFontEngine _fontEngine; /// /// Get the current font engine that is being used by EPPlus. diff --git a/src/EPPlus/Export/PdfExport/EPPlusToPdfWriter.cs b/src/EPPlus/Export/PdfExport/EPPlusToPdfWriter.cs index c54d316b7..8d55c8fe1 100644 --- a/src/EPPlus/Export/PdfExport/EPPlusToPdfWriter.cs +++ b/src/EPPlus/Export/PdfExport/EPPlusToPdfWriter.cs @@ -138,6 +138,7 @@ private static string AddAdditionalContent() private void BuildPdf(PdfPageSettings pageSettings, ExcelWorksheet worksheet, Action writePdf) { + GetLicenseInfo(pageSettings, worksheet.Workbook); pageSettings.defaultFontName = worksheet.Workbook.ThemeManager.GetOrCreateTheme().FontScheme.MinorFont[0].Typeface; pageSettings.AdditionalContent = AddAdditionalContent(); PdfWorksheet pdfSheet = null; @@ -183,6 +184,7 @@ public EPPlusToPdfWriter(PdfPageSettings pageSettings, ExcelRangeBase range) private void BuildPdfFromRange(PdfPageSettings pageSettings, ExcelRangeBase range, Action writePdf) { + GetLicenseInfo(pageSettings, range.Worksheet.Workbook); pageSettings.defaultFontName = range.Worksheet.Workbook.ThemeManager.GetOrCreateTheme().FontScheme.MinorFont[0].Typeface; pageSettings.AdditionalContent = AddAdditionalContent(); PdfWorksheet pdfSheet = null; @@ -218,6 +220,7 @@ public EPPlusToPdfWriter(PdfPageSettings pageSettings, List rang private void HandleRangeCollection(PdfPageSettings pageSettings, ExcelRangeBase[] ranges, Action writePdf) { + GetLicenseInfo(pageSettings, ranges[0].Worksheet.Workbook); pageSettings.defaultFontName = ranges[0].Worksheet.Workbook.ThemeManager.GetOrCreateTheme().FontScheme.MinorFont[0].Typeface; pageSettings.AdditionalContent = AddAdditionalContent(); PdfWorksheet[] pdfSheets = null; @@ -289,6 +292,33 @@ internal PdfCellCollection GetCellCollectionFromRange(PdfPageSettings pageSettin //Private Methods + private void GetLicenseInfo(PdfPageSettings pageSettings, ExcelWorkbook workbook) + { + pageSettings.Title = string.IsNullOrEmpty(workbook.Properties.Title) + ? workbook._package.File == null + ? "Untitled EPPlus Workbook" + : string.IsNullOrEmpty(workbook._package.File.Name) + ? "Untitled EPPlus Workbook" + : workbook._package.File.Name + : workbook.Properties.Title; + + pageSettings.Author = string.IsNullOrEmpty(workbook.Properties.Author) + ? string.IsNullOrEmpty(ExcelPackage.License.LegalName) + ? "Unnamed Author using EPPLus" + : ExcelPackage.License.LegalName + : workbook.Properties.Author; + + pageSettings.LicenseType = IsFullEdition + ? "Commercial License" + : ExcelPackage.License.LicenseType == EPPlusLicenseType.NonCommercialOrganization + ? "Non-Commercial License for Organization" + : "Personal Non-Commercial License"; + + pageSettings.LicenseHolder = string.IsNullOrEmpty(ExcelPackage.License.LegalName) + ? "Unnamed License holder using EPPLus" + : ExcelPackage.License.LegalName; + } + private Action WriteToFile(PdfPageSettings pageSettings, string fileName) { return layout => new ExcelPdf().CreatePdf(PdfDocumentSettings.From(pageSettings), _dictionaries, layout, fileName);