RustPdf for Python
Generate, edit, sign and process PDFs from Python: vector graphics, embedded fonts and Unicode text, wrapping paragraphs, images, PDF/A (1b-4f), tagged/accessible output, attachments, AcroForm fields, page manipulation (merge/split/stamp), watermarks, true redaction, AES-256 encryption, digital signatures (PAdES) with HSM/deferred signing, timestamps/LTV, text extraction and search, and page rendering to PNG. Pure Python package, no compiler needed.
Documentation
- Full API reference: https://rustpdf.dev/docs/python
- Interactive positioning guide (coordinates, anchors, rotation): https://rustpdf.dev/positioning
- All product guides (PDF/A, signatures, encryption, redaction, rendering): https://rustpdf.dev/docs/
The public API is Document (create PDFs) and EditableDoc (load and edit
existing PDFs), both usable as context managers; errors raise PdfError.
Install
pip install rustpdf
Platform wheels (macOS arm64, manylinux_2_28 x86_64/aarch64, Windows x64)
bundle the native libpdf_ffi library — no Rust toolchain needed to install.
Every feature is free — PDF/A, accessibility/tagging, encryption, digital
signatures/PAdES, redaction and page rendering are all included. See
https://rustpdf.dev.
Loading the native library
The wrapper finds libpdf_ffi in this order:
$RUSTPDF_LIB(explicit path);- bundled next to
rustpdf/__init__.py(installed wheel); - the build tree (
target/debugthentarget/release).
Build it from the repo root with cargo build -p pdf-ffi.
Quick start
import rustpdf
# Author an accessible PDF/A-2a document.
with rustpdf.Document() as doc:
doc.pdfa(rustpdf.PdfaLevel.A2A).set_info(title="Report", author="me")
f = doc.add_font_file("assets/fonts/Roboto-Regular.ttf")
doc.add_page()
doc.show_text(f, 20, 72, 760, "Title", heading_level=1)
doc.paragraph(f, 12, 72, 720, 450, "A wrapping, justified body…",
rustpdf.Align.JUSTIFY)
data = doc.to_bytes()
print(rustpdf.extract_text(data))
# Render a page to a PNG image.
print(f"{rustpdf.page_count(data)} page(s)")
png = rustpdf.render_page_to_png(data, page=0, dpi=150.0)
open("page1.png", "wb").write(png)
# Manipulate an existing file (non-destructive incremental update).
with rustpdf.EditableDoc.load(data) as ed:
ed.set_info("Subject", "Edited")
updated = ed.to_bytes_incremental(data)
# Encrypt (AES-256).
with rustpdf.EditableDoc.load(data) as ed:
ed.encrypt(owner="owner", method=rustpdf.Encryption.AES256)
ed.save("secured.pdf")
# Sign (PKCS#7 detached / PAdES).
signed = rustpdf.sign(data, key_der, cert_der, reason="Approved", pades=True)
# Deferred / HSM signing: the private key never enters the library.
# The library builds the CMS signed attributes and asks your signer for the
# raw RSA signature. `sign_hash` can call any HSM, cloud KMS, smartcard or
# PKI token (national PKI / eIDAS / AATL).
def sign_hash(to_be_signed: bytes) -> bytes:
return my_hsm.sign(to_be_signed) # raw RSA PKCS#1 v1.5 over SHA-256
signed = rustpdf.sign_with(data, cert_der, sign_hash, chain=[intermediate_der])
Testing
cargo build -p pdf-ffi
python3 bindings/python/test_binding.py # dogfood + full-surface exercise
# or: make python-test
Metadata
Release files for rustpdf 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| rustpdf-0.5.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| rustpdf-0.5.0-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| rustpdf-0.5.0-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| rustpdf-0.5.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 11.0 MB
Release files / rustpdf-0.5.0-py3-none-win_amd64.whl
| Download URL | rustpdf-0.5.0-py3-none-win_amd64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
5d056be01acb7c4127ff173b7425f89ac9db173c00b7b5c74db721bf2194534e
|
|
BLAKE2b-256 checksum How to use checksums |
c3bb72307b81bc6a0cb7b595a2f30f8d4d28247818310f8463824e8c2ebb9b20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / rustpdf-0.5.0-py3-none-manylinux_2_28_x86_64.whl
| Download URL | rustpdf-0.5.0-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
ae55e07639d295915289c52f6600e1d5bef3ce24158e92bf2a14aa54f41eb9b3
|
|
BLAKE2b-256 checksum How to use checksums |
dba554567004537320f2462c39c1d700113914ea36767494ef49b769bb9b2471
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / rustpdf-0.5.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | rustpdf-0.5.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
adc2a0a5aecc532e424ccc673dea565dd128ab6af313ddeed236768fd588b8dc
|
|
BLAKE2b-256 checksum How to use checksums |
a397c5a7629d39869fd50149ac88e39eb6ba7acc52b09648823dacb5a0f92da7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / rustpdf-0.5.0-py3-none-macosx_11_0_arm64.whl
| Download URL | rustpdf-0.5.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d55a79dc4b487298f0546210486e8666223fef2a8026c38bfa924386eef531fe
|
|
BLAKE2b-256 checksum How to use checksums |
847346cf2bb068e06cfa8d6d2dabf16b9ee66f98708fe9a07460f0343787c12e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log