| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-08-17 | 5.4 kB | |
| v10.12.0 source code.tar.gz | 2026-08-17 | 5.0 MB | |
| v10.12.0 source code.zip | 2026-08-17 | 5.1 MB | |
| Totals: 3 Items | 10.1 MB | 0 | |
Packaging and licensing
- Binary wheels now redistribute the licenses of the compiled third-party
libraries they bundle, along with an attribution manifest mapping each
component to its license. {issue}
736 - The new
third-party-licenses/directory documents every vendored binary: qpdf and libjpeg-turbo on all platforms; OpenSSL and zlib (both statically linked intoqpdf30.dll) plus the Microsoft Visual C++ runtime on Windows; the GnuTLS/Nettle/GMP stack on macOS; and the GCC runtime libraries on musllinux. It also records what is deliberately not bundled -- notably that Linux wheels use qpdf's built-in crypto and link no TLS library at all. - These files are declared via PEP 639
project.license-files, so they ship inpikepdf-<version>.dist-info/licenses/and are enumerated in the wheel'sLicense-Filemetadata.License-ExpressionremainsMPL-2.0: pikepdf's own license is unchanged, and the bundled libraries are separate works redistributed in unmodified binary form. - This replaces
licenses-for-wheels.txt, which has been removed. It had grown stale -- it never mentioned OpenSSL, zlib, or the GnuTLS stack -- and it was reaching only Windows wheels, because the build backend's default license glob happened to match its name on case-insensitive filesystems and nowhere else. - Source distributions no longer contain qpdf's source tree. CI unpacks qpdf
into
./qpdfto build libqpdf, and that build prerequisite was being swept into the sdist, adding roughly 2900 Apache-2.0 files to a distribution that declares itself MPL-2.0. sdists now contain only pikepdf's own code. - macOS wheels now use qpdf's native crypto provider instead of GnuTLS, and all POSIX builds select it explicitly rather than relying on qpdf's implicit fallback. macOS wheels lose nine bundled libraries as a result -- GnuTLS, Nettle, Hogweed, GMP, libidn2, libunistring, Libtasn1, p11-kit and libintl -- along with roughly 10 MB and the LGPL obligations that came with them.
macOS moved to GnuTLS in v8.11.1 to fix legacy encrypted files failing to open
({issue}520), because Homebrew's OpenSSL had retired the legacy provider
that supplies the RC4 and MD5 those files need. The Linux builds were assumed
to be doing the same thing, but were not: their images carry no GnuTLS or
OpenSSL headers, so they had silently been using native crypto all along, and
have been opening legacy encrypted files without trouble ever since. Native
crypto implements MD5, RC4, SHA2 and AES itself, so no upstream deprecation
policy can withdraw the weak algorithms older PDFs require. There is no
change to which files pikepdf can open.
- Documentation updates with additional guidance about crypto provider selection and the realities of PDF encryption security.
Behaviour change
- {attr}
pikepdf.PdfInlineImage.iccnow returnsNoneinstead of raising {exc}~pikepdf.exceptions.InvalidPdfImageError. An inline image's colour space cannot be/ICCBased, so "no ICC profile" is the correct answer rather than an error -- and raising made {attr}pikepdf.PdfImageBase.paletteunusable on indexed inline images, which consults it.
Fixes
- Fixed inline image name abbreviation handling, which was incomplete in both
directions. {issue}
206 - Abbreviations nested inside arrays are now expanded when an inline image is
parsed, so
/F [/AHx /Fl]reports['/ASCIIHexDecode', '/FlateDecode']from {attr}pikepdf.PdfInlineImage.filters, and an/Indexedcolour space written as/CS [/I /RGB 1 <...>]is now recognized as indexed instead of raisingNotImplementedError. Correspondingly, {meth}pikepdf.PdfInlineImage.unparsenow abbreviates names inside arrays, not only at the top level. Contents of/DecodeParmsdictionaries are left alone, since filter parameter names have no abbreviations. - Abbreviations are now resolved by position, because the same abbreviation
can mean different things as a key and as a value:
/Iis/Interpolateas a key but/Indexedas a value (ISO 32000-2 Tables 91 and 92). Previously/Iwas always expanded to/Indexed, so/I truebecame/Indexed true. - Added the missing abbreviations
/Fl(/FlateDecode),/D(/Decode) and/L(/Length); none of the three were expanded before. - A JBIG2 decode failure (jbig2dec present but the payload is invalid) now
raises {exc}
~pikepdf.exceptions.DataDecodingErrorwith the decoder's error message, instead of a bareRuntimeError("qpdf will consume this exception")plus an unraisable traceback on stderr. (#735) - Exceptions other than {exc}
~pikepdf.exceptions.DataDecodingErrorraised by a JBIG2 decoder now keep their own type. Previously a failure unrelated to the image data -- a {exc}~pikepdf.exceptions.DependencyErrorfrom a custom decoder, orKeyboardInterrupt-- was reported as if the JBIG2 data were corrupt. Implementations of {class}pikepdf.jbig2.JBIG2DecoderInterface.decode_jbig2should raiseDataDecodingErrorto report undecodable data. - When the JBIG2 image comes from a file on disk, qpdf traps the decoder's
exception and records it as a warning, so the decoder's message is available
from {meth}
pikepdf.Pdf.get_warningsrather than in the exception.