Skip to main content

Python bindings for fulgur — offline HTML/CSS to PDF conversion

Project description

pyfulgur

Python bindings for fulgur — an offline, deterministic HTML/CSS to PDF conversion library written in Rust.

Status

Alpha (v0.0.2). Core Engine / AssetBundle / PageSize / Margin / render_html API is available. Batch rendering, sandboxing, and template engine wiring are planned for later releases.

Install

Note: v0.0.2 is an early alpha. Pre-built wheels are not yet published to PyPI; install from source for now.

# From a checkout of the fulgur repository
pip install maturin
maturin develop --release -m crates/pyfulgur/Cargo.toml

Pre-built wheels for manylinux / macOS / Windows will be published in a later release.

Quick start

from pyfulgur import AssetBundle, Engine, PageSize

bundle = AssetBundle()
bundle.add_css("body { font-family: sans-serif; }")

engine = Engine(page_size=PageSize.A4, assets=bundle)
pdf_bytes = engine.render_html("<h1>Hello, world!</h1>")

with open("output.pdf", "wb") as f:
    f.write(pdf_bytes)

Builder style:

engine = (
    Engine.builder()
    .page_size(PageSize.A4)
    .landscape(False)
    .title("My doc")
    .assets(bundle)
    .build()
)
engine.render_html_to_file("<h1>Hi</h1>", "out.pdf")

API surface

  • Engine(**kwargs) / Engine.builder()EngineBuilder
  • Engine.render_html(html: str) -> bytes — render to PDF bytes (releases the GIL)
  • Engine.render_html_to_file(html: str, path: str | os.PathLike) -> None — render to a file
  • AssetBundle: add_css, add_css_file, add_font_file, add_image, add_image_file
  • PageSize: A4, LETTER, A3, custom(w_mm, h_mm), .landscape()
  • Margin: Margin(top, right, bottom, left), Margin.uniform(pt), Margin.symmetric(v, h), Margin.uniform_mm(mm)
  • Exceptions: FileNotFoundError, ValueError, pyfulgur.RenderError

Type stubs

pyfulgur ships PEP 561 type stubs (py.typed + __init__.pyi) so mypy, pyright, and IDEs can type-check call sites against the native API. Docstrings live in the Rust source and are exposed via __doc__ for help(), Jupyter ?, and griffe / mkdocstrings inspection.

Known limitation: blitz parse-error noise on stdout

The underlying blitz-dom parser writes non-fatal html5ever parse errors directly to the process's stdout via println!. These fire for browser-tolerated but technically invalid HTML — documents without a <!DOCTYPE>, missing <html>/<body> wrappers, or structural quirks that browsers silently auto-correct — and show up as ERROR: ... noise in Jupyter notebooks or any environment that captures stdout. The PDF bytes returned by render_html are not affected; only the caller's terminal is polluted.

pyfulgur intentionally does not redirect fd 1 from inside the binding: process-wide fd manipulation in a multi-threaded library context races with concurrent render_html calls from other threads (mixed suppress / non-suppress callers would silently lose stdout during a suppressed window). Correctness and parallelism take priority over cosmetic stdout cleanliness.

If you need clean stdout:

  • Redirect at the caller side with a Python contextlib.redirect_stdout for Python-level writes, or os.dup2 for fd-level writes. This keeps the fd manipulation scoped to your own call site where you can guarantee single-threaded use.
  • Run renders in a subprocess via multiprocessing (each worker has its own fd 1).
  • Use the fulgur CLI (which handles stdout isolation internally) invoked via subprocess.run when cold-start cost is acceptable.

A wrapper-style Python package that shells out to the fulgur CLI (clean stdout, parallel via process isolation, no native build required) is on the roadmap as a complement to this native binding.

Links

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyfulgur-0.30.0.tar.gz (932.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyfulgur-0.30.0-cp39-abi3-win_amd64.whl (7.3 MB view details)

Uploaded CPython 3.9+Windows x86-64

pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_aarch64.whl (7.3 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.6 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.1 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

pyfulgur-0.30.0-cp39-abi3-macosx_11_0_arm64.whl (6.8 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

pyfulgur-0.30.0-cp39-abi3-macosx_10_12_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file pyfulgur-0.30.0.tar.gz.

File metadata

  • Download URL: pyfulgur-0.30.0.tar.gz
  • Upload date:
  • Size: 932.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pyfulgur-0.30.0.tar.gz
Algorithm Hash digest
SHA256 4ba260a88e8ab8c94ed2eee1281570ea9cf836c8de503d7c72f47f989f977aa1
MD5 338df6278ee3f73e3ef2499449302cd4
BLAKE2b-256 080f0469e8abd6fc8573c32e29eb41d2ee7c00aee7479e28d7b2f473d6873290

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0.tar.gz:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: pyfulgur-0.30.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 7.3 MB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 8b74b6d7a6fc2ef8e61bf866fc3a3b559c7227afbb4f5d47001c0a7d6166f7b8
MD5 8f637347e98774cae3e731ad1bb103d0
BLAKE2b-256 c6a27ff740ba56fd76ad8147e611c04e1b41dafdce388205f6530687789b349d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-win_amd64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2236dc821027ac9e18bd6a723a9d0e8264de32e0262d997c860f78d6fb698da3
MD5 d357461917aaaabc35b7065fbbb9dd5d
BLAKE2b-256 0ca0f9f162359bacc2e1e2b51f15543f95120a0ff93891dd39edcad2c1371e78

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_x86_64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2d803a26f86080b05edf6aa329ba5f7f7d1663c54f4a1585b66a7ce009830f9f
MD5 186a975b9b44a8d5188c00f2f475da66
BLAKE2b-256 a1aa0d3ee4c6f24c6bbbc0016cbb8f62d36b04e5929b29a4e53d284e39770b4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-musllinux_1_2_aarch64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d7414175ba61de1ea85db8e433e6e766c0706f5c81fd0732c361fa64153bd8b
MD5 2d5250c0136b55b2582cb8ede493306c
BLAKE2b-256 09749357eff40c22e05f5ad3ff4d06fb6ec0fd94e90dd2346a6f7338cf5bda49

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d8405c6a6cf77818cc5cff258b5e406ed3d341eab4a05954e29d50f3cb35f57d
MD5 3807e1e16aecc9051d76dc1589779b0c
BLAKE2b-256 4094e6e555fc9a1b49a3f7b0c81ddfe3f41a7895b75e3d4b72dc11fd402e9a2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7fa1b408f5039fcc3f2889e5cf74304cdef056c9488531a13749d584c4f2d5b
MD5 cb7da011c474a076d03338f5193e2ab8
BLAKE2b-256 799331a0d3379eda3a1d056d983e099efc3313623c1e315383b118ec6268029c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyfulgur-0.30.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.30.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1968cc4dacdb266255befe3eeba7e8e685a4fdf81ecd7b7c02e29baf121d0ed3
MD5 673103dabe60984dfde7f6eeab321324
BLAKE2b-256 c781dd60e857aae3df85a421efa4efc8186dc7dcacbb04a5f8e5f5a71201a684

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyfulgur-0.30.0-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: release-python.yml on fulgur-rs/fulgur

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page