So fügen Sie mit Python ein Formularfeld zu einem vorhandenen PDF hinzuPython

Python-Programme
Guest
 So fügen Sie mit Python ein Formularfeld zu einem vorhandenen PDF hinzu

Post by Guest »

Ich wurde damit beauftragt, ein Python-Skript zu erstellen, das ein Formularfeld zu einer vorhandenen PDF-Datei hinzufügt. Schien ziemlich geradlinig, aber ich bin an eine Wand gestoßen. Das Formularfeld wird hinzugefügt (anscheinend nicht korrekt), aber es wird einfach nicht angezeigt, wenn ich das PDF öffne. Weder der Formulartitel noch die Textdaten sind sichtbar. Für jede diesbezügliche Anleitung wären wir sehr dankbar. Die aktuelle Version des Notebooks, das ich verwende, ist:

Code: Select all

import PyPDF2
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import (
NameObject, DictionaryObject, ArrayObject, FloatObject, TextStringObject
)

def add_form_field_to_pdf(input_pdf_path, output_pdf_path, field_name, field_x, field_y, field_width, field_height, page_number=0):

# Read the input PDF
reader = PdfReader(input_pdf_path)
writer = PdfWriter()
set_need_appearances_writer(writer)
# Copy pages from the original PDF to the writer
for page in reader.pages:
writer.add_page(page)

# Get the specified page
page = writer.pages[page_number]

# Create a new AcroForm if it doesn't exist
if "/AcroForm" not in writer._root_object:
writer._root_object.update({
NameObject("/AcroForm"): DictionaryObject({
NameObject("/Fields"): ArrayObject()
})
})

# Define the form field
field = DictionaryObject()
field.update({
NameObject("/FT"): NameObject("/Tx"),  # Text field type
NameObject("/T"): TextStringObject(field_name),  # Field name
NameObject("/Rect"): ArrayObject([  # Field rectangle
FloatObject(field_x),
FloatObject(field_y),
FloatObject(field_x + field_width),
FloatObject(field_y + field_height)
]),
NameObject("/V"): TextStringObject("Hello"),  # Default value
NameObject("/Ff"): FloatObject(0),  # Field flags
NameObject("/P"): page  # Page where the field is located
})

# Add the field to the AcroForm
acro_form = writer._root_object["/AcroForm"]
fields = acro_form["/Fields"]
fields.append(field)

# Write the modified PDF to a new file
with open(output_pdf_path, "wb") as output_file:
writer.write(output_file)

def set_need_appearances_writer(writer):

try:
catalog = writer._root_object
# get the AcroForm tree and add "/NeedAppearances attribute
if "/AcroForm" not in catalog:
writer._root_object.update(
{
NameObject("/AcroForm"): DictionaryObject(
len(writer._objects), 0, writer
)
}
)

need_appearances = NameObject("/NeedAppearances")
writer._root_object["/AcroForm"][need_appearances] = BooleanObject(True)
return writer

except Exception as e:
print("set_need_appearances_writer() catch : ", repr(e))
return writer

input_pdf = "sampleForm.pdf"
output_pdf = "FormAttemp-2.pdf"

add_form_field_to_pdf(input_pdf, output_pdf, "SampleField4", 100, 500, 200, 20)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post