PlutoPrint
PlutoPrint is a lightweight and easy-to-use Python library for generating high-quality PDFs and images directly from HTML or XML content. It is based on PlutoBook’s robust rendering engine and provides a simple API to convert your HTML into crisp PDF documents or vibrant image files. This makes it ideal for reports, invoices, or visual snapshots.
Invoices |
Tickets |
|---|---|
Installation
pip install plutoprint
PlutoPrint requires PlutoBook. On Windows (win_amd64), Linux (manylinux_2_28_x86_64) and macOS (macosx_14_0_arm64), prebuilt binaries are bundled with the package and no further steps are necessary. On other architectures or when building from source, see the Getting Started guide for dependency setup and build instructions.
On macOS and Linux, you can also install PlutoPrint using Homebrew:
brew update
brew install plutoprint
Quick Usage
Generate a PDF from the command line with the installed plutoprint script:
plutoprint input.html output.pdf --size=A4
Generate PDF with Python
import plutoprint
book = plutoprint.Book(plutoprint.PAGE_SIZE_A4)
book.load_url("hello.html")
# Export the entire document to PDF
book.write_to_pdf("hello.pdf")
# Export pages 2 to 15 (inclusive) in order
book.write_to_pdf("hello-range.pdf", 2, 15, 1)
# Export pages 15 to 2 (inclusive) in reverse order
book.write_to_pdf("hello-reverse.pdf", 15, 2, -1)
# Render pages manually with PDFCanvas (in reverse order)
with plutoprint.PDFCanvas("hello-canvas.pdf", book.get_page_size()) as canvas:
canvas.scale(plutoprint.UNITS_PX, plutoprint.UNITS_PX)
for page_index in range(book.get_page_count() - 1, -1, -1):
canvas.set_size(book.get_page_size_at(page_index))
book.render_page(canvas, page_index)
canvas.show_page()
Generate PNG with Python
import plutoprint
import math
book = plutoprint.Book(media=plutoprint.MEDIA_TYPE_SCREEN)
book.load_html("<b>Hello World</b>", user_style="body { text-align: center }")
# Outputs an image at the document’s natural size
book.write_to_png("hello.png")
# Outputs a 320px wide image with auto-scaled height
book.write_to_png("hello-width.png", width=320)
# Outputs a 240px tall image with auto-scaled width
book.write_to_png("hello-height.png", height=240)
# Outputs an 800×200 pixels image (may stretch/squish content)
book.write_to_png("hello-fixed.png", 800, 200)
# Get the natural document size
width = math.ceil(book.get_document_width())
height = math.ceil(book.get_document_height())
# Outputs a high-resolution 5x scaled image
book.write_to_png("hello-scaled.png", width * 5, height * 5)
# Render manually on a canvas with white background
with plutoprint.ImageCanvas(width, height) as canvas:
canvas.clear_surface(1, 1, 1)
book.render_document(canvas)
canvas.write_to_png("hello-canvas.png")
Generate QR Codes
Quick example of using -pluto-qrcode(<string>[, <color>]) to create QR codes with optional colors.
import plutoprint
HTML_CONTENT = """
<table>
<tr>
<th class="email">Email</th>
<th class="tel">Tel</th>
</tr>
<tr>
<th class="website">Website</th>
<th class="github">GitHub</th>
</tr>
</table>
"""
USER_STYLE = """
body {
margin: 0;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: #f7f7f7;
font: 16px Arial;
}
table {
border-spacing: 2rem;
background: #fff;
padding: 2rem;
border: 1px solid #ccc;
border-radius: 16px;
}
th::before {
display: block;
width: 130px;
height: 130px;
margin: 0 auto 0.8rem;
}
.email::before { content: -pluto-qrcode('mailto:contact@example.com', #16a34a); }
.tel::before { content: -pluto-qrcode('tel:+1234567890', #2563eb); }
.website::before { content: -pluto-qrcode('https://example.com', #ef4444); }
.github::before { content: -pluto-qrcode('https://github.com/plutoprint', #f59e0b); }
"""
book = plutoprint.Book(plutoprint.PAGE_SIZE_LETTER.landscape())
book.load_html(HTML_CONTENT, USER_STYLE)
book.write_to_png("qrcard.png")
book.write_to_pdf("qrcard.pdf")
Expected output:
Generate Charts with Matplotlib
import plutoprint
import matplotlib.pyplot as plt
import urllib.parse
import io
class CustomResourceFetcher(plutoprint.ResourceFetcher):
def fetch_url(self, url):
if not url.startswith('chart:'):
return super().fetch_url(url)
values = [float(v) for v in urllib.parse.unquote(url[6:]).split(',')]
labels = [chr(65 + i) for i in range(len(values))]
plt.bar(labels, values)
plt.title('Bar Chart')
plt.xlabel('Labels')
plt.ylabel('Values')
buffer = io.BytesIO()
plt.savefig(buffer, format='svg', transparent=True)
return plutoprint.ResourceData(buffer.getvalue(), "image/svg+xml", "utf-8")
book = plutoprint.Book(plutoprint.PAGE_SIZE_A4.landscape(), plutoprint.PAGE_MARGINS_NONE)
book.custom_resource_fetcher = CustomResourceFetcher()
HTML_CONTENT = """
<body>
<img src='chart:23,45,12,36,28,50'>
<img src='chart:5,15,25,35,45'>
<img src='chart:50,40,30,20,10'>
<img src='chart:10,20,30,40,50,60,70'>
</body>
"""
USER_STYLE = """
body {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
background: #f7f7f7;
height: 100vh;
margin: 0;
}
img {
background: #fff;
border: 1px solid #ccc;
margin: auto;
max-height: 45vh;
}
"""
book.load_html(HTML_CONTENT, USER_STYLE)
book.write_to_png("charts.png")
book.write_to_pdf("charts.pdf")
Expected output:
Samples
Links & Resources
Documentation: https://plutoprint.readthedocs.io
Donation: https://github.com/sponsors/plutoprint
Support and Contribution
This project continues to grow through the encouragement and involvement of its users. If it has been helpful to you or your team, here are a few meaningful ways you can support its future:
Give it a Star on GitHub. Starring the project helps others discover it and shows your appreciation for the work behind it.
Sponsor the project to help drive new features, improve stability, and ensure the project continues to evolve for everyone who relies on it.
Share your feedback. If you have suggestions, feature requests, or notice an issue, please open a GitHub issue. Your voice and experience help guide the project’s direction.
License
PlutoPrint is licensed under the MIT License, allowing for both personal and commercial use.
Metadata
Release files for plutoprint 0.22.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 | |
|---|---|---|---|
| plutoprint-0.22.0.tar.gz | 41.5 kB | Details |
Built distributions (wheels)
Total release size: 291.0 MB
Release files / plutoprint-0.22.0.tar.gz
| Download URL | plutoprint-0.22.0.tar.gz |
|---|---|
| Size | 41.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3660300fe57880782f2488fddbdab19bf3e7fde6d6713a696c0c2869006dca10
|
|
BLAKE2b-256 checksum How to use checksums |
83d7c15fb7d9d017f09777ee8b70c04091a490e56c3b289c6a23706d62942a8b
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp314-cp314-win_amd64.whl
| Download URL | plutoprint-0.22.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 20.2 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
df1a87163561b183625780620d60c3b4aa6547aa8775cf3290aa12b42ca83006
|
|
BLAKE2b-256 checksum How to use checksums |
899a3cc008a477a3d05909393c2bcf268a2ba8203ea5fd04d2f05311ae8bc046
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp314-cp314-manylinux_2_28_x86_64.whl
| Download URL | plutoprint-0.22.0-cp314-cp314-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.3 MB |
| Tags | CPython 3.14 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
72985ef1494d6b062be14bec56d78be2d112c7b0925ccf011ab18666548b1ae0
|
|
BLAKE2b-256 checksum How to use checksums |
d4cb857d3a11b6a0ead4351974dd8a5cb7ce2c934eabcba8737d77ac76d7db01
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp314-cp314-macosx_14_0_arm64.whl
| Download URL | plutoprint-0.22.0-cp314-cp314-macosx_14_0_arm64.whl |
|---|---|
| Size | 18.3 MB |
| Tags | CPython 3.14 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
617dba010d9e72e58340c5c26b2ec7afc541a713b481d0aff424034608e92de4
|
|
BLAKE2b-256 checksum How to use checksums |
e72082769eac4586bed2d27929111330e02110c6d13f102b3699e56c56295ed2
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp313-cp313-win_amd64.whl
| Download URL | plutoprint-0.22.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 19.5 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f6dd0cb3bbfe39caec61fc4e81745a9837e8e6a0a7481ca993badc72863b0e65
|
|
BLAKE2b-256 checksum How to use checksums |
d7a2e79aef15cb44ce4725ba200bab21fcc7690f8967dbb4cd8df584e6c5e675
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | plutoprint-0.22.0-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.3 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
f40c12905eb88510096cd4a0a60dc2a94f7c9c6bae8644035f2f1f3bd5c26924
|
|
BLAKE2b-256 checksum How to use checksums |
2a02b478eacec8c8b16f47748038a298a4971e9d42dd7bb84f4700890f37b3af
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp313-cp313-macosx_14_0_arm64.whl
| Download URL | plutoprint-0.22.0-cp313-cp313-macosx_14_0_arm64.whl |
|---|---|
| Size | 18.3 MB |
| Tags | CPython 3.13 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c0cd4bbb07c07e18099e8077c9d35e9c7faf8184acaeed514aa69496b888f782
|
|
BLAKE2b-256 checksum How to use checksums |
c7d7d25e4f30d04178490d1568d399f21ea2913182c8a13d7fdcc3f0c22eaeaa
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp312-cp312-win_amd64.whl
| Download URL | plutoprint-0.22.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 19.5 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3782288c44f02c3888b23ccf3e844c2db409afce9ad49127a51a3af87a499f15
|
|
BLAKE2b-256 checksum How to use checksums |
058f31ba7b214ada52677973dc673e5aa91ca07922b185cfe905fa358c7dbec6
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | plutoprint-0.22.0-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.3 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
cc20cb0c4961220de31992bfb37151745455878455c4231961cdc4e2bcfb319c
|
|
BLAKE2b-256 checksum How to use checksums |
e20db16075f97a142287e91fd6479dafc63b998c1d79c51e54a1aaa12c02d4e3
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp312-cp312-macosx_14_0_arm64.whl
| Download URL | plutoprint-0.22.0-cp312-cp312-macosx_14_0_arm64.whl |
|---|---|
| Size | 18.3 MB |
| Tags | CPython 3.12 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
587674c26271ee646632e2ef48ce56b8ae2dbe3b19f4f922eb07758b74082333
|
|
BLAKE2b-256 checksum How to use checksums |
be849cf047fe23c1b9f8f277aa65a284c8628a0fecfcef6c49d7a999931f0f7e
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp311-cp311-win_amd64.whl
| Download URL | plutoprint-0.22.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 19.5 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
1d78337df8bb4cf8f1f5d3736465b2fc642f996862f0d6bce49ede1225773832
|
|
BLAKE2b-256 checksum How to use checksums |
93255c8d82e3ea5c7315c701c70843cc552763edeb48653c858dd676477f245a
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp311-cp311-manylinux_2_28_x86_64.whl
| Download URL | plutoprint-0.22.0-cp311-cp311-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.3 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
b41cd6b82c53616bfc29bdb15604ce6a80d9736ef42ba1aba2e212653213e758
|
|
BLAKE2b-256 checksum How to use checksums |
d2f0a8e6d44c01feca3d17fe011b20772315122f9e23bc1bfe8411dbf920d19c
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp311-cp311-macosx_14_0_arm64.whl
| Download URL | plutoprint-0.22.0-cp311-cp311-macosx_14_0_arm64.whl |
|---|---|
| Size | 18.3 MB |
| Tags | CPython 3.11 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6c48ab913af78a3a48700b902faec8644534ceeac02286f9af1c3842b040f8ba
|
|
BLAKE2b-256 checksum How to use checksums |
2804b24f94ddbe5cdbf6090430ab4d234a9435fee20f42ee2aaadd3bc4245b8c
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp310-cp310-win_amd64.whl
| Download URL | plutoprint-0.22.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 19.5 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c44fcac1ed1453dc355b12bb537d296357570d0207509f61898bbdcab368701c
|
|
BLAKE2b-256 checksum How to use checksums |
361e974ae1afe7891d904232ecb9ac4392ed24fa8595cffb83e7836b82def189
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp310-cp310-manylinux_2_28_x86_64.whl
| Download URL | plutoprint-0.22.0-cp310-cp310-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.3 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
08e5bfcc66437364832d62a93db45ed2258459dafd15ee3943056cfd9b37ae51
|
|
BLAKE2b-256 checksum How to use checksums |
1b34b582471257e0b7878ea11cb34219933a8b6ecbb4d2318427bc056355a389
|
| 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 Aug 4, 2026.
Transparency logRelease files / plutoprint-0.22.0-cp310-cp310-macosx_14_0_arm64.whl
| Download URL | plutoprint-0.22.0-cp310-cp310-macosx_14_0_arm64.whl |
|---|---|
| Size | 18.3 MB |
| Tags | CPython 3.10 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4ad2dc1f94f946fd956aa45ead937babf68bc4d2ec629b38e96cddb3a41730fd
|
|
BLAKE2b-256 checksum How to use checksums |
2d90b9b458b886cf1150cb10ae7305a3c18a3bd2f2ca9fb542d41652c7e7d0d1
|
| 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 Aug 4, 2026.
Transparency log