Skip to main content

PDFGate's official Python SDK

The PDFGate Python SDK provides convenient access to the PDFGate API from applications written in Python. It includes typed parameter objects, synchronous and asynchronous clients, response helpers, webhook management, and webhook signature verification for common PDF generation, processing, and signing workflows.

📘 Documentation: https://pdfgate.com/documentation
🔑 Dashboard & API keys: https://dashboard.pdfgate.com

pdfgate

PyPI - Version PyPI - Python Version

Table of Contents

Installation

pip install pdfgate

Quick start

import os

from pdfgate import PDFGate, GeneratePDFParams


client = PDFGate(api_key=os.environ["PDFGATE_API_KEY"])
params = GeneratePDFParams(url="https://example.com")
document = client.generate_pdf(params)

print(document["id"])

Sync & Async

There are sync and async versions of all methods, the only difference is that the method name has an async suffix:

document_response = client.get_document(GetDocumentParams(document_id=document_id))

# VS

document_response = await client.get_document_async(GetDocumentParams(document_id=document_id))

Other than that, nothing changes and the interfaces are the same.

Responses

The SDK returns a PDFGateDocument for all processing endpoints:

  • generate_pdf
  • flatten_pdf
  • add_form_fields
  • compress_pdf
  • watermark_pdf
  • protect_pdf
  • upload_file

To get raw PDF bytes, call get_file with a document ID. delete_document returns None.

Webhook management methods (create_webhook, get_webhook) return a WebhookResponse; delete_webhook returns None.

Every method has an async counterpart (e.g. add_form_fields_async, delete_document_async, create_webhook_async).

Managing Webhooks

Register, retrieve, and delete webhook endpoints that receive PDFGate event notifications. The secret returned by create_webhook is shown only once — store it to verify incoming payloads.

from pdfgate import (
    CreateWebhookParams,
    DeleteWebhookParams,
    GetWebhookParams,
    WebhookEventType,
)

created = client.create_webhook(
    CreateWebhookParams(
        url="https://example.com/pdfgate-callback",
        event_types=[
            WebhookEventType.ENVELOPE_COMPLETED,
            WebhookEventType.ENVELOPE_SENT,
        ],
        description="Production signing events",
    )
)
webhook_id = created["id"]
secret = created["secret"]

fetched = client.get_webhook(GetWebhookParams(webhook_id=webhook_id))

client.delete_webhook(DeleteWebhookParams(webhook_id=webhook_id))

The subscribable events are exposed via WebhookEventType: ENVELOPE_SENT, ENVELOPE_COMPLETED, ENVELOPE_EXPIRED, and ENVELOPE_DOCUMENT_COMPLETED. The webhook URL must be publicly accessible (localhost is not supported).

Webhook Verification

Use verify_signature with the raw request body and the x-pdfgate-signature header value received from PDFGate:

from pdfgate import verify_signature


event = verify_signature(
    secret="whsecret_...",
    signature_header=request.headers["x-pdfgate-signature"],
    payload=request_body,
)

event_id = event["event_id"]

Examples

Generate PDF

params = GeneratePDFParams(html="<h1>Hello from PDFGate!</h1>")
document = client.generate_pdf(params)
print(document["id"])

Get document metadata

document_response = client.get_document(GetDocumentParams(document_id=document_id))

print(document_response["id"])
print(document_response["status"])
print(document_response.get("file_url"))

Download a stored PDF file

file_content = client.get_file(GetFileParams(document_id=document_id))

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

Upload a PDF file

file_param = FileParam.pdf(name="input.pdf", data=pdf_file_bytes)
document_response = client.upload_file(UploadFileParams(file=file_param))

If both file and url are provided, file is prioritized and the request is sent as multipart.

Flatten a PDF (make form-fields non-editable)

flatten_pdf_params = FlattenPDFParams(
    document_id=document_id,
    # Optional: flatten only these fields and leave the rest interactive.
    # Omit field_names to flatten the whole document.
    field_names=["signature", "date"],
)
flattened_document = client.flatten_pdf(flatten_pdf_params)

Add form fields to a PDF

from pdfgate import (
    AddFormFieldsParams,
    DocumentFieldType,
    FieldOverride,
    ManualFormField,
)

response = client.add_form_fields(
    AddFormFieldsParams(
        document_id=document_id,
        # Customize placeholder fields detected in the PDF, keyed by field name.
        field_overrides={"signature": FieldOverride(role="signer", optional=False)},
        # Or place fields at explicit positions on a given page.
        fields=[
            ManualFormField(
                name="signed_on",
                type=DocumentFieldType.DATE,
                page=1,
                x=100,
                y=650,
                width=160,
                height=24,
            )
        ],
    )
)

Delete a stored document

from pdfgate import DeleteDocumentParams

client.delete_document(DeleteDocumentParams(document_id=document_id))

A document referenced by a draft or in-progress envelope cannot be deleted until those envelopes are completed or expired.

Compress a PDF

compress_pdf_params = CompressPDFParams(
    document_id=document_id
)
response = client.compress_pdf(compress_pdf_params)

Watermark a PDF

watermark_pdf_params = WatermarkPDFParams(
    document_id=document_id,
    type=WatermarkType.IMAGE,
    watermark=FileParam(name="watermark.jpg", data=jpg_file),
)
watermarked_pdf = client.watermark_pdf(watermark_pdf_params)

For a text watermark you can upload a custom font file (TTF/OTF), which overrides the built-in font:

watermark_pdf_params = WatermarkPDFParams(
    document_id=document_id,
    type=WatermarkType.TEXT,
    text="Confidential",
    font_file=FileParam(name="custom.ttf", data=ttf_file, type="font/ttf"),
    rotate=30,
    opacity=0.3,
)
watermarked_pdf = client.watermark_pdf(watermark_pdf_params)

Protect (encrypt) a PDF

protect_pdf_params = ProtectPDFParams(
    document_id=document_id,
    user_password="user-password",
    owner_password="owner-password",
)
response = client.protect_pdf(protect_pdf_params)

Extract PDF form fields values

html_form = """
<form>
    <input type="text" name="first_name" value="John" />
    <input type="text" name="last_name" value="Doe" />
</form>
"""
generate_pdf_params = GeneratePDFParams(
    html=html_form, enable_form_fields=True
)
document_response = client.generate_pdf(generate_pdf_params)
document_id = document_response["id"]

extract_form_params = ExtractPDFFormDataParams(document_id=document_id)
response = client.extract_pdf_form_data(extract_form_params)

Development

Before doing anything, install pre-commit by running:

hatch run dev:pre-commit install

This will run several checks every time you try to git commit including:

  • linting and formatting with Ruff
  • type checking with mypy

If you are on VS Code, it's recommended to install the Ruff extension so you'll get formatting on the fly.

Hatch is used as a build system and for dependency management, so all main actions are configured to be run with Hatch.

Tests

Unit tests:

hatch run test:test

Acceptance tests hit the PDFGate API so they are slower, and require an API key that is expected to be set as an env var named PDFGATE_API_KEY. You can set it on your Bash/zsh/fish profile or inline as in:

PDFGATE_API_KEY="test_123" hatch run test:test_acceptance

Manually run Ruff

Linting:

hatch run dev:lint

Formatting:

hatch run dev:ruff format .

Type checking

Run mypy manually:

hatch run dev:check

Docs

Docs are built using MkDocs, they live in the docs/ folder, and in the code. If you make any changes, and would like to see them live before publishing them, spin up a server locally with:

hatch run docs:serve

Changes to docs/** and mkdocs.yml trigger a new deployment of the docs site. If you change the code's documentation and want to manually update the docs site you can do it from the Actions tab of the repo or by running:

hatch run docs:mkdocs gh-deploy

Support

For support, contact support@pdfgate.com.

License

pdfgate is distributed under the terms of the MIT license.

Download files

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

Source Distribution

pdfgate-0.0.5.tar.gz (33.2 kB view details)

Uploaded Source

Built Distribution

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

pdfgate-0.0.5-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file pdfgate-0.0.5.tar.gz.

File metadata

  • Download URL: pdfgate-0.0.5.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pdfgate-0.0.5.tar.gz
Algorithm Hash digest
SHA256 e8c743b8d2ff0463231524650acbfbd01639c27889e0d0ff446d32ab2afcc8bf
MD5 ace9b3a4c40ff2ca30d37cac2f23e66f
BLAKE2b-256 4f62d1e40622f56c7f86569ec7ca8e67a57810c24512fbb8bc5e0e480aac77a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfgate-0.0.5.tar.gz:

Publisher: publish-to-pypi.yml on pdfgate/pdfgate-sdk-python

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

File details

Details for the file pdfgate-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: pdfgate-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 21.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pdfgate-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7d7eb36d1b0401b899da4f0b32a909c6b1151d3b5d2f9a41195049a548802669
MD5 fcd48a422d8145ba18d51facdc8aa0f3
BLAKE2b-256 5ba6203dde07701daa0a3239b5053f0bae901d02d2d0f267d9713af11025a108

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfgate-0.0.5-py3-none-any.whl:

Publisher: publish-to-pypi.yml on pdfgate/pdfgate-sdk-python

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

Release history Release notifications | RSS feed

1.1.0

2 files

1.0.0

2 files

This release

0.0.5 This release

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page