Skip to main content

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

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:

  1. $RUSTPDF_LIB (explicit path);
  2. bundled next to rustpdf/__init__.py (installed wheel);
  3. the build tree (target/debug then target/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)

Table of built distributions (wheels) for rustpdf 0.5.0
File
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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

0.5.0 This release

4 release files

0.4.8

4 release files

0.4.6

4 release files

0.4.5

4 release files

0.4.4

4 release files

0.4.3

4 release files

0.4.2

4 release files

0.4.1

4 release files

0.4.0

4 release files

0.2.0

4 release files

0.1.0

4 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page