Python SDK for the Forme hosted PDF API
Project description
formepdf
Python SDK for Forme — the page-native PDF rendering engine. Two ways to use it:
- API client — calls the hosted API at api.formepdf.com (requires API key)
- Local rendering — runs the WASM engine locally via wasmtime (no API key needed)
Installation
# API client only (zero dependencies)
pip install formepdf
# Local rendering with component DSL (adds wasmtime)
pip install formepdf[local]
API Client
Setup
from formepdf import Forme
client = Forme("forme_sk_...")
Render
Render a template (created in the dashboard) with data:
pdf = client.render("invoice", {"customer": "Acme", "total": 245})
with open("invoice.pdf", "wb") as f:
f.write(pdf)
Async render
job = client.render_async("report", data, webhook_url="https://example.com/hook")
result = client.get_job(job["jobId"])
if result["status"] == "complete":
pdf_b64 = result["pdfBase64"]
Certify
Apply a PKCS#7 digital signature to an existing PDF:
with open("document.pdf", "rb") as f:
pdf = f.read()
certified = client.certify(
pdf,
certificate=open("cert.pem").read(),
private_key=open("key.pem").read(),
reason="Approved",
location="New York",
)
with open("certified.pdf", "wb") as f:
f.write(certified)
Or use a saved certificate on the hosted API:
certified = client.certify(pdf, certificate_id="cert_abc123")
Redact
Remove sensitive content from a PDF — true redaction (text operators removed, not just covered):
# By text pattern
redacted = client.redact(pdf, patterns=[
{"pattern": "Jane Doe", "pattern_type": "Literal"},
{"pattern": r"\d{3}-\d{2}-\d{4}", "pattern_type": "Regex"},
])
# By built-in presets
redacted = client.redact(pdf, presets=["ssn", "email", "phone"])
# By coordinate regions
redacted = client.redact(pdf, redactions=[
{"page": 0, "x": 100, "y": 200, "width": 150, "height": 20},
])
# By saved redaction template
redacted = client.redact(pdf, template="hipaa-patient-record")
Merge
Combine multiple PDFs into one:
merged = client.merge([pdf1_bytes, pdf2_bytes, pdf3_bytes])
with open("merged.pdf", "wb") as f:
f.write(merged)
Rasterize
Convert PDF pages to PNG images:
pages = client.rasterize(pdf, dpi=200)
for i, png in enumerate(pages):
with open(f"page-{i + 1}.png", "wb") as f:
f.write(png)
Extract embedded data
data = client.extract(pdf) # returns dict or None
Error handling
from formepdf import Forme, FormeError
try:
pdf = client.render("invoice", data)
except FormeError as e:
print(f"Error {e.status}: {e.message}")
Local Rendering (WASM)
Build PDF documents in Python with a component DSL that mirrors the JSX API. Renders locally via the WASM engine — no API key or network calls needed.
Basic example
from formepdf import Document, Page, View, Text, Image
doc = Document(
Page(
View(
Text("Invoice #001", font_size=24, font_weight="bold"),
Text("Acme Corp", font_size=14, color="#666"),
flex_direction="column", gap=8,
),
),
title="Invoice #001",
)
pdf = doc.render()
with open("invoice.pdf", "wb") as f:
f.write(pdf)
Components
| Component | Description |
|---|---|
Document(*children) |
Root container. .render() returns PDF bytes. Options: title, author, subject, lang, tagged, pdf_ua, pdfa, flatten_forms |
Page(*children) |
Page container. Options: size (e.g. "A4", "Letter"), margin |
View(*children) |
Flex/grid container. Options: all style kwargs (flex_direction, gap, padding, etc.) |
Text(content) |
Text element. Options: font_size, font_weight, color, text_align, etc. |
Image(src) |
Image (file path, URL, or data URI). Options: width, height, alt |
Table(*rows) |
Table with auto-repeating headers. Options: columns |
Row(*cells) |
Table row. Options: header=True for repeat-on-page-break |
Cell(*children) |
Table cell. Options: col_span, row_span |
Svg(content) |
Inline SVG. Options: width, height |
QrCode(data) |
Vector QR code. Options: size, color |
Barcode(data) |
1D barcode. Options: format ("Code128", "Code39", "EAN13", etc.), width, height |
BarChart(data) |
Bar chart. Options: width, height, color, title |
LineChart(series, labels) |
Line chart. Options: width, height, show_points, title |
PieChart(data) |
Pie/donut chart. Options: width, height, donut, title |
AreaChart(series, labels) |
Area chart. Options: width, height, title |
DotPlot(groups) |
Scatter plot. Options: width, height, title |
TextField(name) |
Fillable text field. Options: value, placeholder, multiline |
Checkbox(name) |
Fillable checkbox. Options: checked |
Dropdown(name, options) |
Fillable dropdown. Options: value |
RadioButton(name, value) |
Radio button. Options: checked |
Watermark(text) |
Rotated watermark. Options: font_size, color, angle |
PageBreak() |
Force a page break |
Fixed(*children) |
Fixed-position element. Options: position ("header", "footer") |
Certify locally
from formepdf.wasm import certify_pdf
with open("document.pdf", "rb") as f:
pdf = f.read()
import json
config = json.dumps({
"certificate_pem": open("cert.pem").read(),
"private_key_pem": open("key.pem").read(),
"reason": "Approved",
})
certified = certify_pdf(pdf, config)
Requirements
- Python 3.8+
- No external dependencies for the API client (stdlib only)
wasmtimefor local rendering (pip install formepdf[local])
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file formepdf-0.9.1.tar.gz.
File metadata
- Download URL: formepdf-0.9.1.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66c443de23ac20d723a0adb724c0005b90480b857ee81c4e520491037bc35745
|
|
| MD5 |
6a8f09adf584dda6cc9e4d42aec4ad94
|
|
| BLAKE2b-256 |
48d35524ff86beeffb41bccfa8ee103a80ee8494fe86a95a9bf454a5cd0ee1b7
|
File details
Details for the file formepdf-0.9.1-py3-none-any.whl.
File metadata
- Download URL: formepdf-0.9.1-py3-none-any.whl
- Upload date:
- Size: 17.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8b31291c0ffac4e8cc7fea2d5df0b8c8d2a43414c7e4e0fade350885ea21f12
|
|
| MD5 |
e94cdc0e5d48ac83b18f84c2f3bb270e
|
|
| BLAKE2b-256 |
99a986528a44eb0e1276a0cc45ffbbebf1dcd56e8b41a71a4b23a74e3872369e
|