pdf_io
Create PDF files in pure Python: convert SVG, draw pages, plot data. Standard library only; numpy is optional and used only for rasterization.
- Convert SVG to PDF: shapes, paths, text with embedded font subsets, gradients, patterns, clipping, masks, markers, images and CSS.
- Draw a scene with
pdf_io.draw(drawsvg-style) and save it as PDF, SVG or PNG. - Draw on pages with
DocumentandCanvas(HTML-canvas-style): multiple pages, links, bookmarks, metadata, placed SVG files. - Lay out text: paragraphs in boxes, justified or not, greedy or Knuth–Plass line breaking, kerning, ligatures, rich text with links, overflow into further boxes.
- Print and archive: CMYK output, spot colors (Separation), ink limit, ICC output intent; PDF/A-2b, 2u and 3b with file attachments.
- Plot: markers at many points, each with its own shape, size, colors and opacity; heatmaps through bundled or custom colormaps.
Install
pip install .
Python 3.11+. No dependencies. Copying the pdf_io/ directory into a project
also works.
Quick start
import pdf_io
pdf_io.convert_file("drawing.svg") # writes drawing.pdf
pdf_bytes = pdf_io.svg_to_pdf(svg_text)
pdf_io drawing.svg out.pdf
import pdf_io.draw as draw
d = draw.Drawing(400, 300) # CSS pixels, origin top-left
d.append(draw.Circle(200, 150, 80, fill="teal"))
d.append(draw.Text("Hello", 32, 200, 160, text_anchor="middle", fill="white"))
d.save_pdf("hello.pdf")
d.save_svg("hello.svg")
from pdf_io import Document
doc = Document(title="Report")
page = doc.add_page(size="A4") # points, origin top-left
page.font_size = 24
page.fill_text("Report", 50, 80)
page.draw_markers(xs, ys, "circle", size=4, fill="steelblue", stroke=None)
page.draw_heatmap(values, 50, 300, 400, 250, cmap="viridis")
doc.save("report.pdf")
Documentation
- API.md: the complete API, supported SVG features, fonts, rasterization and limits.
- EXAMPLES.md: worked examples (scatter plot, bubble chart, heatmap, multi-page document, rasterization, filters, PNG).
numpy (optional)
numpy is imported only by the features that produce pixels:
- rasterized groups (
rasterize=True,data-rasterize), stored lossless or as JPEG (jpeg_quality=85); - fast rendering of large marker sets inside rasterized groups;
- SVG filters, which are off by default (
filters=True); - PNG export.
Without numpy these raise RasterizationError. Everything else needs only
the standard library.
Limits
- Text: no complex-script shaping or bidirectional reordering. Kerning and ligatures apply to laid-out paragraphs only.
- Fonts: WOFF2 and CFF2 (variable OpenType) fonts are not supported.
- Filters can only be reproduced as pixels, so they are opt-in.
- Animation and scripting are ignored: the initial state is drawn.
Development
python -m unittest discover -s tests -t tests
Tests generate their own fonts and images and ignore installed fonts. Rasterization tests are skipped when numpy is missing.
mypy # type check (configured in pyproject.toml)
The package ships type annotations (py.typed); mypy is a development tool
only.
python tools/regress.py --render --check # output vs. HEAD on tests/corpus
python tools/regress.py --base main --system
python tools/bench.py # timings quoted in API.md (numpy)
regress.py converts every SVG of the corpus with the working tree and with
a git revision and compares the page content streams byte for byte;
--render reports pixel differences of changed files and --check reports
files poppler warns about.
python tools/verapdf.py # PDF/A validation of the corpus
verapdf.py converts the corpus at each PDF/A level and validates the files
with veraPDF (on PATH or --verapdf); the PDF/A
unit tests also run veraPDF when it is on PATH.
License
BSD 3-Clause, see LICENSE.
Metadata
Release files for pdf-io 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pdf_io-0.1.0.tar.gz | 790.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pdf_io-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.0 MB
Release files / pdf_io-0.1.0.tar.gz
| Download URL | pdf_io-0.1.0.tar.gz |
|---|---|
| Size | 790.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5389882f0f0655d74b5d805dc961278e16a3308ef87e08941e338bd99fb4f5ab
|
|
BLAKE2b-256 checksum How to use checksums |
329fde6ed72dd4885f01a887d1272c49701a7c22a62c255a5d02ae73fff80b79
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / pdf_io-0.1.0-py3-none-any.whl
| Download URL | pdf_io-0.1.0-py3-none-any.whl |
|---|---|
| Size | 211.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f864d0e8df08786f7161a7b36c1261b0e9f4a246e364a2e79e5b13fc050c2b57
|
|
BLAKE2b-256 checksum How to use checksums |
aa0f650fd2a28be0c9dc6963ff5b6b896f5efbf415f11e8f1c1cb271bf304473
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Security for pdf-io 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.