---
title: "Certifying PDF documents | Nutrient Python SDK"
canonical_url: "https://www.nutrient.io/guides/python/editor/certify-a-pdf-document/"
md_url: "https://www.nutrient.io/guides/python/editor/certify-a-pdf-document.md"
last_updated: "2026-08-21T00:00:00.000Z"
description: "How to certify PDF documents and control permitted changes using Nutrient Python SDK."
---

# Certifying PDF documents

A certifying signature (also called an author or DocMDP signature) does more than prove who signed a document — it declares which changes are permitted afterward. Any change beyond what the certification permits invalidates the signature, so PDF viewers can warn the reader that the document was altered. A certifying signature must be the first signature applied to a document, and a document can have only one.

Common use cases include:

- Locking a finalized contract so no further changes are permitted

- Publishing a form that recipients may fill in but not otherwise modify

- Certifying a report while still permitting reviewers to add annotations

[Download sample](https://www.nutrient.io/downloads/samples/python/certify-a-pdf-document.zip)

## How Nutrient helps

Nutrient Python SDK applies the DocMDP certification transform behind a single property. The SDK handles:

- Writing the DocMDP transform parameters that declare the permitted changes

- Marking the signature as a certifying signature in the document catalog

- Computing the byte ranges and building the CMS/PKCS#7 signature container

- Writing the signature into the PDF using an incremental update

## Certification levels

The `SignatureCertificationLevel` enumeration declares which changes are permitted after certification:

- `NOT_CERTIFIED` — an ordinary approval signature, not a certifying one. This is the default.

- `NO_CHANGES` — no changes are permitted; any change invalidates the signature.

- `FORM_FILLING` — only form fill-in and signing are permitted.

- `FORM_FILLING_AND_ANNOTATIONS` — form fill-in, signing, and annotation changes are permitted.

## Complete implementation

This example applies a certifying signature that permits form fill-in and signing:

```python

from nutrient_sdk import Document, Signature
from nutrient_sdk import DigitalSignatureOptions
from nutrient_sdk import SignatureCertificationLevel

```

## Certifying the document

Set the `certification` property to make the signature a certifying signature.

In this sample:

- `Document.open("input.pdf")` opens the PDF before signing.

- `certification = SignatureCertificationLevel.FORM_FILLING` permits form fill-in and signing after certification.

- `sign(document, output_path, options)` applies the certifying signature.

Because a certifying signature must be the first signature on the document, apply it before any approval signatures:

```python

with Signature() as signer, Document.open("input.pdf") as document:
    options = DigitalSignatureOptions()
    options.certificate_path = "certificate.pfx"
    options.certificate_password = "Nutrient answers all your document needs"
    options.signer_name = "Document Author"
    options.reason = "Certifying document integrity"
    options.certification = SignatureCertificationLevel.FORM_FILLING

    signer.sign(document, "output_certified.pdf", options)

```

## Conclusion

Use this workflow to certify a document:

1. Open the document using a [context manager](https://docs.python.org/3/reference/datamodel.html#context-managers) for automatic resource cleanup.

2. Configure `DigitalSignatureOptions` with certificate credentials and signing metadata.

3. Declare the permitted changes with the `certification` property and the `SignatureCertificationLevel` enumeration.

4. Apply the certifying signature first — it must be the first signature on the document, and a document can have only one.

5. Use `NO_CHANGES` to lock the document completely, or `FORM_FILLING` and `FORM_FILLING_AND_ANNOTATIONS` to permit specific downstream changes.

6. Leave the default `NOT_CERTIFIED` for ordinary approval signatures that don’t restrict later changes.

For related signing workflows, refer to the [Python SDK guides](https://www.nutrient.io/guides/python.md).
---

## Related pages

- [Nutrient Python SDK editor guides](/guides/python/editor.md)
- [Adding annotations to a PDF document](/guides/python/editor/add-annotations-to-pdf.md)
- [Adding a custom page to a PDF document](/guides/python/editor/add-custom-page-to-pdf.md)
- [Adding interactive form fields to a PDF document](/guides/python/editor/add-form-fields-to-pdf.md)
- [Adding free text annotations to a PDF document](/guides/python/editor/add-freetext-annotations-to-pdf.md)
- [Adding invisible digital signatures to a PDF document](/guides/python/editor/add-invisible-signature-to-pdf.md)
- [Adding link annotations to a PDF document](/guides/python/editor/add-link-annotations-to-pdf.md)
- [Adding redaction annotations to a PDF document](/guides/python/editor/add-redaction-annotations-to-pdf.md)
- [Adding shape annotations to a PDF document](/guides/python/editor/add-shape-annotations-to-pdf.md)
- [Adding stamp annotations to a PDF document](/guides/python/editor/add-stamp-annotations-to-pdf.md)
- [Adding sticky note annotations to a PDF document](/guides/python/editor/add-sticky-note-annotations-to-pdf.md)
- [Adding text markup annotations to a PDF document](/guides/python/editor/add-text-markup-annotations-to-pdf.md)
- [Adding visible digital signatures to a PDF document](/guides/python/editor/add-visible-signature-to-pdf.md)
- [Advanced digital signature workflows](/guides/python/editor/advanced-digital-signatures.md)
- [Deskewing PDF pages](/guides/python/editor/deskew-pdf-page.md)
- [Detecting and adding form fields to a PDF document](/guides/python/editor/detect-and-add-form-fields.md)
- [Editing PDF form fields](/guides/python/editor/editing-pdf-form-fields.md)
- [Editing PDF metadata with Nutrient Python SDK](/guides/python/editor/editing-pdf-metadata.md)
- [Filling PDF form fields](/guides/python/editor/fill-pdf-form.md)
- [Managing PDF page order](/guides/python/editor/manage-pdf-page-order.md)
- [Merging PDFs](/guides/python/editor/merge-pdf-into-other-pdf.md)
- [Signing PDFs with PAdES levels](/guides/python/editor/sign-pdf-with-pades-level.md)

