pikepdf is a Python library for reading and writing PDF files.
pikepdf is based on QPDF, a powerful PDF manipulation and repair library.
Python + QPDF = "py" + "qpdf" = "pyqpdf", which looks like a dyslexia test. Say it out loud, and it sounds like "pikepdf".
# Elegant, Pythonic API with pikepdf.open('input.pdf') as pdf: num_pages = len(pdf.pages) del pdf.pages[-1] pdf.save('output.pdf')
pip install pikepdf
For users who want to build from source, see installation.
pikepdf is documented and actively maintained. Commercial support is available.
This library is similar to PyPDF2 and pdfrw - it provides low level access to PDF features and allows editing and content transformation of existing PDFs. Some knowledge of the PDF specification may be helpful. It does not have the capability to render a PDF to image.
|Editing, manipulation and transformation of existing PDFs||✔||✔||✔|
|Based on an existing, mature PDF library||QPDF||✘||✘|
|Implementation||C++ and Python||Python||Python|
|PDF versions supported||1.1 to 1.7||1.3?||1.7|
|Python versions supported||3.6-3.9||2.6-3.6||2.6-3.6|
|Save and load password protected (encrypted) PDFs||✔ (except public key)||✘ (Only obsolete RC4)||✘ (not at all)|
|Save and load PDF compressed object streams (PDF 1.5)||✔||✘||✘|
|Creates linearized ("fast web view") PDFs||✔||✘||✘|
|Actively maintained||![pikepdf commit activity][pikepdf-commits]||![PyPDF2 commit activity][pypdf2-commits]||![pdfrw commit activity][pdfrw-commits]|
|Test suite coverage||~89%||very low||unknown|
|Creates PDFs that pass PDF validation tests||✔||✘||?|
|Modifies PDF/A without breaking PDF/A compliance||✔||✘||?|
|Automatically repairs PDFs with internal errors||✔||✘||✘|
|PDF XMP metadata editing||✔||read-only||✘|
|Integrates with Jupyter and IPython notebooks for rapid development||✔||✘||✘|
I decided to try writing a quick Python program with pikepdf to automate [something] and it "just worked". –Jay Berkenbilt, creator of QPDF
"Thanks for creating a great pdf library, I tested out several and this is the one that was best able to work with whatever I threw at it." –@cfcurtis