From 79b26bb434f7ed7696e0a1a91a7546767cf04c9e Mon Sep 17 00:00:00 2001 From: Michael Plaisted Date: Sun, 22 Aug 2021 18:06:09 -0500 Subject: [PATCH] - strip link annotations to avoid corrupt links to non-existant pages - fix issue with acrobat not liking same content stream on multiple pages --- .../Integration/Documents/outline.pdf | Bin 0 -> 64328 bytes .../Writer/PdfDocumentBuilderTests.cs | 27 +++++++++ .../Writer/IPdfStreamWriter.cs | 7 +++ .../Writer/PdfDedupStreamWriter.cs | 7 ++- .../Writer/PdfDocumentBuilder.cs | 53 +++++++++++++++++- src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs | 5 +- src/UglyToad.PdfPig/Writer/TokenWriter.cs | 22 ++++++-- 7 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 src/UglyToad.PdfPig.Tests/Integration/Documents/outline.pdf diff --git a/src/UglyToad.PdfPig.Tests/Integration/Documents/outline.pdf b/src/UglyToad.PdfPig.Tests/Integration/Documents/outline.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33ac0de7661a8d1f16dd02aa8ff8895c3b00f24e GIT binary patch literal 64328 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 literal 0 HcmV?d00001 diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs index a9ca12da..fbadf78e 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs @@ -101,6 +101,33 @@ } } + [Fact] + public void CanFastAddPageAndStripLinkAnnots() + { + var first = IntegrationHelpers.GetDocumentPath("outline.pdf"); + var contents = File.ReadAllBytes(first); + + var annotCount = 0; + byte[] results = null; + using (var existing = PdfDocument.Open(contents, ParsingOptions.LenientParsingOff)) + using (var output = new PdfDocumentBuilder()) + { + output.AddPage(existing, 1); + results = output.Build(); + var pg = existing.GetPage(1); + var annots = pg.ExperimentalAccess.GetAnnotations().ToList(); + annotCount = annots.Count; + Assert.Contains(annots, x => x.Type == Annotations.AnnotationType.Link); + } + + using (var rewritten = PdfDocument.Open(results, ParsingOptions.LenientParsingOff)) + { + var pg = rewritten.GetPage(1); + var annots = pg.ExperimentalAccess.GetAnnotations().ToList(); + Assert.Equal(annotCount - 1, annots.Count); + Assert.DoesNotContain(annots, x => x.Type == Annotations.AnnotationType.Link); + } + } [Fact] public void CanReadSingleBlankPage() diff --git a/src/UglyToad.PdfPig/Writer/IPdfStreamWriter.cs b/src/UglyToad.PdfPig/Writer/IPdfStreamWriter.cs index 13281f7a..035260bc 100644 --- a/src/UglyToad.PdfPig/Writer/IPdfStreamWriter.cs +++ b/src/UglyToad.PdfPig/Writer/IPdfStreamWriter.cs @@ -8,6 +8,13 @@ internal interface IPdfStreamWriter : IDisposable { + /// + /// Sets if the stream writer should attempt to deduplicate objects. + /// May not have any affect if does not + /// support deduplication. + /// + bool AttemptDeduplication { get; set; } + /// /// The underlying stream used by the writer. /// diff --git a/src/UglyToad.PdfPig/Writer/PdfDedupStreamWriter.cs b/src/UglyToad.PdfPig/Writer/PdfDedupStreamWriter.cs index 38c77cbc..0d1cb1af 100644 --- a/src/UglyToad.PdfPig/Writer/PdfDedupStreamWriter.cs +++ b/src/UglyToad.PdfPig/Writer/PdfDedupStreamWriter.cs @@ -23,13 +23,16 @@ ms.SetLength(0); TokenWriter.WriteToken(token, ms); var contents = ms.ToArray(); - if (hashes.TryGetValue(contents, out var value)) + if (AttemptDeduplication && hashes.TryGetValue(contents, out var value)) { return value; } var ir = ReserveObjectNumber(); - hashes.Add(contents, ir); + if (AttemptDeduplication) + { + hashes.Add(contents, ir); + } offsets.Add(ir.Data, Stream.Position); TokenWriter.WriteObject(ir.Data.ObjectNumber, ir.Data.Generation, contents, Stream); diff --git a/src/UglyToad.PdfPig/Writer/PdfDocumentBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfDocumentBuilder.cs index 0620dfa9..a50b3870 100644 --- a/src/UglyToad.PdfPig/Writer/PdfDocumentBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfDocumentBuilder.cs @@ -330,6 +330,10 @@ namespace UglyToad.PdfPig.Writer var streams = new List(); if (pageInfo.Page.TryGet(NameToken.Contents, out IToken contentsToken)) { + // Adobe Acrobat errors if content streams ref'd by multiple pages, turn off + // dedup if on to avoid issues + var prev = context.AttemptDeduplication; + context.AttemptDeduplication = false; if (contentsToken is ArrayToken array) { foreach (var item in array.Data) @@ -347,6 +351,7 @@ namespace UglyToad.PdfPig.Writer streams.Add(new PdfPageBuilder.CopiedContentStream( WriterUtil.CopyToken(context, ir, document.Structure.TokenScanner, refs) as IndirectReferenceToken)); } + context.AttemptDeduplication = prev; } // manually copy page dict / resources as we need to modify some @@ -379,15 +384,55 @@ namespace UglyToad.PdfPig.Writer { if (kvp.Key == NameToken.Contents || kvp.Key == NameToken.Parent || kvp.Key == NameToken.Type) { + // don't copy these as they'll be handled during page tree writing continue; } if (kvp.Key == NameToken.Resources) { + // merge parent resources into child CopyResourceDict(kvp.Value, resources); continue; } + if (kvp.Key == NameToken.Annots) + { + var val = kvp.Value; + if (kvp.Value is IndirectReferenceToken ir) + { + val = document.Structure.TokenScanner.Get(ir.Data).Data; + } + + if (!(val is ArrayToken arr)) + { + // should be array... ignore and remove bad dict + continue; + } + + // -> ignore links to resolve issues with refencing non-existing pages + // at some point should add support for copying the links if the + // pages are copied as well but for now just fix corruption + var toAdd = new List(); + foreach (var annot in arr.Data) + { + DictionaryToken tk = GetRemoteDict(annot); + if (tk == null) + { + // malformed + continue; + } + if (tk.TryGet(NameToken.Subtype, out var st) && st is NameToken nm && nm == NameToken.Link) + { + // link -> ignore + continue; + } + toAdd.Add(WriterUtil.CopyToken(context, tk, document.Structure.TokenScanner, refs)); + } + // copy rest + copiedPageDict[NameToken.Annots] = new ArrayToken(toAdd); + continue; + } + copiedPageDict[NameToken.Create(kvp.Key)] = WriterUtil.CopyToken(context, kvp.Value, document.Structure.TokenScanner, refs); } @@ -508,10 +553,14 @@ namespace UglyToad.PdfPig.Writer pageDictionary[NameToken.MediaBox] = RectangleToArray(page.Value.PageSize); } + // Adobe Acrobat errors if content streams ref'd by multiple pages, turn off + // dedup if on to avoid issues + var prev = context.AttemptDeduplication; + context.AttemptDeduplication = false; + var toWrite = page.Value.contentStreams.Where(x => x.HasContent).ToList(); if (toWrite.Count == 0) { - // write empty pageDictionary[NameToken.Contents] = new PdfPageBuilder.DefaultContentStream().Write(context); } else if (toWrite.Count == 1) @@ -529,7 +578,7 @@ namespace UglyToad.PdfPig.Writer } pageDictionary[NameToken.Contents] = new ArrayToken(streams); } - + context.AttemptDeduplication = prev;; leafChildren[leafNum].Add(context.WriteToken(new DictionaryToken(pageDictionary))); diff --git a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs index f444e3dc..65d7ec23 100644 --- a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs +++ b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs @@ -30,8 +30,9 @@ DisposeStream = disposeStream; } - public Stream Stream { get; protected set; } - + public Stream Stream { get; protected set; } + public bool AttemptDeduplication { get; set; } = true; + public virtual IndirectReferenceToken WriteToken(IToken token) { if (!Initialized) diff --git a/src/UglyToad.PdfPig/Writer/TokenWriter.cs b/src/UglyToad.PdfPig/Writer/TokenWriter.cs index ee8ae638..2dacb681 100644 --- a/src/UglyToad.PdfPig/Writer/TokenWriter.cs +++ b/src/UglyToad.PdfPig/Writer/TokenWriter.cs @@ -80,7 +80,11 @@ /// The token to write to the stream. /// The stream to write the token to. public static void WriteToken(IToken token, Stream outputStream) - { + { + if (token == null) + { + throw new ArgumentNullException(nameof(token)); + } switch (token) { case ArrayToken array: @@ -119,7 +123,9 @@ break; case StringToken stringToken: WriteString(stringToken, outputStream); - break; + break; + default: + throw new PdfDocumentFormatException($"Attempted to write token type of {token.GetType()} but was not known."); } } @@ -294,8 +300,16 @@ foreach (var pair in dictionary.Data) { - WriteName(pair.Key, outputStream); - WriteToken(pair.Value, outputStream); + WriteName(pair.Key, outputStream); + + // handle scenario where PdfPig has a null value under some circumstances + if (pair.Value == null) + { + WriteToken(NullToken.Instance, outputStream); + } else + { + WriteToken(pair.Value, outputStream); + } } outputStream.Write(DictionaryEnd, 0, DictionaryEnd.Length);