From f1323f4ff1cf06dc34cc5f9118d693cb03bb7931 Mon Sep 17 00:00:00 2001 From: Joe Tremblay Date: Thu, 27 Jun 2024 20:37:20 -0500 Subject: [PATCH] Add image consolidation --- PdfSharpCore.Test/Assets/frog-and-toad.jpg | Bin 0 -> 66610 bytes PdfSharpCore.Test/Merge.cs | 77 ++++++++++++++++++-- PdfSharpCore.Test/PdfSharpCore.Test.csproj | 3 + PdfSharpCore/Pdf/PdfDocument.cs | 80 +++++++++++++++++++++ 4 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 PdfSharpCore.Test/Assets/frog-and-toad.jpg diff --git a/PdfSharpCore.Test/Assets/frog-and-toad.jpg b/PdfSharpCore.Test/Assets/frog-and-toad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62543cced2133dab8473ef44d746137b565afd90 GIT binary patch literal 66610 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

CSSJlNYb8 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�lF#XZM-z1Tl@)o6h+JKMu*HmatlGTI$-PMwqx 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 literal 0 HcmV?d00001 diff --git a/PdfSharpCore.Test/Merge.cs b/PdfSharpCore.Test/Merge.cs index ec1e6eed..e3bab0d7 100644 --- a/PdfSharpCore.Test/Merge.cs +++ b/PdfSharpCore.Test/Merge.cs @@ -1,25 +1,74 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using PdfSharpCore.Drawing; +using PdfSharpCore.Drawing.Layout; using PdfSharpCore.Pdf; using PdfSharpCore.Pdf.IO; using PdfSharpCore.Test.Helpers; using Xunit; +using Xunit.Abstractions; namespace PdfSharpCore.Test { public class Merge { + private readonly ITestOutputHelper _output; + + public Merge(ITestOutputHelper output) + { + _output = output; + } + [Fact] public void CanMerge2Documents() { var pdf1Path = PathHelper.GetInstance().GetAssetPath("FamilyTree.pdf"); var pdf2Path = PathHelper.GetInstance().GetAssetPath("test.pdf"); + var outputDocument = MergeDocuments(new[] { pdf1Path, pdf2Path }); + + var outFilePath = CreateOutFilePath("merge.pdf"); + outputDocument.Save(outFilePath); + } + + [Fact] + public void CanConsolidateImageDataInDocument() + { + var doc1 = CreateTestDocumentWithImage("lenna.png"); + var doc2 = CreateTestDocumentWithImage("frog-and-toad.jpg"); + + var pdf1Path = CreateOutFilePath("image-doc1.pdf"); + doc1.Save(pdf1Path); + + var pdf2Path = CreateOutFilePath("image-doc2.pdf"); + doc2.Save(pdf2Path); + + var pdfPathsForMerge = Enumerable.Range(1, 50).SelectMany(_ => new[] { pdf1Path, pdf2Path }); + var outputDocument = MergeDocuments(pdfPathsForMerge); + + var mergedFilePath = CreateOutFilePath("images-merged.pdf"); + outputDocument.Save(mergedFilePath); + + outputDocument.ConsolidateImages(); + var consolidatedFilePath = CreateOutFilePath("images-merged-consolidated.pdf"); + outputDocument.Save(consolidatedFilePath); + + long mergedLength = new FileInfo(mergedFilePath).Length; + long consolidatedLength = new FileInfo(consolidatedFilePath).Length; + Assert.True(consolidatedLength < mergedLength / 4); + } + + private static PdfDocument MergeDocuments(IEnumerable pdfPaths) + { var outputDocument = new PdfDocument(); - foreach (var pdfPath in new[] { pdf1Path, pdf2Path }) + foreach (var pdfPath in pdfPaths) { using var fs = File.OpenRead(pdfPath); var inputDocument = Pdf.IO.PdfReader.Open(fs, PdfDocumentOpenMode.Import); + var count = inputDocument.PageCount; for (var idx = 0; idx < count; idx++) { @@ -28,14 +77,34 @@ public void CanMerge2Documents() } } - var outFilePath = Path.Combine(PathHelper.GetInstance().RootDir, "Out", "merge.pdf"); + return outputDocument; + } + + private static string CreateOutFilePath(string filename) + { + var outFilePath = Path.Combine(PathHelper.GetInstance().RootDir, "Out", filename); var dir = Path.GetDirectoryName(outFilePath); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } - outputDocument.Save(outFilePath); + return outFilePath; + } + + private static PdfDocument CreateTestDocumentWithImage(string imageFilename) + { + var document = new PdfDocument(); + + var pageNewRenderer = document.AddPage(); + var renderer = XGraphics.FromPdfPage(pageNewRenderer); + var textFormatter = new XTextFormatter(renderer); + + var layout = new XRect(12, 12, 400, 50); + textFormatter.DrawString(imageFilename, new XFont("Arial", 12), XBrushes.Black, layout); + renderer.DrawImage(XImage.FromFile(PathHelper.GetInstance().GetAssetPath(imageFilename)), new XPoint(12, 100)); + + return document; } } } \ No newline at end of file diff --git a/PdfSharpCore.Test/PdfSharpCore.Test.csproj b/PdfSharpCore.Test/PdfSharpCore.Test.csproj index 844f5748..1fc9af5b 100644 --- a/PdfSharpCore.Test/PdfSharpCore.Test.csproj +++ b/PdfSharpCore.Test/PdfSharpCore.Test.csproj @@ -38,6 +38,9 @@ PreserveNewest + + PreserveNewest + diff --git a/PdfSharpCore/Pdf/PdfDocument.cs b/PdfSharpCore/Pdf/PdfDocument.cs index 87fb4d62..674ef4b0 100644 --- a/PdfSharpCore/Pdf/PdfDocument.cs +++ b/PdfSharpCore/Pdf/PdfDocument.cs @@ -28,9 +28,12 @@ #endregion using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using System.Security.Cryptography; +using System.Text; using PdfSharpCore.Pdf.Advanced; using PdfSharpCore.Pdf.Internal; using PdfSharpCore.Pdf.IO; @@ -809,6 +812,83 @@ public void MakeAcroFormsReadOnly() } } + public void ConsolidateImages() + { + var images = ImageInfo.FindAll(this); + + var mapHashcodeToMd5 = new Dictionary(); + var mapMd5ToPdfItem = new Dictionary(); + + // Calculate MD5 for each image XObject and build lookups for all images. + foreach (ImageInfo img in images) + { + mapHashcodeToMd5[img.XObject.GetHashCode()] = img.XObjectMD5; + mapMd5ToPdfItem[img.XObjectMD5] = img.Item.Value; + } + + // Set the PdfItem for each image to the one chosen for the MD5. + foreach (ImageInfo img in images) + { + string md5 = mapHashcodeToMd5[img.XObject.GetHashCode()]; + img.XObjects.Elements[img.Item.Key] = mapMd5ToPdfItem[md5]; + } + } + + internal class ImageInfo + { + public PdfDictionary XObjects { get; } + public KeyValuePair Item { get; } + public PdfDictionary XObject { get; } + public string XObjectMD5 { get; } + + private static readonly MD5 Hasher = MD5.Create(); + + public ImageInfo(PdfDictionary xObjects, KeyValuePair item, PdfDictionary xObject) + { + XObjects = xObjects; + Item = item; + XObject = xObject; + XObjectMD5 = ComputeMD5(xObject.Stream.Value); + } + + ///

+ /// Get info for each image in the document. + /// + internal static List FindAll(PdfDocument doc) => + doc.Pages.Cast() + .Select(page => page.Elements.GetDictionary("/Resources")) + .Select(resources => resources?.Elements?.GetDictionary("/XObject")) + .Where(xObjects => xObjects?.Elements != null) + .SelectMany(xObjects => + from item in xObjects.Elements + let xObject = (item.Value as PdfReference)?.Value as PdfDictionary + where xObject?.Elements?.GetString("/Subtype") == "/Image" + select new ImageInfo(xObjects, item, xObject) + ) + .ToList(); + + /// + /// Compute and return the MD5 hash of the input data. + /// + internal static string ComputeMD5(byte[] input) + { + byte[] hashBytes; + lock (Hasher) + { + hashBytes = Hasher.ComputeHash(input); + Hasher.Initialize(); + } + + var sb = new StringBuilder(); + foreach (var x in hashBytes) + { + sb.Append(x.ToString("x2")); + } + + return sb.ToString(); + } + } + /// /// Gets the security handler. ///