diff --git a/readme.md b/readme.md
index 36535e7..23aa126 100644
--- a/readme.md
+++ b/readme.md
@@ -194,7 +194,7 @@ public Task ExcludePdf() =>
VerifyFile("sample.pdf")
.ExcludeTargets("pdf");
```
-snippet source | anchor
+snippet source | anchor
To exclude the pdf for every test, call `VerifierSettings.ExcludeTargets("pdf")` at initialization.
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 68762d0..d2abe0a 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -2,7 +2,7 @@
CS1591;CS0649;NU1608;NU1109
- 2.5.0
+ 2.6.0
1.0.0
preview
enable
diff --git a/src/Tests/Samples.SkipPdfNormalization.verified.pdf b/src/Tests/Samples.SkipPdfNormalization.verified.pdf
new file mode 100644
index 0000000..94d9477
Binary files /dev/null and b/src/Tests/Samples.SkipPdfNormalization.verified.pdf differ
diff --git a/src/Tests/Samples.SkipPdfNormalization.verified.txt b/src/Tests/Samples.SkipPdfNormalization.verified.txt
new file mode 100644
index 0000000..8bca7f7
--- /dev/null
+++ b/src/Tests/Samples.SkipPdfNormalization.verified.txt
@@ -0,0 +1,158 @@
+{
+ Information: {
+ Creator: Writer,
+ Producer: LibreOffice 4.2,
+ CreationDate: DateTimeOffset_1
+ },
+ PageCount: 4,
+ Pages: [
+ {
+ Size: A4,
+ Text:
+Lorem ipsum
+
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit. Nunc ac faucibus odio.
+
+Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut
+varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum
+condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus
+convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus.
+
+ Maecenas non lorem quis tellus placerat varius.
+
+ Nulla facilisi.
+
+ Aenean congue fringilla justo ut aliquam.
+
+ Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante
+sagittis.
+
+ Morbi viverra semper lorem nec molestie.
+
+ Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate.
+
+Row 1 Row 2 Row 3 Row 4
+0
+2
+4
+6
+8
+10
+12
+
+Column 1
+Column 2
+Column 3
+
+ },
+ {
+ Index: 1,
+ Size: A4,
+ Text:
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque
+vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas
+velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci
+maximus ultricies.
+
+Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+
+Lorem ipsum Lorem ipsum Lorem ipsum
+
+1 In eleifend velit vitae libero sollicitudin euismod. Lorem
+
+2 Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+Ipsum
+
+3 Aliquam erat volutpat. Lorem
+
+4 Fusce vitae vestibulum velit. Lorem
+
+5 Etiam vehicula luctus fermentum. Ipsum
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 2,
+ Size: A4,
+ Text:
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit.
+
+Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue
+molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor
+vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum
+cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit
+dictum tellus.
+
+Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo
+ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum
+ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur
+ligula euismod, sit amet ornare est vulputate.
+
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod.
+
+Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo.
+Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae
+fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum
+magna, in fringilla dui commodo a.
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 3,
+ Size: A4,
+ Text:
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Tests/Samples.cs b/src/Tests/Samples.cs
index 1f169e1..b6a0c74 100644
--- a/src/Tests/Samples.cs
+++ b/src/Tests/Samples.cs
@@ -1,4 +1,4 @@
-[TestFixture]
+[TestFixture]
public class Samples
{
#region VerifyPdf
@@ -18,6 +18,15 @@ public Task VerifyPdfStream() =>
#endregion
+ #region SkipPdfNormalization
+
+ [Test]
+ public Task SkipPdfNormalization() =>
+ VerifyFile("sample.pdf")
+ .SkipPdfNormalization();
+
+ #endregion
+
#region ExcludePdf
[Test]
diff --git a/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf
new file mode 100644
index 0000000..7fb7061
Binary files /dev/null and b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf differ
diff --git a/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt
new file mode 100644
index 0000000..8bca7f7
--- /dev/null
+++ b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt
@@ -0,0 +1,158 @@
+{
+ Information: {
+ Creator: Writer,
+ Producer: LibreOffice 4.2,
+ CreationDate: DateTimeOffset_1
+ },
+ PageCount: 4,
+ Pages: [
+ {
+ Size: A4,
+ Text:
+Lorem ipsum
+
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit. Nunc ac faucibus odio.
+
+Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut
+varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum
+condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus
+convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus.
+
+ Maecenas non lorem quis tellus placerat varius.
+
+ Nulla facilisi.
+
+ Aenean congue fringilla justo ut aliquam.
+
+ Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante
+sagittis.
+
+ Morbi viverra semper lorem nec molestie.
+
+ Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate.
+
+Row 1 Row 2 Row 3 Row 4
+0
+2
+4
+6
+8
+10
+12
+
+Column 1
+Column 2
+Column 3
+
+ },
+ {
+ Index: 1,
+ Size: A4,
+ Text:
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque
+vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas
+velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci
+maximus ultricies.
+
+Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+
+Lorem ipsum Lorem ipsum Lorem ipsum
+
+1 In eleifend velit vitae libero sollicitudin euismod. Lorem
+
+2 Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+Ipsum
+
+3 Aliquam erat volutpat. Lorem
+
+4 Fusce vitae vestibulum velit. Lorem
+
+5 Etiam vehicula luctus fermentum. Ipsum
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 2,
+ Size: A4,
+ Text:
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit.
+
+Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue
+molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor
+vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum
+cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit
+dictum tellus.
+
+Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo
+ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum
+ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur
+ligula euismod, sit amet ornare est vulputate.
+
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod.
+
+Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo.
+Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae
+fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum
+magna, in fringilla dui commodo a.
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 3,
+ Size: A4,
+ Text:
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf
new file mode 100644
index 0000000..94d9477
Binary files /dev/null and b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf differ
diff --git a/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt
new file mode 100644
index 0000000..8bca7f7
--- /dev/null
+++ b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt
@@ -0,0 +1,158 @@
+{
+ Information: {
+ Creator: Writer,
+ Producer: LibreOffice 4.2,
+ CreationDate: DateTimeOffset_1
+ },
+ PageCount: 4,
+ Pages: [
+ {
+ Size: A4,
+ Text:
+Lorem ipsum
+
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit. Nunc ac faucibus odio.
+
+Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut
+varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum
+condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus
+convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus.
+
+ Maecenas non lorem quis tellus placerat varius.
+
+ Nulla facilisi.
+
+ Aenean congue fringilla justo ut aliquam.
+
+ Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante
+sagittis.
+
+ Morbi viverra semper lorem nec molestie.
+
+ Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate.
+
+Row 1 Row 2 Row 3 Row 4
+0
+2
+4
+6
+8
+10
+12
+
+Column 1
+Column 2
+Column 3
+
+ },
+ {
+ Index: 1,
+ Size: A4,
+ Text:
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque
+vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas
+velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci
+maximus ultricies.
+
+Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+
+Lorem ipsum Lorem ipsum Lorem ipsum
+
+1 In eleifend velit vitae libero sollicitudin euismod. Lorem
+
+2 Cras fringilla ipsum magna, in fringilla dui commodo
+a.
+Ipsum
+
+3 Aliquam erat volutpat. Lorem
+
+4 Fusce vitae vestibulum velit. Lorem
+
+5 Etiam vehicula luctus fermentum. Ipsum
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 2,
+ Size: A4,
+ Text:
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit.
+
+Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue
+molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor
+vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum
+cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,
+vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus
+nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum,
+ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet
+tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet
+mauris tempus fringilla.
+
+Maecenas mauris lectus, lobortis et purus mattis, blandit
+dictum tellus.
+
+Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo
+ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum
+ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur
+ligula euismod, sit amet ornare est vulputate.
+
+In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam
+est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat
+et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis
+tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque
+scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam
+lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel,
+ultricies ut purus. Ut facilisis et lacus eu cursus.
+
+In eleifend velit vitae libero sollicitudin euismod.
+
+Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo.
+Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae
+fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum
+magna, in fringilla dui commodo a.
+
+Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui.
+Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam,
+pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper
+justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo
+posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut
+et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo
+imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem
+sed turpis imperdiet eleifend sit amet id sapien.
+
+ },
+ {
+ Index: 3,
+ Size: A4,
+ Text:
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Tests/SkipPdfNormalizationTests.cs b/src/Tests/SkipPdfNormalizationTests.cs
new file mode 100644
index 0000000..4d2374b
--- /dev/null
+++ b/src/Tests/SkipPdfNormalizationTests.cs
@@ -0,0 +1,28 @@
+using System.Text;
+using DeterministicPdf;
+
+// The Samples entry for SkipPdfNormalization only proves the setting round-trips through a
+// verification. These assert the wiring it is actually there for: with the setting the snapshotted
+// bytes are the producer's own, and without it they are the normalized ones.
+[TestFixture]
+public class SkipPdfNormalizationTests
+{
+ [Test]
+ public void SampleIsNotAlreadyNormalized()
+ {
+ // The premise the two tests below rest on. If sample.pdf were already byte-identical to its
+ // normalized form they would both pass while asserting nothing.
+ var raw = File.ReadAllBytes("sample.pdf");
+
+ Assert.That(PdfNormalizer.Normalize(raw), Is.Not.EqualTo(raw));
+ }
+
+ [Test]
+ public Task SkippedSnapshotHoldsTheProducerBytes() =>
+ Verify(new MemoryStream(File.ReadAllBytes("sample.pdf")), "pdf")
+ .SkipPdfNormalization();
+
+ [Test]
+ public Task NormalizedSnapshotHoldsTheNeutralizedBytes() =>
+ Verify(new MemoryStream(File.ReadAllBytes("sample.pdf")), "pdf");
+}
diff --git a/src/Verify.PdfPig/PdfPigSettings.cs b/src/Verify.PdfPig/PdfPigSettings.cs
index 57859b1..3205556 100644
--- a/src/Verify.PdfPig/PdfPigSettings.cs
+++ b/src/Verify.PdfPig/PdfPigSettings.cs
@@ -1,4 +1,4 @@
-namespace VerifyTests;
+namespace VerifyTests;
public static class PdfPigSettings
{
@@ -46,4 +46,36 @@ internal static ParsingOptions PdfPigParsingOptions(this IReadOnlyDictionary
+ /// Snapshots the pdf bytes exactly as produced, skipping the normalization that neutralizes the
+ /// trailer /ID, the /CreationDate and /ModDate, and the XMP dates and
+ /// identifiers. Use it when the producer already emits byte-deterministic documents, since
+ /// normalizing them again copies the whole buffer, rescans it, and — when the XMP packet is
+ /// canonicalized — rebuilds it and repairs the cross-reference table, all to change nothing.
+ ///
+ ///
+ /// Only skip this when the producer is genuinely deterministic. Without it a freshly generated
+ /// pdf carries a wall-clock /CreationDate and a fresh /ID, so the snapshot differs
+ /// on every run.
+ ///
+ /// The XMP canonicalization is worth calling out because it is the pass that changes bytes for
+ /// an already-deterministic producer: it collapses the packet's whitespace, so enabling or
+ /// disabling this setting on an existing suite shifts the stored .verified.pdf even
+ /// though nothing about the document changed. Expect to re-accept those snapshots once.
+ ///
+ ///
+ public static void SkipPdfNormalization(this VerifySettings settings) =>
+ settings.Context["PdfPig.SkipNormalization"] = true;
+
+ ///
+ public static SettingsTask SkipPdfNormalization(this SettingsTask settings)
+ {
+ settings.CurrentSettings.SkipPdfNormalization();
+ return settings;
+ }
+
+ internal static bool Normalize(this IReadOnlyDictionary context) =>
+ !context.TryGetValue("PdfPig.SkipNormalization", out var value) ||
+ value is not true;
+}
diff --git a/src/Verify.PdfPig/VerifyPdfPig.cs b/src/Verify.PdfPig/VerifyPdfPig.cs
index 49f23e7..a93b224 100644
--- a/src/Verify.PdfPig/VerifyPdfPig.cs
+++ b/src/Verify.PdfPig/VerifyPdfPig.cs
@@ -63,9 +63,13 @@ static ConversionResult Convert(string? name, Stream stream, IReadOnlyDictionary
// Generating the pdf is expensive, so skip it entirely when the pdf target is excluded.
if (!context.IsTargetExcluded("pdf"))
{
- // Neutralize the volatile fields for the pdf snapshot only once the document, which reads
- // lazily from the same buffer, has been released.
- bytes = PdfNormalizer.Normalize(bytes);
+ if (context.Normalize())
+ {
+ // Neutralize the volatile fields for the pdf snapshot only once the document, which
+ // reads lazily from the same buffer, has been released.
+ bytes = PdfNormalizer.Normalize(bytes);
+ }
+
targets.Add(
new("pdf", new MemoryStream(bytes))
{