Changelog History
-
v0.1.14 Changes
March 22, 2026๐ Auto generated release notes
- Increment version to 0.1.14 by @BobLd in #1231
- Introduce StackDepthGuard class to check for stack depth in CoreTokenScanner and fix #1217 by @BobLd in #1220
- โ Add Links to Pdf Generation by @ochsnerd in #1232
- โ Make LinkAnnotation internal to fix unit tests by @BobLd in #1239
- Only throw if ArrayToken length is lesss than 4 in ToRectangle() and fix #1238 by @BobLd in #1240
- ๐ Handle empty encoding in Type1FontSimple and fix #1248 by @BobLd in #1249
- ๐ Make extended graphics states stacked too by @PsykerUdot in #1246
- both Tj and TJ operators should increment text sequence #1241 by @EliotJones in #1251
- ๐ Improve HasFormXObjectCircularReference and fix #1250 by @BobLd in #1252
- ๐ replace release flow single job with pr process by @EliotJones in #1253
- โ Add UglyToad.PdfPig.Benchmarks and misc performance improvements by @BobLd in #1255
- ๐ Make LinkAnnotation public by @BobLd in #1256
- โช revert flate decode handling to more lenient processing by @EliotJones in #1254
- ๐ Fix Benchmarks solution and add BruteForceBenchmarks by @BobLd in #1260
- โ Additional digital corpora testing by @EliotJones in #1261
- Introduce IBlock and ILettersBlock interfaces (Round 2) by @davebrokit in #1263
- ๐ Improve SystemFontFinder performance and add benchmarks by @BobLd in #1264
- For shading types 4 to 7, add Data property containing descriptive data characterizing the shading's gradient fill by @BobLd in #1267
- creating branch in the previous step conflicts by @EliotJones in #1269
- ๐ change the release flow to work on tags by @EliotJones in #1271
๐ New Contributors
Full Changelog : 0.1.13...v0.1.14
-
v0.1.13 Changes
December 23, 2025What's Changed
- Increment version to 0.1.13 by @BobLd in #1207
- Simply order by offset also when not doing brute force to fix #1208 by @BobLd in #1210
- Ensure no key end up missing in ResolveInternal and fix #1209 by @BobLd in #1211
- ๐ update release logic to check out master before commit by @EliotJones in #1212
- Return empty glyph in ReadCompositeGlyph when glyphIndex is out of range and fix #1213 by @BobLd in #1215
- Handling of optional content group names without proper name by @carlokok in #1216
- ๐ Minor Type1FontParser optimisations by @BobLd in #1221
- ๐ Use file header offset when doing brute force find and fix #1223 by @BobLd in #1224
- Do not return glyph bbox and path in Type1Font if character name is '.notdef' by @BobLd in #1229
๐ New Contributors
Full Changelog : v0.1.12...unreleased
-
v0.1.12 Changes
November 13, 2025What's Changed
- โ add nullability to core project by @EliotJones in #1111
- ๐ Fix usage of List.Contains by @theolivenbaum in #1112
- ๐ allow missing catalog type definition for catalog dictionary by @EliotJones in #1113
- ๐ Performance improvements and .Net 9 support by @chuckbeasley in #1116
- Update run_integration_tests.yml by @BobLd in #1117
- โ Add global.json in tools by @BobLd in #1118
- Update run_integration_tests.yml by @BobLd in #1119
- Update run_integration_tests.yml by @BobLd in #1120
- Update run_common_crawl_tests.yml by @BobLd in #1121
- ๐ Update nightly_release.yml by @BobLd in #1123
- Increase FlateFilter multiplier when preventing malicious OOM and fix #1125 by @BobLd in #1126
- Update build_and_test_macos.yml by @BobLd in #1129
- Update build_and_test_macos.yml by @BobLd in #1130
- ๐ Prevent StackOverflow in ParseTrailer and fix #1122 by @BobLd in #1127
- ๐ Lower max search depth in preventing StackOverflow in ParseTrailer by @BobLd in #1131
- โ add container node support for BookmarksProvider.cs by @migeyusu in #1133
- ๐ move file parsing to single-pass static methods by @EliotJones in #1102
- โ Add early version of IOSSystemFontLister by @BobLd in #1143
- File buffering read stream investigation by @EliotJones in #1140
- ๐ Draft release on master build by @EliotJones in #1145
- ๐ First create the StreamInputBytes in PdfDocument.Open() to check the stream CanRead and CanSeek by @BobLd in #1147
- ๐ Fix font matrix issues by @BobLd in #1150
- ๐ Properly fix #1148 by always parsing optional tables in TrueTypeFontParser and remove Type 0 font hack by @BobLd in #1151
- ๐ copy other parser behavior by treating end of stream as valid end inline image by @EliotJones in #1152
- โ add test jobs for common crawl 0000 to 0007 by @EliotJones in #1153
- ๐ handle case where xobjects use same key as fonts by @EliotJones in #1154
- read last line of ignore file by @EliotJones in #1155
- ๐ Use correct font matrix when transforming the width in Type 0 font and fix #1156 by @BobLd in #1157
- โ Add initial support to process CFF fonts contained inside a TrueType font by @BobLd in #1159
- ๐ Handle non seekable stream by copying it into a memory stream and fix #1146 by @BobLd in #1158
- ๐ handle case where offsets are out of range by @EliotJones in #1160
- ๐ Use record struct in FileHeaderOffset by @BobLd in #1161
- ๐ฆ Expose letter's font via GetFont(), make Font property as obsolete and use FontDetails instead by @BobLd in #1166
- โ Add GetDescent() and GetAscent() to IFont and loose bounding box to letter by @BobLd in #1167
- ๐ Use pageFactoryCache.Clear() in Pages dispose and fix #1170 by @BobLd in #1174
- ๐ Bugfix: xref-streams were not added by @ricflams in #1173
- Guard against circular references in XRef tables/streams by @ricflams in #1175
- โ Add more tests to NearestNeighbourWordExtractorTests by @BobLd in #1180
- ๐ Feature/improve group indexes by @BobLd in #1181
- Trim excess in long lived font collections by @BobLd in #1184
- ๐ Set Type 3 font ascent to Top instead of Height, see #1164 by @BobLd in #1185
- ๐ Only apply RemoveStridePadding() when bytes per pixel is one and fix #1183 by @BobLd in #1187
- ๐ Use zlib decode to properly use window size and checksum in flate filter by @rhuijben in #1186
- ๐ Avoid doing a true file seek for simple peeking in the token parser by @rhuijben in #1188
- ๐ Fix regression introduced in 3592fc8 where slicing the stream to the length breaks decoding by @BobLd in #1192
- โก๏ธ Update NameToUnicodeConvertAglSpecification to test what was intended by @rhuijben in #1191
- โ Add CMap caching at document level and add MurmurHash3 hashing function by @BobLd in #1193
- ๐ Avoid reading ahead and then seeking back by @rhuijben in #1189
- Do not slice the stream to the length breaks decoding in FlateDecode by @BobLd in #1194
- ๐ Update test run command to use Release configuration by @BobLd in #1195
- ๐ Make geometric transforms consistent with PDF specification by @PsykerUdot in #1198
- Check for index out of range in GlyphDataTable.ReadFlags() and fix #1199 by @BobLd in #1201
- Check for array size before slice in ColorSpaceDetailsByteConverter.Convert() by @BobLd in #1202
- ๐ Bugs/revert e11dc6b by @BobLd in #1203
๐ New Contributors
- @chuckbeasley made their first contribution in #1116
- @migeyusu made their first contribution in #1133
- @rhuijben made their first contribution in #1186
- @PsykerUdot made their first contribution in #1198
Full Changelog : v0.1.11...v0.1.12
-
v0.1.11 Changes
July 26, 2025Welcome to version 0.1.11. The changes in this version have mainly focused on stability. There is a breaking API change.
๐ We have also started to run tests against a larger corpus of documents from Common Crawl allowing us to find bugs and malformed files proactively. This release is screened against 6000 additional files.
- ๐ Improvements to content and font parsing detected by fuzzing inputs.
- ๐ Improvements and resiliency for finding the
startxreflocation when parsing a file.. - โ Adds build and tests for Mac OS as well as retrieving system fonts on iPad (Mac Catalyst).
- ๐ Support clipping when rendering XObjects.
- Prevent malformed files leading to an out-of-memory when decompressing streams.
- ๐ Make
IGraphicsStateOperationFactoryandReflectionGraphicsStateOperationFactorypublic. - ๐ Softmask support for images.
- ๐ Performance improvements using
SpanandReadOnlyMemorywhere available. - ๐ Handle corrupt files where the stream contains comment tokens.
- ๐ Improvements to copying from existing files when using
PdfDocumentBuilder, fixes some bugs with copying fonts and dictionary tokens referenced indirectly. - ๐ Handle corrupt files with double
endstreamdefinitions. - ๐ More tolerant parsing for a number of invalid PDFs, including invalid USC2 input, CMAP formats, CFF fonts, missing font subtypes, invalid
xreftable positions, missing/FirstCharentry for font dictionaries and corrupt ASCII 85 encoded data. - ๐ Fix an issue where adding content to an existing PDF using
PdfDocumentBuildercould result in upside-down or wrongly positioned text due to global transforms in the source PDF. - ๐ New option to completely skip annotations when building a document.
- Prevent infinite loops in certain documents #1096.
- ๐ Improved performance when tokenizing numbers, this should provide a minor speed improvement.
- When adding a page from an existing PDF to a
PdfDocumentBuilderany external link annotations should be preserved.
๐ฅ Breaking changes
The method on
PdfDocumentBuilder:public PdfPageBuilder AddPage(PdfDocument document, int pageNumber, Func<PdfAction, PdfAction?>? copyLink)๐ Has been changed to wrap the
copyLinkparameter in an options object to support theKeepAnnotationsoption:public PdfPageBuilder AddPage(PdfDocument document, int pageNumber, AddPageOptions options)You can just set the
CopyLinkFuncproperty in the options object if you need to access this functionality.๐ฒ Auto generated change log
- โฌ๏ธ Bump version to 0.1.11-alpha001 by @BobLd in #1009
- ๐ Improve Jpeg2000Helper to support J2K codec and add test by @BobLd in #1010
- โ Add SetStrokeDetails() and SetFillDetails() to PdfPath and tidy up ContentStreamProcessor by @BobLd in #1014
- Implement clipping in ProcessFormXObject() by @BobLd in #1015
- ๐ Fix #1017 by @lofcz in #1018
- ๐ Fix PatternColor Equals() method and fix #1016 by @BobLd in #1019
- ๐ Feature/image mask by @BobLd in #1012
- โก๏ธ Update README.md by @BobLd in #1020
- ๐ Fix bug where FormXObject bbox needs to be normalised by @BobLd in #1021
- โ Add MacOS test pipeline and fix failing tests by @BobLd in #1025
- โก๏ธ Update README.md by @BobLd in #1026
- Seal PdfSubpath class and IPathCommand implementations, fix Close.GetHashCode() and fix #1027 by @BobLd in #1029
- ๐ Fix issue #1013 by @BobLd in #1031
- โ Add support for MacCatalyst in SystemFontFinder by @BobLd in #1033
- ๐ Make sure the value of the ImageMask / Im token is check in ColorSpaceDetailsParser by @BobLd in #1038
- โ Add early support for Stencil masking, rename SoftMaskImage property into MaskImage and make sure IsInlineImage is true for InlineImage by @BobLd in #1039
- ๐ Bugfix and optimize GetStartXrefPosition by @ricflams in #1036
- ๐ Fix bug introduced in #1039 by @BobLd in #1041
- Try to repair xref offset by looking for all startxref and fix #1040 by @BobLd in #1044
- โ Add test to ensure #822 is fixed by @BobLd in #1045
- ๐ Handle TrueType case in CidFontFactory where the font is CFF by @BobLd in #1046
- Issues/1048 by @BobLd in #1049
- Check for infinite recursion in ObjectLocationProvider.TryGetOffset() and fix #1050 by @BobLd in #1051
- ๐ Improve IFilter memory allocation by @BobLd in #1052
- ๐จ Modernise PngPredictor and refactor LzwFilter and FlateFilter to reduce memory allocation by @BobLd in #1053
- Do not throw if the Mask dictionary contains a ColorSpace key by @BobLd in #1055
- ๐ Make the Diacritics class public for use in external StreamProcessors by @BobLd in #1056
- โ Add extension method to get Memory from MemoryStream, attempting to do it without allocation and update CMapParser by @BobLd in #1057
- Miscellaneous minor changes by @BobLd in #1058
- โก๏ธ Optimize internal representation of IndirectReference by @BobLd in #1059
- Skip creating IndirectReference in CrossReferenceTablePartBuilder when generationNumber is more than 65,535 by @BobLd in #1060
- Check ColorSpace token as dictionary and fix issue #1061 by @BobLd in #1063
- ๐ Make classes related to page content parsing public by @BobLd in #1065
- Prevent RunLengthFilter malicious OOM by @BobLd in #1068
- ๐ Use ReadOnlyMemory in ShowText operators and implement MoveToNextLineShowTextWithSpacing parsing by @BobLd in #1066
- ๐ Fix bug in PngFromPdfImageFactory where softmask is wrongly referenced. by @orrest in #1069
- ๐ Fix issue 926 by @EliotJones in #1072
- writer util did not follow reference links #1032 by @EliotJones in #1073
- ๐ fix #670 by ignoring duplicate endstream definitions by @EliotJones in #1075
- skip single letter final blocks by @EliotJones in #1076
- ๐ fix copying of sub-dictionary when keys collide by @EliotJones in #1077
- ๐ use correct bounding boxes for standard 14 glyphs #850 by @EliotJones in #1080
- back-calculate first char if last char and widths present by @EliotJones in #1081
- ๐ fix off-by-one and optimize brute force xref search #1078 by @EliotJones in #1079
- fall back to times-roman as standard 14 font when lenient by @EliotJones in #1085
- ๐ allow reading to continue if encountering an invalid surrogate pair by @EliotJones in #1084
- ๐ fix colorspace error when form xobject contains a transparency group by @EliotJones in #1088
- ๐ support bfrange having incorrect length in a cmap by @EliotJones in #1089
- โ add new action to run integration against common crawl corpus by @EliotJones in #1090
- Update run_common_crawl_tests.yml by @BobLd in #1091
- โ Remove decode parameter application from Stencil color space for consistency by @BobLd in #1092
- โก๏ธ Update hack for 1bpc + DeviceGray by @BobLd in #1093
- when writing content to an existing page inverse any global transform #614 by @EliotJones in #1094
- โ add option to strip annotation by @EnraH in #492
- check for cycles during indirect reference resolution by @jan-sutter in #1097
- โก๏ธ i merged a pr which broke the build, this updates the build to work by @EliotJones in #1099
- โ remove debug asserts causing test failures by @EliotJones in #1098
- โ Track IndirectReference instead of only ObjectNumber when checking for cycles during indirect reference resolution and add test by @BobLd in #1101
- ๐ move last uncovered operators to switch statement by @EliotJones in #1100
- rework numeric tokenizer hot path by @EliotJones in #1104
- ๐ make link copying more tolerant when adding page by @EliotJones in #1103
- ๐ handle additional broken pdf files in the common crawl set by @EliotJones in #1108
- โก๏ธ update readme to avoid people using
page.Textor asking about editing docs by @EliotJones in #110...
-
v0.1.10 Changes
March 08, 2025What's Changed
- ๐ Fix GetTextOrientation by cleanly checking if rotation is divisible by 90 and fix #913 by @BobLd in #914
- โ Add early version of BrowserSystemFontLister by @BobLd in #920
- โ Remove list from FileTrailerParser.GetStartXrefPosition() by @BobLd in #922
- Reorganise Filters and make them public by @BobLd in #925
- ๐ Support decrypting V4/R4 files with AESV2 and no Length property by @Greybird in #924
- ๐ Use pdfScanner in ReadVerticalDisplacements and fix #693 and return 0โฆ by @BobLd in #928
- 0๏ธโฃ Default page number to 0 in ExplicitDestination when the Dest has no page number and fix #736 by @BobLd in #930
- ๐ Move Paths, GetAnnotations() and GetOptionalContents() outside of ExperimentalAccess and mark Experimental class and reference as obsolete by @BobLd in #931
- โฌ๏ธ Upgrade tests project NuGet packages by @BobLd in #932
- โก๏ธ Optimize cross reference object offset validation by avoiding nested loop by @madelson in #935
- Revive trimming/AOT analysis by @madelson in #939
- โ Stop treating Warnings as Errors by @BobLd in #941
- ๐ Handle alternate Unicode name representation cXXX and fix #943 by @BobLd in #944
- ๐ Handle odd ligatures names and fix #945 by @BobLd in #946
- โก๏ธ Update additional glyph list to latest from PDFBox by @BobLd in #948
- ๐ New GetText() option: NegativeGapAsWhitespace by @Kizaemon in #952
- ๐ Fix for IndexOutOfRangeException exception by @GrabzIt in #955
- ๐ Fix "Nightly Release" pipeline following csproj changes by @BobLd in #957
- ๐ Do not throw exception when lenient parsing in ON in CrossReferenceParser and fix #959 by @BobLd in #961
- ๐ Improve UnwrapIndexedColorSpaceBytes by @BobLd in #962
- ๐ Fix out of range exception in AnnotationProvider by @BobLd in #963
- Return a copy of the ArrayPoolBufferWriter buffer in Ascii85, AsciiHex and RunLength filters and fix #964 by @BobLd in #965
- ๐ Make ColorSpaceDetails.BaseNumberOfColorComponents public to allow for external image factories by @BobLd in #966
- ๐ Improve GlyphList by @BobLd in #967
- โ Properly handle ZapfDingbats font for TrueTypeSimpleFont and add tests by @BobLd in #969
- ๐ Execute RemoveStridePadding in place when possible by @BobLd in #968
- โ Add HexToken case in OptionalContent parsing by @simonedd in #971
- โก๏ธ Update UglyToad.PdfPig.ConsoleRunner target framework to net8 by @BobLd in #972
- Do not throw error on Pop when stack size is 1 in lenient mode and fix #973 by @BobLd in #974
- ๐ Fix warnings about "type 'K' cannot be used as type parameter 'TKey' in the generic type or method 'Dictionary<TKey, TValue>'" by @BobLd in #976
- ๐จ Refactor XObjectFactory by @BobLd in #977
- โก๏ธ Update UnpackComponents() to account for 1bpc + DeviceGray (hack for Jbig2) by @BobLd in #978
- CcittFaxDecodeFilter: do not check for input length, invert bitmap with ref byte and fix #982 by @BobLd in #983
- โ Add JPX bits per component decoding by @BobLd in #986
- Issues/987 by @BobLd in #990
- ๐ Make DecodeParameterResolver class public by @BobLd in #993
- โก๏ธ Update Microsoft and SkiaSharp NuGet packages by @BobLd in #994
- โก๏ธ Update Microsoft NuGet packages for UglyToad.PdfPig.Package by @BobLd in #996
- Resolve image data (implementation from @kasperdaff) by @BobLd in #998
- Pass IFilterProvider to IFilter.Decode() and handle null in PdfExtensions.Resolve() by @BobLd in #999
- ๐ Improve GetExtendedGraphicsStateDictionary() and StackDictionary.TryGetValue() by @BobLd in #1004
- ๐ Better handle integer overflow in DocstrumBoundingBoxes by @BobLd in #1005
- ๐ version 0.1.10 by @BobLd in #1006
- Update run_integration_tests.yml by @BobLd in #1007
๐ New Contributors
- @madelson made their first contribution in #935
- @Kizaemon made their first contribution in #952
- @GrabzIt made their first contribution in #955
- @simonedd made their first contribution in #971
Full Changelog : v0.1.9...v0.1.10
-
v0.1.5 Changes
May 09, 2021๐ Some more bug-fixes:
- ๐ Fix for object streams in files which require brute force searching.
- ๐ Handle
NullTokenpresence when creating documents. - ๐ Support for PDFs where the filters are defined as indirect references (against specification).
- ๐ Support for CMYK when generating PNG images from
IPdfImage. - ๐ Support for indexed ColorSpaces where palette is stored in a string.
- ๐ Handle UTF16 strings in encrypted document dictionaries.
- ๐ Handle documents with a XMP metadata stream instead of an information dictionary.
- ๐ CCITTFaxDecode filter support.
- 0๏ธโฃ Tweaks to
DefaultWordExtractorto try and detect word gap size based on preceding text instead of a global gap threshold.
0๏ธโฃ Note that changes to
DefaultWordExtractormay change the output of calls toPage.GetWords()in this version.