• Fixed gcc linker error with linking to a source-compiled version of qpdf. Thanks @jerkenbilt.

  • Fixed dead/obsolete link to old QPDF manual. Thanks @m-holger.

  • Rebuild binary wheels against qpdf 10.5.0. Note 10.6.0 has been released but requires further changes so does not work yet.

  • Removed some workarounds to support now-unsupported versions of pybind11.

  • Adjusted hypothesis test settings so it does not randomly fail on PyPy.

  • Mention vector vs raster images in documentation.

  • JBIG2 decoding is now more tightly integrated. In particular, we can now decode more types of JBIG2 image and they can be decoded using either the object or image interface.

  • Switch to tomli for TOML parsing.

  • Refactor image tests to use hypothesis more effectively and use more random issues, fixing many errors along the way.


  • Fixed two instances of a Python object being copied without the GIL held. May have caused some instability. Thanks @rwgk.


  • Further improvements to handling of 2- and 4-bit per component images. Major refactoring of relevant code and improved testing.


  • Mark pybind11 2.9 as supported. Thanks @QuLogic.


  • Improved support for images with bits per component set to values between 2 and 7 inclusive.

  • Additional types of runtime errors produced by libqpdf are now resolved to DataDecodingError for improved error message clarity.

  • Improved typing and documentation for several modules.

  • Replaced all internal uses of deprecated standard library module distutils with the third party packaging library. This was all for version number checking.

  • Maintainers: python3-packaging is now required for installation.


  • Fixed incorrect default rectangle handling in Page.add_overlay and Page.add_underlay. Thanks @sjahu. #277.

  • Fixed Page.add_overlay not scaling to larger target sizes automatically. Thanks @bordaigorl. #276.

  • pikepdf._core.ObjectHelper is now registered as a base class from which other helper classes are derived such as pikepdf.Page.

  • Prevented implicit conversion of ObjectHelper to Object through their inclusion as for example, parameters to a pikepdf.Array. This functionality was never intended, and was a side effect of certain ObjectHelper subclasses defining an iterable interface that made their conversion possible. #282


  • Declared support for pybind11 2.8.x.

  • Wheels are now built against libqpdf 10.4.0.

  • Wheels are now built for macOS Apple Silicon and Python 3.10.


  • Fixed equality and copy operators for pikepdf.Page. #271

  • Fixed equality test on pikepdf.Stream objects - objects that are not identical but have equal data now compare as equal.

  • Deprecated the use of copy_foreign for copying pikepdf.Page.


  • Fixed documentation build reproducibility. (Thanks to Chris Lamb and Sean Whitton.)

  • Fixed issue where file attachments not located in the current working directory would be created with a directory name.

  • Removed some references to Python 3.6.

  • Added some fixes to typing hints from @cherryblossom000.


Breaking changes

  • Python 3.10 is supported.

  • Dropped support for Python 3.6, since it is reaching end of life soon. We will backport critical fixes to pikepdf 3.x until Python 3.6 reaches end of life in December 2021.

  • We now require C++17 and generate wheels for manylinux2014 Linux targets. We had to drop support for manylinux2010, our previous target, since some of our dependencies like Pillow are no longer supporting manylinux2010.