最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to add a form field to an existing pdf with python - Stack Overflow

programmeradmin2浏览0评论

I've been tasked with creating python script that will add a form field to an existing pdf file. Seemed rather straight forward but I've hit a wall. The form field is being added (apparently not correctly) but it simply doesn't show up when I open the pdf. Neither the form title nor it's text data is visible. Any guidance on this would be greatly appreciated. The current version of the notebook i'm using is:

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)
发布评论

评论列表(0)

  1. 暂无评论