From d61deb03f7b964c590982501b99fb845e2e3dd5b Mon Sep 17 00:00:00 2001 From: alban Date: Tue, 16 Dec 2025 14:46:25 +0100 Subject: [PATCH 01/12] adding support to tif images --- .../UglyToad.PdfPig.Core.csproj | 2 + ...yToad.PdfPig.DocumentLayoutAnalysis.csproj | 2 + .../UglyToad.PdfPig.Fonts.csproj | 2 + .../UglyToad.PdfPig.Tests.csproj | 2 + .../UglyToad.PdfPig.Tokenization.csproj | 2 + .../UglyToad.PdfPig.Tokens.csproj | 2 + src/UglyToad.PdfPig/UglyToad.PdfPig.csproj | 2 + src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs | 82 +++++++++++++++++++ 8 files changed, 96 insertions(+) diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index 7633abb89..b3da8a0c3 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -9,6 +9,8 @@ ..\pdfpig.snk enable nullable + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index aa3d5935a..3cf6c8b0f 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index 81b98652e..fdb68507b 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -8,6 +8,8 @@ true ..\pdfpig.snk annotations + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index fb222e15e..f73700895 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -11,6 +11,8 @@ 2.1.30 enable annotations + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index 2b82d0dd6..47d42f50f 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index be3149021..c3469c0f9 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj index 4eb0271c4..c37a4668c 100644 --- a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj +++ b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj @@ -8,6 +8,8 @@ true ..\pdfpig.snk enable + 25.12.16.1218 + 25.12.16.1218 diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index ff192d7cd..18f24d0fe 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -720,6 +720,7 @@ public AddedImage AddPng(byte[] pngBytes, PdfRectangle placementRectangle) } } + /// /// Adds the PNG image represented by the input stream at the specified location. /// @@ -827,6 +828,86 @@ public AddedImage AddPng(Stream pngStream, PdfRectangle placementRectangle = def return new AddedImage(reference.Data, png.Width, png.Height); } + + /// + /// Adds a CCITT Group 4 (fax) encoded 1bpp image stream as a PDF image XObject (CCITTFaxDecode). + /// This is ideal for monochrome scanned TIFF pages that are already CCITT G4 compressed. + /// + /// + /// Raw CCITT Group 4 (T.6) compressed bytes (NOT decoded bitmap pixels, NOT wrapped in TIFF). + /// + /// Image width in pixels (Columns). + /// Image height in pixels (Rows). + /// + /// Placement rectangle in user space. If default, uses (0,0,width,height). + /// + /// + /// Set to true if 1 bits represent black (common for bilevel scans). + /// If the result looks inverted, pass false. + /// + public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRectangle placementRectangle = default, bool blackIs1 = true) + { + if (ccittG4Data is null) throw new ArgumentNullException(nameof(ccittG4Data)); + if (width <= 0) throw new ArgumentOutOfRangeException(nameof(width)); + if (height <= 0) throw new ArgumentOutOfRangeException(nameof(height)); + + if (placementRectangle.Equals(default(PdfRectangle))) + { + placementRectangle = new PdfRectangle(0, 0, width, height); + } + + // DecodeParms for CCITTFaxDecode: + // K = -1 => Group 4 (T.6) + // Columns/Rows = image dimensions + // BlackIs1 controls polarity (optional but useful) + var decodeParms = new Dictionary + { + { NameToken.Create("K"), new NumericToken(-1) }, + { NameToken.Create("Columns"), new NumericToken(width) }, + { NameToken.Create("Rows"), new NumericToken(height) }, + { NameToken.Create("BlackIs1"), blackIs1 ? BooleanToken.True : BooleanToken.False } + // You can add these if needed for odd inputs: + // { NameToken.Create("EndOfLine"), BooleanToken.False }, + // { NameToken.Create("EncodedByteAlign"), BooleanToken.False }, + // { NameToken.Create("EndOfBlock"), BooleanToken.True } + }; + + var imgDictionary = new Dictionary + { + { NameToken.Type, NameToken.Xobject }, + { NameToken.Subtype, NameToken.Image }, + { NameToken.Width, new NumericToken(width) }, + { NameToken.Height, new NumericToken(height) }, + { NameToken.ColorSpace, NameToken.Devicegray }, + { NameToken.BitsPerComponent, new NumericToken(1) }, + { NameToken.Filter, NameToken.Create("CCITTFaxDecode") }, + { NameToken.DecodeParms, new DictionaryToken(decodeParms) }, + { NameToken.Length, new NumericToken(ccittG4Data.Length) } + }; + + // IMPORTANT: Do NOT recompress. ccittG4Data is already compressed with CCITT Group 4. + var reference = documentBuilder.AddImage(new DictionaryToken(imgDictionary), ccittG4Data); + + var resources = pageDictionary.GetOrCreateDict(NameToken.Resources); + var xObjects = resources.GetOrCreateDict(NameToken.Xobject); + + var key = NameToken.Create(xobjectsNames.NewName()); + xObjects[key] = reference; + + currentStream.Add(Push.Value); + currentStream.Add(new ModifyCurrentTransformationMatrix(new[] + { + placementRectangle.Width, 0, + 0, placementRectangle.Height, + placementRectangle.BottomLeft.X, placementRectangle.BottomLeft.Y + })); + currentStream.Add(new InvokeNamedXObject(key)); + currentStream.Add(Pop.Value); + + return new AddedImage(reference.Data, width, height); + } + + /// /// Copy a page from unknown source to this page /// @@ -1034,6 +1115,7 @@ public PdfPageBuilder CopyFrom(Page srcPage) return this; } + private List DrawLetters(NameToken? name, string text, IWritingFont font, in TransformationMatrix fontMatrix, double fontSize, TransformationMatrix textMatrix) { var horizontalScaling = 1; From c9b40d6c5d12af1ac66131a822f3d885f220f070 Mon Sep 17 00:00:00 2001 From: alban Date: Tue, 16 Dec 2025 18:26:48 +0100 Subject: [PATCH 02/12] autoversion --- src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj | 2 -- .../UglyToad.PdfPig.DocumentLayoutAnalysis.csproj | 3 +-- src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj | 3 +-- src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj | 4 ++-- .../UglyToad.PdfPig.Tokenization.csproj | 3 +-- src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj | 3 +-- src/UglyToad.PdfPig/UglyToad.PdfPig.csproj | 2 -- 7 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index b3da8a0c3..7633abb89 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -9,8 +9,6 @@ ..\pdfpig.snk enable nullable - 25.12.16.1218 - 25.12.16.1218 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index 3cf6c8b0f..e90229d4a 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -7,8 +7,7 @@ true true ..\pdfpig.snk - 25.12.16.1218 - 25.12.16.1218 + True diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index fdb68507b..691064ea4 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -8,8 +8,7 @@ true ..\pdfpig.snk annotations - 25.12.16.1218 - 25.12.16.1218 + True diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index f73700895..24ca767f4 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -11,8 +11,8 @@ 2.1.30 enable annotations - 25.12.16.1218 - 25.12.16.1218 + 25.12.16.1711 + 25.12.16.1711 diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index 47d42f50f..24ac6a40a 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -7,8 +7,7 @@ true true ..\pdfpig.snk - 25.12.16.1218 - 25.12.16.1218 + True diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index c3469c0f9..0bda18121 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -7,8 +7,7 @@ true true ..\pdfpig.snk - 25.12.16.1218 - 25.12.16.1218 + True diff --git a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj index c37a4668c..4eb0271c4 100644 --- a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj +++ b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj @@ -8,8 +8,6 @@ true ..\pdfpig.snk enable - 25.12.16.1218 - 25.12.16.1218 From 519fd45aabde633b6f26cad5a3632e71831106c1 Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 16:12:59 +0100 Subject: [PATCH 03/12] removed assembly version --- src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 24ca767f4..fb222e15e 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -11,8 +11,6 @@ 2.1.30 enable annotations - 25.12.16.1711 - 25.12.16.1711 From 099d0c8bcedfd4bef62b7297a00659b2d08f19a7 Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 16:17:08 +0100 Subject: [PATCH 04/12] removed generateonbuild --- .../UglyToad.PdfPig.DocumentLayoutAnalysis.csproj | 3 +-- src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj | 3 +-- .../UglyToad.PdfPig.Tokenization.csproj | 3 +-- src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index dda732782..74b5f857f 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net462;net471;net6.0;net8.0;net9.0 12 @@ -7,7 +7,6 @@ true true ..\pdfpig.snk - True diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index 109879bcd..b2273382f 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net462;net471;net6.0;net8.0;net9.0 12 @@ -8,7 +8,6 @@ true ..\pdfpig.snk annotations - True diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index 9145d282d..5419b651c 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net462;net471;net6.0;net8.0;net9.0 12 @@ -7,7 +7,6 @@ true true ..\pdfpig.snk - True diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index 3b01c4d42..7fb0e1f91 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net462;net471;net6.0;net8.0;net9.0 12 @@ -7,7 +7,6 @@ true true ..\pdfpig.snk - True From ef664395e5a2a7108ddb81adfa8ad148e387746e Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 16:20:25 +0100 Subject: [PATCH 05/12] cleaned --- src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj | 1 - src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index fb222e15e..2273e092f 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -1,5 +1,4 @@  - net471;net8.0;net9.0 true diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index 18f24d0fe..14a7bd0b5 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -720,7 +720,6 @@ public AddedImage AddPng(byte[] pngBytes, PdfRectangle placementRectangle) } } - /// /// Adds the PNG image represented by the input stream at the specified location. /// @@ -1115,7 +1114,6 @@ public PdfPageBuilder CopyFrom(Page srcPage) return this; } - private List DrawLetters(NameToken? name, string text, IWritingFont font, in TransformationMatrix fontMatrix, double fontSize, TransformationMatrix textMatrix) { var horizontalScaling = 1; From d5649a6bda01cdf17609e9d76c1f2d99c069b4ae Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 20:27:47 +0100 Subject: [PATCH 06/12] addung tests --- .../UglyToad.PdfPig.Core.csproj | 2 ++ ...lyToad.PdfPig.DocumentLayoutAnalysis.csproj | 2 ++ .../UglyToad.PdfPig.Fonts.csproj | 2 ++ .../Images/Files/Tif/TiffCcittG4.tif | Bin 0 -> 5264 bytes .../UglyToad.PdfPig.Tests.csproj | 6 ++++++ .../UglyToad.PdfPig.Tokenization.csproj | 2 ++ .../UglyToad.PdfPig.Tokens.csproj | 2 ++ src/UglyToad.PdfPig/UglyToad.PdfPig.csproj | 2 ++ src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs | 17 +++++++++++++++-- 9 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index 69b008ff4..3a1224b53 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -9,6 +9,8 @@ ..\pdfpig.snk enable nullable + 25.12.27.1608 + 25.12.27.1608 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index 74b5f857f..46564cb0d 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.27.1645 + 25.12.27.1645 diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index b2273382f..be8dd7ded 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -8,6 +8,8 @@ true ..\pdfpig.snk annotations + 25.12.27.1608 + 25.12.27.1608 diff --git a/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif b/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif new file mode 100644 index 0000000000000000000000000000000000000000..29bcdce734233a0da4cf9c7c2b0f4135bf09a261 GIT binary patch literal 5264 zcmaJ^dstHGx;G<3Q-rM1%nI?+RkNnNwYz|nw^11rXf#8b+B+|JX#^%5B9)Y>$?=AH zYMRthD;UH&f(>kB)Y`c{d*(3=aZ5|anLN7%0quE2=D@%@i+1~Y=8rk&eHQEeeeZg| zZ#|3m{l542rl;@lLV9_5t@mE%YrAY{f&M7Z}2<6SwHwK4h{113SF`4&Aa^Ixf|c&wJ;9*&D_Yh z{+{*EdEx5L<@J+fzow^uN%L*aEg>%6^)Fy0GekL-fA2mV{XcN9;|%gK4~ zI5q}LE-x$o@ND@+G3WFX;aichG>qNc?5~ zm?rIBPh#)K9k|5aPX>}B1gS)3%wv4}cP*NGt5zY>)@?$(>vOzlGH)sz6Fq|%3hhUR zV7aq|!1TWGKi1I`GHQK}j@1wklL)@v8314Pb$B{e9L_D}|2_;cF*< zZj{7h{C^TI2A=GmJpV=aWZ1thK~hTlViM_idt$Z_7ZOqzUc08p z!c{1w0`~LxdaNz0w|Ulhv(EO_=!XJWsxTPLojl|w??BI}flquRDV_lz6Ww8s!Cpqh zTI$x{rIUMGMO`DwX_3K8f+tHr6fovnGbHoX7RQRf$Pt;nkk@BXkZxDEn!plMzMYd< z7K?VRPyD&;5S`veY;qWLScizfsrAVzDxfjD_k_$n%L+uW>3_uDS zz_c@&>7{CpRCQP(>QptIMuTN+<&FVG|vuo65he)baS|K)> zOojlr-UYZIszM~6v*=r@O4V$|98@T`ncYsvqS9*R05F_y0z?uk#8B&L%2)9lodIr< zS+1NPwiQkCM}=#c{`)!Zal~wq;?)-Wa!TT2Rm$Jt*gZxWSSg3w-A2o!V~>sve4VNz zqqdw(hV&J7-bmQ~UoKh({IPV*w6XzzS4@5u5>5J{Hk?d4v!==SM;vxCtTC*owJ|(( z$Fa*OLKEvjmnSs8o2VU^9_@W62!amyB|OY34TN+Z_=7(O{vd9D@$*D;)|kX`N||jR zUz7inT_;vE4Mv$kDgLkO-c�Uyk7t36X+@G%#(DK*A~7{ZdJU6aZ=3@Azx5 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 R3+DHlu>aq73F&p|e*twmS@i$_ literal 0 HcmV?d00001 diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 2273e092f..880372bb8 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -10,6 +10,8 @@ 2.1.30 enable annotations + 25.12.27.1645 + 25.12.27.1645 @@ -74,6 +76,7 @@ + @@ -206,4 +209,7 @@ 9.0.8 + + + diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index 5419b651c..e61e55817 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.27.1608 + 25.12.27.1608 diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index 7fb0e1f91..edc058253 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -7,6 +7,8 @@ true true ..\pdfpig.snk + 25.12.27.1608 + 25.12.27.1608 diff --git a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj index 2f9091743..466e91578 100644 --- a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj +++ b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj @@ -8,6 +8,8 @@ true ..\pdfpig.snk enable + 25.12.27.1645 + 25.12.27.1645 diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index 14a7bd0b5..f98fe256f 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -734,7 +734,7 @@ public AddedImage AddPng(Stream pngStream, PdfRectangle placementRectangle = def var data = new byte[png.Width * png.Height * 3]; int pixelIndex = 0; - + for (var rowIndex = 0; rowIndex < png.Height; rowIndex++) { for (var colIndex = 0; colIndex < png.Width; colIndex++) @@ -884,6 +884,19 @@ public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRecta { NameToken.Length, new NumericToken(ccittG4Data.Length) } }; + // NOTE: + // CCITT Fax images + DeviceGray 1bpp are inconsistently rendered by viewers + // if only DecodeParms/BlackIs1 is used. + // Explicit /Decode ensures correct polarity everywhere. + if (blackIs1) + { + imgDictionary[NameToken.Decode] = new ArrayToken(new IToken[] + { + new NumericToken(1), + new NumericToken(0) + }); + } + // IMPORTANT: Do NOT recompress. ccittG4Data is already compressed with CCITT Group 4. var reference = documentBuilder.AddImage(new DictionaryToken(imgDictionary), ccittG4Data); @@ -1080,7 +1093,7 @@ public PdfPageBuilder CopyFrom(Page srcPage) gstateName = newName; } - + // According to PDF spec 32000-1:2008, section 8.4.5, ExtGState can contain both direct values and indirect references if (gstate.Value is IndirectReferenceToken fontReferenceToken) { From f1902ebf17757781a8614c154e1ad940afc4af3a Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 21:03:06 +0100 Subject: [PATCH 07/12] CcittG4 tests --- .../UglyToad.PdfPig.Core.csproj | 4 +- ...yToad.PdfPig.DocumentLayoutAnalysis.csproj | 4 +- .../UglyToad.PdfPig.Fonts.csproj | 4 +- .../UglyToad.PdfPig.Tests.csproj | 4 +- .../Writer/PdfPageBuilderCcittG4Tests.cs | 62 +++++ .../Writer/TestImages/CcittFaxHelpers.cs | 234 ++++++++++++++++++ .../Writer/TestImages/CcittG4TestImage.cs | 44 ++++ .../UglyToad.PdfPig.Tokenization.csproj | 4 +- .../UglyToad.PdfPig.Tokens.csproj | 4 +- src/UglyToad.PdfPig/UglyToad.PdfPig.csproj | 4 +- 10 files changed, 354 insertions(+), 14 deletions(-) create mode 100644 src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs create mode 100644 src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittFaxHelpers.cs create mode 100644 src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittG4TestImage.cs diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index 3a1224b53..a41444763 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -9,8 +9,8 @@ ..\pdfpig.snk enable nullable - 25.12.27.1608 - 25.12.27.1608 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index 46564cb0d..31ce5e646 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -7,8 +7,8 @@ true true ..\pdfpig.snk - 25.12.27.1645 - 25.12.27.1645 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index be8dd7ded..030031034 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -8,8 +8,8 @@ true ..\pdfpig.snk annotations - 25.12.27.1608 - 25.12.27.1608 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 880372bb8..852b8c57e 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -10,8 +10,8 @@ 2.1.30 enable annotations - 25.12.27.1645 - 25.12.27.1645 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs new file mode 100644 index 000000000..918e1ec10 --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs @@ -0,0 +1,62 @@ +namespace UglyToad.PdfPig.Tests.Writer +{ + using UglyToad.PdfPig; + using UglyToad.PdfPig.Tests.Writer.TestImages; + using UglyToad.PdfPig.Writer; + using Xunit; + + public class PdfPageBuilderCcittG4Tests + { + [Fact] + public void FixtureProvidesRawCcittData() + { + var fixture = CcittG4TestImage.Load(); + + Assert.True(fixture.Width > 0); + Assert.True(fixture.Height > 0); + Assert.NotEmpty(fixture.RawCcittData); + Assert.EndsWith("Images/Files/Tif/TiffCcittG4.tif", fixture.SourcePath.Replace('\\', '/')); + Assert.True(fixture.BlackIs1); + } + + [Fact] + public void InspectorMatchesFixtureMetadata() + { + var fixture = CcittG4TestImage.Load(); + var info = TiffFaxInspector.Inspect(fixture.SourcePath); + + Assert.Equal(fixture.Width, info.Width); + Assert.Equal(fixture.Height, info.Height); + Assert.True(info.IsCcittG4); + Assert.True(info.IsBilevel); + Assert.Equal(fixture.BlackIs1, info.BlackIs1); + Assert.Null(info.Diagnostic); + } + + [Fact] + public void AddCcittG4AddsFaxImage() + { + var fixture = CcittG4TestImage.Load(); + + byte[] pdfBytes; + using (var documentBuilder = new PdfDocumentBuilder()) + { + var page = documentBuilder.AddPage(fixture.Width, fixture.Height); + + page.AddCcittG4(fixture.RawCcittData, fixture.Width, fixture.Height, blackIs1: fixture.BlackIs1); + + pdfBytes = documentBuilder.Build(); + } + + using (var document = PdfDocument.Open(pdfBytes)) + { + var page = document.GetPage(1); + var image = Assert.Single(page.GetImages()); + + Assert.Equal(fixture.Width, image.WidthInSamples); + Assert.Equal(fixture.Height, image.HeightInSamples); + Assert.Equal(1, image.BitsPerComponent); + } + } + } +} \ No newline at end of file diff --git a/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittFaxHelpers.cs b/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittFaxHelpers.cs new file mode 100644 index 000000000..19df02839 --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittFaxHelpers.cs @@ -0,0 +1,234 @@ +namespace UglyToad.PdfPig.Tests.Writer.TestImages +{ + using System; + using System.IO; + using System.Reflection; + using BitMiracle.LibTiff.Classic; + + internal sealed record CcittG4Payload(int Width, int Height, byte[] Data, bool BlackIs1); + + internal static class CcittExtractor + { + public static CcittG4Payload FromTiff(string tiffPath) + { + using var tif = Tiff.Open(tiffPath, "r"); + if (tif == null) + { + throw new InvalidOperationException($"Cannot open TIFF: {tiffPath}"); + } + + tif.SetDirectory(0); + + int compression = TiffFaxInspector.GetIntTag(tif, TiffTag.COMPRESSION); + if (compression != (int)Compression.CCITTFAX4) + { + throw new InvalidOperationException($"Not CCITT G4 (Compression={compression})."); + } + + int width = TiffFaxInspector.GetIntTag(tif, TiffTag.IMAGEWIDTH); + int height = TiffFaxInspector.GetIntTag(tif, TiffTag.IMAGELENGTH); + + int spp = TiffFaxInspector.GetIntTagOrDefault(tif, TiffTag.SAMPLESPERPIXEL, 1); + int bps = TiffFaxInspector.GetIntTagOrDefault(tif, TiffTag.BITSPERSAMPLE, 1); + if (!(spp == 1 && bps == 1)) + { + throw new InvalidOperationException($"Not bilevel (spp={spp}, bps={bps})."); + } + + int photo = TiffFaxInspector.GetIntTagOrDefault(tif, TiffTag.PHOTOMETRIC, (int)Photometric.MINISWHITE); + bool blackIs1 = photo == (int)Photometric.MINISWHITE; + + var stripOffsets = TryGetLongArrayTag(tif, TiffTag.STRIPOFFSETS); + var stripByteCounts = TryGetLongArrayTag(tif, TiffTag.STRIPBYTECOUNTS); + + if (stripOffsets != null && stripByteCounts != null && stripOffsets.Length == stripByteCounts.Length && stripOffsets.Length > 0) + { + var data = ReadSegments(tiffPath, stripOffsets, stripByteCounts); + return new CcittG4Payload(width, height, data, blackIs1); + } + + var tileOffsets = TryGetLongArrayTag(tif, TiffTag.TILEOFFSETS); + var tileByteCounts = TryGetLongArrayTag(tif, TiffTag.TILEBYTECOUNTS); + + if (tileOffsets != null && tileByteCounts != null && tileOffsets.Length == tileByteCounts.Length && tileOffsets.Length > 0) + { + var data = ReadSegments(tiffPath, tileOffsets, tileByteCounts); + return new CcittG4Payload(width, height, data, blackIs1); + } + + throw new InvalidOperationException("Cannot locate strips/tiles offsets/bytecounts."); + } + + private static byte[] ReadSegments(string filePath, long[] offsets, long[] byteCounts) + { + using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); + using var ms = new MemoryStream(); + + for (int i = 0; i < offsets.Length; i++) + { + fs.Seek(offsets[i], SeekOrigin.Begin); + if (byteCounts[i] > int.MaxValue) + { + throw new InvalidOperationException("Segment too large."); + } + + int length = (int)byteCounts[i]; + var buffer = new byte[length]; + int read = 0; + while (read < length) + { + int r = fs.Read(buffer, read, length - read); + if (r <= 0) + { + throw new EndOfStreamException("Unexpected EOF while reading segment."); + } + + read += r; + } + + ms.Write(buffer, 0, length); + } + + return ms.ToArray(); + } + + private static long[]? TryGetLongArrayTag(Tiff tif, TiffTag tag) + { + var fieldValue = tif.GetField(tag); + if (fieldValue == null || fieldValue.Length == 0) + { + return null; + } + + object value = fieldValue[0].Value; + + return value switch + { + long[] la => la, + int[] ia => Array.ConvertAll(ia, x => (long)x), + uint[] uia => Array.ConvertAll(uia, x => (long)x), + short[] sa => Array.ConvertAll(sa, x => (long)x), + ushort[] usa => Array.ConvertAll(usa, x => (long)x), + long l => new[] { l }, + int i => new[] { (long)i }, + uint ui => new[] { (long)ui }, + _ => null + }; + } + } + + internal sealed record TiffFaxInfo(int Width, int Height, bool IsCcittG4, bool IsBilevel, bool BlackIs1, string? Diagnostic); + + internal static class TiffFaxInspector + { + public static TiffFaxInfo Inspect(string tiffPath) + { + try + { + using var tif = Tiff.Open(tiffPath, "r"); + if (tif == null) + { + return new TiffFaxInfo(0, 0, false, false, false, "Cannot open TIFF"); + } + + tif.SetDirectory(0); + + int width = GetIntTag(tif, TiffTag.IMAGEWIDTH); + int height = GetIntTag(tif, TiffTag.IMAGELENGTH); + + int compression = GetIntTag(tif, TiffTag.COMPRESSION); + bool isG4 = compression == (int)Compression.CCITTFAX4; + + int spp = GetIntTagOrDefault(tif, TiffTag.SAMPLESPERPIXEL, 1); + int bps = GetIntTagOrDefault(tif, TiffTag.BITSPERSAMPLE, 1); + bool bilevel = spp == 1 && bps == 1; + + int photo = GetIntTagOrDefault(tif, TiffTag.PHOTOMETRIC, (int)Photometric.MINISWHITE); + bool blackIs1 = photo == (int)Photometric.MINISWHITE; + + return new TiffFaxInfo(width, height, isG4, bilevel, blackIs1, null); + } + catch (Exception ex) + { + return new TiffFaxInfo(0, 0, false, false, false, ex.Message); + } + } + + internal static int GetIntTag(Tiff tif, TiffTag tag) + { + var fieldValue = tif.GetField(tag); + if (fieldValue == null || fieldValue.Length == 0) + { + throw new InvalidOperationException($"Missing TIFF tag {tag}."); + } + + return Convert.ToInt32(fieldValue[0].Value); + } + + internal static int GetIntTagOrDefault(Tiff tif, TiffTag tag, int defaultValue) + { + var fieldValue = tif.GetField(tag); + if (fieldValue == null || fieldValue.Length == 0) + { + return defaultValue; + } + + return Convert.ToInt32(fieldValue[0].Value); + } + } + + internal static class LibTiffSilencer + { + public static void SuppressWarnings() => TrySetHandler("SetWarningHandler"); + + public static void SuppressWarningsAndErrors() + { + TrySetHandler("SetWarningHandler"); + TrySetHandler("SetErrorHandler"); + } + + private static void TrySetHandler(string methodName) + { + var tiffType = typeof(Tiff); + + foreach (var method in tiffType.GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + if (!string.Equals(method.Name, methodName, StringComparison.Ordinal)) + { + continue; + } + + var parameters = method.GetParameters(); + if (parameters.Length != 1) + { + continue; + } + + var delegateType = parameters[0].ParameterType; + var handlerInfo = typeof(LibTiffSilencer).GetMethod( + nameof(EmptyHandler), + BindingFlags.NonPublic | BindingFlags.Static); + + if (handlerInfo is null) + { + return; + } + + try + { + var handler = Delegate.CreateDelegate(delegateType, handlerInfo); + method.Invoke(null, new object[] { handler }); + return; + } + catch + { + return; + } + } + } + + private static void EmptyHandler(string module, string format, params object[] args) + { + } + } +} \ No newline at end of file diff --git a/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittG4TestImage.cs b/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittG4TestImage.cs new file mode 100644 index 000000000..5f82376fa --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Writer/TestImages/CcittG4TestImage.cs @@ -0,0 +1,44 @@ +namespace UglyToad.PdfPig.Tests.Writer.TestImages +{ + using System; + using System.IO; + + /// + /// Helper for loading the CCITT Group 4 TIFF fixture used by PDF page builder tests. + /// + internal sealed class CcittG4TestImage + { + private CcittG4TestImage(int width, int height, byte[] rawCcittData, string sourcePath, bool blackIs1) + { + Width = width; + Height = height; + RawCcittData = rawCcittData; + SourcePath = sourcePath; + BlackIs1 = blackIs1; + } + + public int Width { get; } + + public int Height { get; } + + public byte[] RawCcittData { get; } + + public string SourcePath { get; } + + public bool BlackIs1 { get; } + + /// + /// Loads the CCITT Group 4 sample image relative to the test output directory. + /// + public static CcittG4TestImage Load() + { + var tiffPath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", + "Images", "Files", "Tif", "TiffCcittG4.tif")); + + LibTiffSilencer.SuppressWarnings(); + + var payload = CcittExtractor.FromTiff(tiffPath); + return new CcittG4TestImage(payload.Width, payload.Height, payload.Data, tiffPath, payload.BlackIs1); + } + } +} \ No newline at end of file diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index e61e55817..c878169fd 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -7,8 +7,8 @@ true true ..\pdfpig.snk - 25.12.27.1608 - 25.12.27.1608 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index edc058253..10afceeda 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -7,8 +7,8 @@ true true ..\pdfpig.snk - 25.12.27.1608 - 25.12.27.1608 + 25.12.27.1951 + 25.12.27.1951 diff --git a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj index 466e91578..729a4aec0 100644 --- a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj +++ b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj @@ -8,8 +8,8 @@ true ..\pdfpig.snk enable - 25.12.27.1645 - 25.12.27.1645 + 25.12.27.1951 + 25.12.27.1951 From 8a3df68f59ef44fe63912e6125bbcbbba4f7b5fa Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 21:16:18 +0100 Subject: [PATCH 08/12] tiff to pdf write test --- src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj | 4 ++-- .../Writer/PdfPageBuilderCcittG4Tests.cs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 852b8c57e..e106db196 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -10,8 +10,8 @@ 2.1.30 enable annotations - 25.12.27.1951 - 25.12.27.1951 + 25.12.27.2007 + 25.12.27.2007 diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs index 918e1ec10..cbf00f87a 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfPageBuilderCcittG4Tests.cs @@ -48,6 +48,8 @@ public void AddCcittG4AddsFaxImage() pdfBytes = documentBuilder.Build(); } + File.WriteAllBytes(@"PdfPageBuilderTests_CanAddTifCcittG4.pdf", pdfBytes); + using (var document = PdfDocument.Open(pdfBytes)) { var page = document.GetPage(1); From 8494c64a2d00b5204416b4f398c4e51a5dd029c2 Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 21:23:58 +0100 Subject: [PATCH 09/12] cleaned --- src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj | 4 +--- .../UglyToad.PdfPig.DocumentLayoutAnalysis.csproj | 2 -- src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj | 2 -- src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj | 2 -- .../UglyToad.PdfPig.Tokenization.csproj | 2 -- src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj | 2 -- 6 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index a41444763..5af319ef9 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net462;net471;net6.0;net8.0;net9.0 12 @@ -9,8 +9,6 @@ ..\pdfpig.snk enable nullable - 25.12.27.1951 - 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index 31ce5e646..74b5f857f 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -7,8 +7,6 @@ true true ..\pdfpig.snk - 25.12.27.1951 - 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index 030031034..b2273382f 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -8,8 +8,6 @@ true ..\pdfpig.snk annotations - 25.12.27.1951 - 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index e106db196..1e57cb401 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -10,8 +10,6 @@ 2.1.30 enable annotations - 25.12.27.2007 - 25.12.27.2007 diff --git a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj index c878169fd..5419b651c 100644 --- a/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj +++ b/src/UglyToad.PdfPig.Tokenization/UglyToad.PdfPig.Tokenization.csproj @@ -7,8 +7,6 @@ true true ..\pdfpig.snk - 25.12.27.1951 - 25.12.27.1951 diff --git a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj index 10afceeda..7fb0e1f91 100644 --- a/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj +++ b/src/UglyToad.PdfPig.Tokens/UglyToad.PdfPig.Tokens.csproj @@ -7,8 +7,6 @@ true true ..\pdfpig.snk - 25.12.27.1951 - 25.12.27.1951 From 15ab6db98dc25f032defef7e4b4ab370a0292328 Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 27 Dec 2025 21:33:10 +0100 Subject: [PATCH 10/12] last clean --- src/UglyToad.PdfPig/UglyToad.PdfPig.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj index 729a4aec0..2f9091743 100644 --- a/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj +++ b/src/UglyToad.PdfPig/UglyToad.PdfPig.csproj @@ -8,8 +8,6 @@ true ..\pdfpig.snk enable - 25.12.27.1951 - 25.12.27.1951 From fee38d75b29aa780e06e294e7f3b97b1ca33fa90 Mon Sep 17 00:00:00 2001 From: alban Date: Sat, 24 Jan 2026 13:51:55 +0100 Subject: [PATCH 11/12] removed blackis to avoid double inverse and added EndOfBlock for some tiffs --- src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs | 29 +++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index f98fe256f..f38211bdc 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -844,7 +844,8 @@ public AddedImage AddPng(Stream pngStream, PdfRectangle placementRectangle = def /// Set to true if 1 bits represent black (common for bilevel scans). /// If the result looks inverted, pass false. /// - public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRectangle placementRectangle = default, bool blackIs1 = true) + public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRectangle placementRectangle = default, bool blackIs1 = true, + bool endOfBlock = true) { if (ccittG4Data is null) throw new ArgumentNullException(nameof(ccittG4Data)); if (width <= 0) throw new ArgumentOutOfRangeException(nameof(width)); @@ -864,7 +865,8 @@ public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRecta { NameToken.Create("K"), new NumericToken(-1) }, { NameToken.Create("Columns"), new NumericToken(width) }, { NameToken.Create("Rows"), new NumericToken(height) }, - { NameToken.Create("BlackIs1"), blackIs1 ? BooleanToken.True : BooleanToken.False } + //{ NameToken.Create("BlackIs1"), blackIs1 ? BooleanToken.True : BooleanToken.False }, + { NameToken.Create("EndOfBlock"), endOfBlock ? BooleanToken.True : BooleanToken.False } // You can add these if needed for odd inputs: // { NameToken.Create("EndOfLine"), BooleanToken.False }, // { NameToken.Create("EncodedByteAlign"), BooleanToken.False }, @@ -884,18 +886,19 @@ public AddedImage AddCcittG4(byte[] ccittG4Data, int width, int height, PdfRecta { NameToken.Length, new NumericToken(ccittG4Data.Length) } }; - // NOTE: - // CCITT Fax images + DeviceGray 1bpp are inconsistently rendered by viewers - // if only DecodeParms/BlackIs1 is used. - // Explicit /Decode ensures correct polarity everywhere. - if (blackIs1) + // FIX DEFINITIVO: per CCITT Fax va SEMPRE specificato /Decode + // blackIs1 = true => 1 = nero => Decode [1 0] + // blackIs1 = false => 1 = bianco => Decode [0 1] + //Photometric = MINISBLACK(1) ⇒ blackIs1 = true ⇒ / Decode[1 0] + //Photometric = MINISWHITE(0) ⇒ blackIs1 = false ⇒ / Decode[0 1] + + // Polarità gestita SOLO tramite /Decode (non BlackIs1) + imgDictionary[NameToken.Decode] = new ArrayToken(new IToken[] { - imgDictionary[NameToken.Decode] = new ArrayToken(new IToken[] - { - new NumericToken(1), - new NumericToken(0) - }); - } + blackIs1 ? new NumericToken(1) : new NumericToken(0), + blackIs1 ? new NumericToken(0) : new NumericToken(1) + }); + // IMPORTANT: Do NOT recompress. ccittG4Data is already compressed with CCITT Group 4. var reference = documentBuilder.AddImage(new DictionaryToken(imgDictionary), ccittG4Data); From fb477c4e82a2de7783c8b313db1e0275efd2727e Mon Sep 17 00:00:00 2001 From: username77 Date: Thu, 7 May 2026 08:01:22 +0200 Subject: [PATCH 12/12] Remove LibTiff-based CCITT fixture generator Drop the LibTiff-based fixture tool and TIFF source file, keep tests using the pre-generated CCITT payload and minimal metadata, and remove accidental BOM-only csproj changes flagged in review. --- .../UglyToad.PdfPig.Core.csproj | 2 +- ...yToad.PdfPig.DocumentLayoutAnalysis.csproj | 2 +- .../UglyToad.PdfPig.Fonts.csproj | 2 +- .../Images/Files/Tif/TiffCcittG4.fixture.json | 8 +- .../Images/Files/Tif/TiffCcittG4.tif | Bin 329656 -> 0 bytes .../Writer/TestImages/CcittG4TestImage.cs | 3 +- .../UglyToad.PdfPig.Tokenization.csproj | 2 +- .../UglyToad.PdfPig.Tokens.csproj | 2 +- .../CcittFixtureGenerator.csproj | 12 - tools/CcittFixtureGenerator/Program.cs | 272 ------------------ 10 files changed, 8 insertions(+), 297 deletions(-) delete mode 100644 src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif delete mode 100644 tools/CcittFixtureGenerator/CcittFixtureGenerator.csproj delete mode 100644 tools/CcittFixtureGenerator/Program.cs diff --git a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj index d32b77e70..3c96d8700 100644 --- a/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj +++ b/src/UglyToad.PdfPig.Core/UglyToad.PdfPig.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;net462;net471;net6.0;net8.0;net9.0 12 diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj index 5b030ac22..57459a5ae 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/UglyToad.PdfPig.DocumentLayoutAnalysis.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;net462;net471;net6.0;net8.0;net9.0 12 diff --git a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj index 6c3c59a01..021989e2e 100644 --- a/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj +++ b/src/UglyToad.PdfPig.Fonts/UglyToad.PdfPig.Fonts.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;net462;net471;net6.0;net8.0;net9.0 12 diff --git a/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.fixture.json b/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.fixture.json index 9cace94ee..ba1072dea 100644 --- a/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.fixture.json +++ b/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.fixture.json @@ -1,9 +1,5 @@ { "Width": 1800, "Height": 3113, - "BlackIs1": false, - "Photometric": 0, - "FillOrder": 1, - "PayloadLength": 329546, - "SourceFile": "TiffCcittG4.tif" -} \ No newline at end of file + "BlackIs1": false +} diff --git a/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif b/src/UglyToad.PdfPig.Tests/Images/Files/Tif/TiffCcittG4.tif deleted file mode 100644 index 867861a4d13f8b195a8c57999d3d590ac3454924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329656 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 d%CFPfX#Jyh#!n;gmkR|uPLkU{Bb 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