2.9.1 (May 2026)

o Support reading of file at given revision
o Support writing with incremental update
o Read (extended) and (new) write OCGs
o Flatness graphics parameter now (correctly) real
o Expand definition of Standard Font for malformed files
o Read widths for vertical mode fonts properly
o Allow supression of identical adjacent logs in Pdfe

2.9 (March 2026)

o Add cycle detection in find_pages_quick for malformed files
o CCITT Group 3 encoder (native) and Group 4 encoder (via imagemagick)
o New Pdf.remove_chain
o Check object requires renumbering before doing so (speed)
o Allow extraction of encryption when lack of password prevents reading
o Repair name/number trees with duplicate keys (better)
o Fix bad name detection and improve error message
o Fix regression where bookmark strings were mangled
o Fix (partially) efficiency of page renumbering on very large files
o Disambiguate annotation object numbers where a page is copied
o Allow optional use of jbig2dec to decode JBIG2 streams
o Failure to decrypt an object due to malformity no longer fatal

2.8.1 (April 2025)

o Pdf.lookup_chain can look within arrays
o Pdf.replace_chain can replace within arrays
o Repair name/number trees with duplicate keys
o Pdfpage.pagenumber_of_target works on GoTo actions
o Allow optional shallow reading of destinations
o Ensure that shallow destinations are transformed
o Empty name now a warning not an error (written as /)

2.8 (December 2024)

o Read and write bookmark colour and flags
o Fixed a bug in Pdfst.renumber_parent_trees
o Only call renumber_parent_trees when processing struct trees

2.7.2 (October 2024)

o Process destination name tree in Pdfpage.pdf_of_pages
o Options to change the whitespace between operators
o Allow writing of comments in streams
o Allow addition of top-level Document in struct tree when merging
o New lookup_chain / replace_chain functions in Pdf
o Revert 2.7 "Remember and reapply inline image decode parameters"

2.7.1 (July 2024)

o Fix sign extension in js_of_ocaml
o Pdfannot expanded to more annotation types
o Extract code to Pdftree module (API subject to change)
o Structure tree optionally trimmed on Pdf.pdf_of_pages
o Structure tree optionally trimmed & merged in Pdfmerge

2.7 (February 2024)

o Add opam file in-source
o Cope with more malformed bookmarks
o Remember and reapply inline image decode parameters
o Pdfimage extracts and stores JBIG2Globals
o Option to compress a stream only if it is made smaller
o Encode predictor for PNG Sub (bpc = 8, 3 components)
o Fix for LZWDecode streams which overfill the table
o New endpage_fast
o Remove some very old unused Pdfimage code
o Reconstruct tree in Pdfpage.pdf_of_pages for better bookmarks
o Cope with predictor dictionary not being end of inline image dictionary

2.6 (July 2023)

Merging improvements:
o Keep major PDF version number
o Merge /StructTreeRoot entries (Structure hierarchy / Tagged PDF)
o Disambiguate destination name trees when merging
o Preserve named destinations in bookmarks when merging
o Remove /OpenAction on merge
o Preserve first metadata seen on merge

Other:
o Cope with files with no /MediaBox at all
o Write IDs as Hexadecimal strings
o Replace Stream/Genlex and other deprecations for OCaml 5
o Allows malformed numbers --1, --2.5 etc.
o Support for alternative stubs for js_of_ocaml
o Push mk_id down to pdf_to_output so it works when writing to
  non-file destinations
o Fix Pdf.getnum and Pdf.parse_rectangle to cope with indirects
o Ignore data check errors in flate decoding
o Now reads many more files from Stressful PDF Corpus
o Revert 'build byte code top level camlpdf.top by default'
o Pdfpage.add_prefix now detects and fixes non-ISO PDFs
o Loosen EI check on inline image lexing
o Compress inline images upon writing if uncompressed
o Retired old unused modules to old/
o Cope with /Crypt identity filters
o Ability to redirect error output
o Harden ASCII85Decode against whitespace

2.5 (January 2022)

o Build byte code top level camlpdf.top by default
o Replace deprecated C interface functions for OCaml 5.0
o Document most undocumented functions
o Pdfpage.change_pages now preserves object streams
o Width calculation in Pdfstandard14 now more efficient
o Charcode and text extractors have font not fontdict counterparts
o Pdftext.charcode_extractor_of_font copes with more encodings
o Add Pdftext.simplify_utf16be
o Merge now merges AcroForms
o Fix Pdfio.setinit and friends to deal with 0-length data
o Harden Pdfmarks against erroneous empty /Title in doc outline
o AFM and glyphlists loaded from compressed sources
o Environment variable CAMLPDF_REPRODUCIBLE_IDS for testing
o Effectively make stderr unbuffered for all output
o A dictionary entry with null for its value now does not exist
o A missing mediabox now not fatal - we use the most-recently-seen

2.4 (June 2021)

o Prefixed all C stubs to avoid clashes with zlib / cryptokit
o Fix for zero-sized Pdfio.input_outputs
o Bad interaction between deferred decryption and object streams fixed
o Optional content groups merged when merging
o Pdfpage.change_pages can now alter bookmark destinations for transformed pages
o Preserves zero bytes in malformed names
o Merged files get fresh /ID
o Pdfpagelabels.write now removes labels when given an empty list

2.3 (patchlevel 2, 2020)

o Bad interaction between deferred decryption and object streams worked around

2.3 (patchlevel 1, December 2019)

o Updated Makefile to build on bytecode-only architectures
(thanks Ralf Treinen)

2.3 (October 2019)

o Malformed file reading for files with content before the header now works
o Switches to disable malformed file reading or always read as if malformed
o Fix to preserve integers > 2^30 or < -2^30 on 32 bit systems 
o Allow [/DCT] as well as /DCT in inline image filter specifications
o Improvements to text width calculation (thanks Alain Frisch)

2.2 (patchlevel 1, September 2017)

o Code for adding annotations (thanks @waclena)
o Indirect encryption dictionaries
o Workaround for Adobe "Error 21" on re-saving encrypted files
o Fix reading of null objects in streams

2.2 (2017)

o Keeps was_linearized flag with every loaded PDF

2.1 (November 2014)

o Excised linearization. We recommend qpdflib / qpdf for this task now.
o Encryption now performed by fast C routines, replacing the OCaml ones
o Faster parsing of delayed object streams on large files
o New implementation of Pdf.page_reference_numbers. More robust
o Faster parsing by using better primitive operations for I/O
o Tighter spacing of output in Pdfwrite leading to smaller files
o Fixed pdf_of_pages not to produce duplicate page objects when multiple parts
of the output pdf come from the same input pdf
o Pdfpagelabels bug fixes, especially to alphabetic labels
o Read StemV etc. values from the AFM header directly
o Object streams may be written uncompressed for manual inspection
o Recrypting overhauled. Now a first class citizen.

1.7 (30th August 2013)

o Support for writing with object streams
o AES256ISO encryption support
o More compact writing of files
o Support for reading many malformed files
o Now under a standard LGPL license
o Has no dependencies
o First import into git for use with GitHub for open development
o Support for ocamlfind
