I am trying to programmatically add a required signature field to a PDF using both pymupdf (PyMuPDF) and pyhanko. My goal is to ensure that Adobe Acrobat recognizes the field as a required signature field.
I have two different implementations:
Using PyHanko (append_signature_field):
I can successfully add a signature field that appears in Adobe Acrobat, but I am unable to make it required.
Adobe allows me to sign the field, but it does not enforce the requirement.
Using PyMuPDF (Widget):
I can add a signature field with field_flags = 0, which should allow modifications.
However, Adobe Acrobat treats the PDF as already signed, preventing further edits.
import fitz # PyMuPDF
def add_signature_field_pymupdf(input_pdf, output_pdf):
doc = fitz.open(input_pdf)
page = doc[0] # First page
page_height = page.rect.height
# Define coordinates for the signature field
x1, y1, x2, y2 = 100, 600, 300, 650
y1_pdf, y2_pdf = page_height - y2, page_height - y1 # Flip Y-coordinates
# Create a signature widget
w = fitz.Widget()
w.field_name = "AdobeSignHere"
w.field_label = "Please Sign Here"
w.field_value = None
w.text_font = "TiRo"
w.text_fontsize = 12
w.rect = fitz.Rect(x1, min(y1_pdf, y2_pdf), x2, max(y1_pdf, y2_pdf))
w.field_type = fitz.PDF_WIDGET_TYPE_SIGNATURE
w.field_flags = 2 # Set as required
page.add_widget(w)
doc.save(output_pdf, pretty=True)
print(f"Signature field added: {output_pdf}")
# Run function
output_pdf_pymupdf = "signed_pymupdf.pdf"
add_signature_field_pymupdf(pdf_path, output_pdf_pymupdf)
from pyhanko.sign.fields import append_signature_field, SigFieldSpec
from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
def add_signature_field_pyhanko(input_pdf, output_pdf):
with open(input_pdf, "rb") as pdf_in:
w = IncrementalPdfFileWriter(pdf_in)
# Define signature field specifications
sig_field_spec = SigFieldSpec(
sig_field_name="AdobeSignHere",
on_page=0, # First page
box=(100, 600, 300, 650), # Position
empty_field_appearance=True, # Adobe requires a visible field
combine_annotation=True, # Keep annotation and field together
readable_field_name="Please Sign Here" # Tooltip for the field
)
append_signature_field(w, sig_field_spec)
with open(output_pdf, "wb") as pdf_out:
w.write(pdf_out)
print(f"Signature field added using PyHanko: {output_pdf}")
# Run function
output_pdf_pyhanko = "signed_pyhanko.pdf"
add_signature_field_pyhanko(pdf_path, output_pdf_pyhanko)
This creates a signature field, but when opening the PDF in Adobe Acrobat, it thinks the document is already signed and prevents modifications.
I suspect the issue might be with the field flags or signature field setup, but I can't find the correct combination to make the field required and still signable.
What I've Tried: Setting w.field_flags = 2 (read-only), which prevents signing.
Using w.is_signed = False, but PyMuPDF does not allow manually setting this.
Changing fonts (times-roman, TiRo), but no effect.
Comparing field properties with an Adobe-created required signature field, but I couldn't match it exactly.
Expected Outcome: The PDF should contain a signature field that is marked as required in Adobe Acrobat.
The field should allow a user to sign it.
The document should remain editable until signed.
Question: How can I correctly define a required but signable signature field using PyMuPDF or PyHanko so that Adobe Acrobat enforces the requirement but does not lock the PDF before signing?