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

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.5.1.tar.gz (395.4 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.5.1-cp39-abi3-win_amd64.whl (6.9 MB view details)

Uploaded CPython 3.9+Windows x86-64

pyfulgur-0.5.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.1 MB view details)

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

pyfulgur-0.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.8 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

pyfulgur-0.5.1-cp39-abi3-macosx_11_0_arm64.whl (6.4 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

pyfulgur-0.5.1-cp39-abi3-macosx_10_12_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pyfulgur-0.5.1.tar.gz
Algorithm Hash digest
SHA256 aa146d12969957e8f541e7ba61a3195c0b3a9dd0e7e0d9cf49e376af2afbc789
MD5 ca347c6fd623b55602bfdded6fa6652c
BLAKE2b-256 486d469095dc4388ceb1d4eb73fda01cb06cf840ab16bfd439184eb29fb4f793

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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.5.1-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: pyfulgur-0.5.1-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 6.9 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.5.1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e5a9ce45770a2b7511a3dfc0fb957ac4ce69ba0811af82c395f3ff6be3e8e024
MD5 2bfee997d0f1e234750ccc0421cf6de5
BLAKE2b-256 86b9e8377b6269355f26b2690f537b1fe283a547703827428ae3c3675e487298

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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.5.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.5.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b7723769fb4f74df05e0e2535d7ff9b11cca4a6067840735f0074fef92a2b7bd
MD5 ada9fb48bd24f3e749d3d398acb086b3
BLAKE2b-256 6aeece36b03fa8156c2402c4a922d47280c033f7d2306e0c9c300ddf563db686

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fe057be2996c3c807f6e0891fe48f82f3dbb2c58b768ffe7f338302547d43f2a
MD5 24e482234a2afda4154a92b0110c4ef5
BLAKE2b-256 9db98f008a42ca0f38c6de9e011bc05aa3f751830b727a23c82602dbd318853f

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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.5.1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.5.1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 153c3284c264ac38897343cd2ac7be7929c37e4e0b95c2571ae26821fed9f631
MD5 ee34de27d75ae6eaef2046fc915cbb1e
BLAKE2b-256 1042ae9d7a0d7d3488dd4cbf8ca28317595afe961c984c23ce7398b5a9f10a21

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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.5.1-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyfulgur-0.5.1-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4e96e621ed325a468382eaeca7fe3e02cfe63fc8e2cb41f9daa6d32e7bdc495c
MD5 8cd28583fb931e96ac00b326839713a1
BLAKE2b-256 182aa083fdaf865a7814f94f1fe55b0a8ab1dd2b9d0fe7f4be3b56b6648d6a15

See more details on using hashes here.

Provenance

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

Publisher: release-python.yml on mitsuru/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