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)
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.2
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.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| rustpdf-0.4.2-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| rustpdf-0.4.2-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| rustpdf-0.4.2-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 10.6 MB
Release files / rustpdf-0.4.2-py3-none-win_amd64.whl
| Download URL | rustpdf-0.4.2-py3-none-win_amd64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
abde2989c58917bc3f6dca94888ac24907a2516a54f258ba1f179fe4dfaafa0c
|
|
BLAKE2b-256 checksum How to use checksums |
fd554a5f600e5201e689bfb70c7e4f17e23103e253c6117820728ee99e79d031
|
| 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 29, 2026.
Transparency logRelease files / rustpdf-0.4.2-py3-none-manylinux_2_28_x86_64.whl
| Download URL | rustpdf-0.4.2-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
673ed4bf5bf5a7ed6dbcad98027a87a6038ebd93c1d020ef225b171fa8e4e52c
|
|
BLAKE2b-256 checksum How to use checksums |
b8d9c9fd6461941810e7ef3c36f796796e6fc548d2e65d43b251d3569aa45bc3
|
| 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 29, 2026.
Transparency logRelease files / rustpdf-0.4.2-py3-none-manylinux_2_28_aarch64.whl
| Download URL | rustpdf-0.4.2-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
e4eaffaaceac8bd73440be6c3c10d7261121aeaa202575e3eb56a81a130d71b5
|
|
BLAKE2b-256 checksum How to use checksums |
7acb53eea4f9f72b623e0a0764d4484a5d3824c761a0d3485798bc267df96163
|
| 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 29, 2026.
Transparency logRelease files / rustpdf-0.4.2-py3-none-macosx_11_0_arm64.whl
| Download URL | rustpdf-0.4.2-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
dec87a8f678f05b9c1151e958c4ba7bab5d3391af6ae78f7ee5349aa267832c0
|
|
BLAKE2b-256 checksum How to use checksums |
b0f34b1b112d873c0299366dd96c25ba41c1904f166a40f493afe89fad4b012e
|
| 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 29, 2026.
Transparency log