v9.5.1

  • Bump version to address sigstore build issues.

  • Pillow dropped PyPy 3.9 so we’re dropping it too.

v9.5.0

  • Created setter for Outline management to make manipulating outlines easier. Thanks @Zhongheng-Cheng for this contribution. #636

  • pikepdf now sets XMP properties as subelements instead of inline properties, in line with the XMP specification. Thanks @federicobond. #628

  • pikepdf an issue with converting certain images to PIL. Thanks @DaveDeCaprio. #632

  • Added a new pikepdf.exceptions module which organizes all exceptions more conveniently.

  • pikepdf now tries harder to extract corrupt images in a PDF when they are found.

  • Fixed an issue where an exception handler referred to an object not in scope, causing another exception. Thanks @dhazelett. #627

  • Dropped a comment about an unsupported dependency.

v9.4.2

  • Internal type assertion error messages from qpdf that previously triggered a RuntimeError will now raise a PdfError. Generally these errors only occur in corrupted files.

  • When we are updating XMP in the processing of saving, errors from updating XML are wrapped differently to clarify the context in which the error occurs.

v9.4.1

  • Fixed a process abort in JBIG2 handling related to cleanup of Python objects owned by C++ code.

  • Fixed inconsistent behavior when setting metadata records to an empty value. #622

v9.4.0

  • Added missing Python 3.13 wheels for a few platforms that were missing them, mainly ARM Linux, musllinux/Alpine, and Windows.

  • Since Homebrew has ended support for macOS 12, macOS 13 is now the minimum requirement for Intel macOS.

  • Suppressed some spurious warnings during build tests.

v9.3.0

  • Integrated OSS Fuzz.

  • Prevented generation of PDF date strings with invalid trailing apostrophes, while still accepting them.

  • Improved error message on parsing invalid date strings.

  • Dropped support for Python 3.8 (end of life October 2024).

v9.2.1

  • Fixed some inconsistencies with the pikepdf.Rectangle class. #605

  • Python 3.13 with free-threading added to test matrix.

  • Removed wheel package as build requirement since modern packing no longer needs it.

v9.2.0

  • Updated C++/Python exception translation to new pybind11 2.12.0+ protocol, fixing possible undefined behavior in multithreaded applications.

  • pybind11 2.12.0 is now required.

  • qpdf 11.9.1 is now used to build wheels.

  • Modernized copyright information to REUSE.toml specification.

  • Added a new test file for a rare case, CCITT with EndOfLine=True. Thanks @ekordas. #602, #601

v9.1.2

  • Fixed handling of CalRGB and CalGray images with palettes.

  • Fixed a test suite failure when numpy 2.1 is installed. #603

  • Prevented use of setuptools 72+ since it seems to introduce build errors.

  • Added a missing #include header. #600

v9.1.1

  • Fixed an issue where small floating point values would be recorded in scientific notation, contrary to the PDF specification. #598

  • Fixed some false positive warnings on Windows C++ compilers.

  • Improved support for Python 3.13 pre-release.

v9.1.0

  • Fixed a potential resource leak if we opened a file to read it as a PDF but it was not a valid PDF.

  • When overwriting an existing PDF with Pdf.save(), pikepdf now attempts to retain the original file permissions and ownership.

  • Fixed missing return type for PageList.Extend. #592

  • Fixed exception if jbig2dec --version exists but valids to return a version number.

  • Fixed tests on Python 3.13 pre-release. Thanks @QuLogic.

  • Changed all references of “QPDF” to “qpdf”, its new spelling. Thanks @m-holger.

v9.0.0

  • Removed deprecated pikepdf.PdfMatrix. Use pikepdf.Matrix instead.

  • Removed deprecated pikepdf._qpdf submodule.

  • Pdf.pages no longer coerces PDF dictionaries to page objects. You must explicitly insert/add pikepdf.Page objects.

  • pikepdf.Object.parse() no longer accepts string input; only bytes are allowed.

  • macOS 12 is our minimum supported version for x86_64, and macos 14 is our minimum supported version for ARM64/Apple Silicon. v8 accidentally ended support for older versions at some point - this change is formalizing that. Efforts were made to continue support for older verions, but it is not sustainable.

  • We now generate binary wheels for musllinux-aarch64 (Alpine ARM64).