diff --git a/src/UglyToad.PdfPig.Tests/Integration/Documents/ssm2163.pdf b/src/UglyToad.PdfPig.Tests/Integration/Documents/ssm2163.pdf new file mode 100644 index 00000000..33b9e805 Binary files /dev/null and b/src/UglyToad.PdfPig.Tests/Integration/Documents/ssm2163.pdf differ diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs index 86f3bf57..83d7fcb2 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs @@ -11,6 +11,8 @@ using System.Collections.Generic; using Tests.Fonts.TrueType; using Xunit; + using System; + using UglyToad.PdfPig.Graphics.Operations.InlineImages; public class PdfDocumentBuilderTests { @@ -167,6 +169,9 @@ return result; } + + + [Fact] public void CanWriteSinglePageStandard14FontHelloWorld() { @@ -1138,6 +1143,45 @@ Assert.True(tw.WroteCrossReferenceTable); } + [Fact] + public void CanCopyInLineImage() + { + var docPath = IntegrationHelpers.GetDocumentPath("ssm2163.pdf"); + + using (var docOrig = PdfDocument.Open(docPath)) + { + + // Copy original document with inline images into pdf bytes for opening and checking. + PdfDocumentBuilder pdfBuilder = new PdfDocumentBuilder(); + var numberOfPages = docOrig.NumberOfPages; + for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) + { + var sourcePage = docOrig.GetPage(pageNumber); + pdfBuilder.AddPage(sourcePage.Width, sourcePage.Height).CopyFrom(sourcePage); + } + var pdfBytes = pdfBuilder.Build(); + + + using (var docCopy = PdfDocument.Open(pdfBytes)) + { + var pageNum = 7; + var origPage = docOrig.GetPage(pageNum); + var copyPage = docCopy.GetPage(pageNum); + + var opsOrig = origPage.Operations.Where(v => v.Operator == BeginInlineImageData.Symbol).Select(v => (BeginInlineImageData)v).ToArray(); + var opCopy = copyPage.Operations.Where(v => v.Operator == BeginInlineImageData.Symbol).Select(v => (BeginInlineImageData)v).ToArray(); + + var dictOrig = opCopy.Select(v => v.Dictionary).ToArray(); + var dictCopy = opCopy.Select(v => v.Dictionary).ToArray(); + + var exampleCopiedDictionary = dictCopy.FirstOrDefault(); + + Assert.NotNull(exampleCopiedDictionary); + Assert.True(exampleCopiedDictionary.Count>0); + } + } + } + private static void WriteFile(string name, byte[] bytes, string extension = "pdf") { try diff --git a/src/UglyToad.PdfPig/Graphics/Operations/InlineImages/BeginInlineImageData.cs b/src/UglyToad.PdfPig/Graphics/Operations/InlineImages/BeginInlineImageData.cs index 06a4bfaa..80490768 100644 --- a/src/UglyToad.PdfPig/Graphics/Operations/InlineImages/BeginInlineImageData.cs +++ b/src/UglyToad.PdfPig/Graphics/Operations/InlineImages/BeginInlineImageData.cs @@ -3,8 +3,9 @@ using System; using System.Collections.Generic; using System.IO; - using Tokens; - + using Tokens; + using UglyToad.PdfPig.Writer; + /// /// /// Begin the image data for an inline image object. @@ -40,7 +41,17 @@ /// public void Write(Stream stream) - { + { + var tokenWriter = TokenWriter.Instance; + foreach (var item in Dictionary) + { + var name = item.Key; + var value = item.Value; + + stream.WriteText($"{name} "); + tokenWriter.WriteToken(value, stream); + stream.WriteNewLine(); + } stream.WriteText(Symbol); stream.WriteNewLine(); } diff --git a/src/UglyToad.PdfPig/Writer/TokenWriter.cs b/src/UglyToad.PdfPig/Writer/TokenWriter.cs index 05cac5b2..2d0429b4 100644 --- a/src/UglyToad.PdfPig/Writer/TokenWriter.cs +++ b/src/UglyToad.PdfPig/Writer/TokenWriter.cs @@ -80,6 +80,11 @@ '%' }; + /// + /// Single global instance + /// + public static TokenWriter Instance { get; } = new TokenWriter(); + /// /// Writes the given input token to the output stream with the correct PDF format and encoding including whitespace and line breaks as applicable. ///