From d676755f5568eb395d97600f6671663d90f74406 Mon Sep 17 00:00:00 2001 From: InusualZ Date: Wed, 9 Dec 2020 17:26:41 +0000 Subject: [PATCH 1/2] Fix #199 In large file brute forcing the search of a specific token can be quite difficult. Detecting duplicated token can be made in a more performance way. --- src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs index 5ce02090..09e9abba 100644 --- a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs +++ b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs @@ -77,28 +77,19 @@ public IndirectReferenceToken WriteToken(IToken token, int? reservedNumber = null) { - // if you can't consider deduplicating the token. - // It must be because it's referenced by his child element, so you must have reserved a number before hand - // Example /Pages Obj - var canBeDuplicated = !reservedNumber.HasValue; - if (!canBeDuplicated) - { - if (!reservedNumbers.Remove(reservedNumber.Value)) - { - throw new InvalidOperationException("You can't reuse a reserved number"); - } - - // When we end up writing this token, all of his child would already have been added and checked for duplicate - return AddToken(token, reservedNumber.Value); - } - - var reference = FindToken(token); - if (reference == null) + if (!reservedNumber.HasValue) { return AddToken(token, CurrentNumber++); } - return reference; + if (!reservedNumbers.Remove(reservedNumber.Value)) + { + throw new InvalidOperationException("You can't reuse a reserved number"); + } + + // When we end up writing this token, all of his child would already have been added and checked for duplicate + return AddToken(token, reservedNumber.Value); + } public int ReserveNumber() From 4e4377c5d42c3ae70c9dbab60a9fb589f18c4bce Mon Sep 17 00:00:00 2001 From: InusualZ Date: Mon, 14 Dec 2020 17:39:16 +0000 Subject: [PATCH 2/2] Address Merger test issue and removed dead code. --- .../Writer/PdfMergerTests.cs | 2 +- src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfMergerTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfMergerTests.cs index 8b8d88a4..f3c7d528 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfMergerTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfMergerTests.cs @@ -89,7 +89,7 @@ using (var document = PdfDocument.Open(result, ParsingOptions.LenientParsingOff)) { Assert.Equal(2, document.NumberOfPages); - Assert.True(document.Structure.CrossReferenceTable.ObjectOffsets.Count < 24, + Assert.True(document.Structure.CrossReferenceTable.ObjectOffsets.Count <= 24, "Expected object count to be lower than 24"); } } diff --git a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs index 09e9abba..040d1a28 100644 --- a/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs +++ b/src/UglyToad.PdfPig/Writer/PdfStreamWriter.cs @@ -142,21 +142,6 @@ return referenceToken; } - private IndirectReferenceToken FindToken(IToken token) - { - foreach (var pair in tokenReferences) - { - var reference = pair.Key; - var storedToken = pair.Value; - if (storedToken.Equals(token)) - { - return reference; - } - } - - return null; - } - private static void WriteString(string text, Stream stream) { var bytes = OtherEncodings.StringAsLatin1Bytes(text);