rustpdf (Python binding)
Idiomatic Python over the rust-pdf C ABI (libpdf_ffi). It mirrors the full
product surface: vector graphics, embedded/subsetted fonts and text, wrapping
paragraphs, images, PDF/A (levels 1b–3a), tagged/accessible output,
embedded file attachments, AcroForm fields, manipulation
(merge/split/rotate/optimize/incremental update), text extraction,
page rendering (page to PNG image), encryption (RC4 / AES-128 /
AES-256) and digital signatures (PKCS#7 / PAdES).
Two layers, per the project's porting strategy:
- a raw
ctypessurface bound 1:1 againstinclude/pdf.h; Document/EditableDocwrappers that hide opaque handles, raisePdfErroron non-zero status codes, and act as context managers.
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.
Basic PDF generation is free; corporate features (PDF/A, accessibility,
encryption, signatures, page rendering) unlock with a license token via the
RUSTPDF_LICENSE env var. Page rendering is a Pro feature. 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 (Pro feature).
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.4.6
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.4.6-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| rustpdf-0.4.6-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| rustpdf-0.4.6-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| rustpdf-0.4.6-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.4.6-py3-none-win_amd64.whl
| Download URL | rustpdf-0.4.6-py3-none-win_amd64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
368c16db0c806c694f31e95f404d8e57f6fa80436a3f8bdb299e16db7aeea811
|
|
BLAKE2b-256 checksum How to use checksums |
ccbccc94a3e1c85fa45b5f6d5f6f589d15f768b5b265495db5724fd897662e20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 30, 2026.
Transparency logRelease files / rustpdf-0.4.6-py3-none-manylinux_2_28_x86_64.whl
| Download URL | rustpdf-0.4.6-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 |
d4d589c337d7c9355a7ef3f5afb5898efd7ff4538d7b493adac46e3f61a6cd0f
|
|
BLAKE2b-256 checksum How to use checksums |
8ac2350cda508811016920fd571beb96b6154bf40ebc1be48f60d2dc2237b748
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 30, 2026.
Transparency logRelease files / rustpdf-0.4.6-py3-none-manylinux_2_28_aarch64.whl
| Download URL | rustpdf-0.4.6-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 |
c00f90b04ec340facc5ae7081aafa37c2da3366284589478fe7e7d6f872501f6
|
|
BLAKE2b-256 checksum How to use checksums |
2838b4b09b3b032774d3be7dec979c736445b8cc2594d9a87dffc354808f9adb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 30, 2026.
Transparency logRelease files / rustpdf-0.4.6-py3-none-macosx_11_0_arm64.whl
| Download URL | rustpdf-0.4.6-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 |
a5f58dd9a277443dc0a095e8a005e699bff281534e19ce05bd8f62c2098c03eb
|
|
BLAKE2b-256 checksum How to use checksums |
0dc4330ddb6286302f57621cd3b3092b71d2143740a7aa8ae13d06189e65c3ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 30, 2026.
Transparency log