开发者

使用Python实现自动填写PDF表格

实际应用场景中,我们会遇到需要根据会话内容自动填写表格的情况,比如:pdf 表格。假设根据会话内容已经获得相关信息,下面以填写个人信息为例来说明。

个人信息表格.pdf

使用Python实现自动填写PDF表格

填写后的效果:

使用Python实现自动填写PDF表格

填写代码如下:

from pdfrw import PdfReader, PdfWriter
import traceback

# 针对“个人信息表.pdf”性别字段,尝试更可能的键名(单选按钮常用命名)
data = {
    "(full_name)": "李四",
    "(sex_male)": "男",  # 推测性别为单选按钮,可能用“sex_male”表示“男”选项
    "(birth_date)": "1985年8月15日",
    "(id_card)": "310104198508152345",
    "(phone)": "13987654321",
    "(email)": "lisi1985@qq.com",
    "(address)": "上海市徐汇区淮海中路789号2号楼1003室"
}

try:
    input_pdf_path = "个人信息表.pdf"
    input_pdf = PdfReader(input_pdf_path)
    print(f"✅ 成功读取文件:{input_pdf_path}")
    print(f" 该PDF包含 {len(input_pdf.pages)} 页")

    found_fields = []
    missing_fields = list(data.keys())

    for page_num, page in enumerate(input_pdf.pages, 1):
        print(f"\n--- 处理第 {page_num} 页 ---")
        if not page.Annots:
            print("⚠️ 此页面无表单字段")
            continue

        for annot in page.Annots:
            raw_field_name = annot.T.strip() if (annot.T and hasattr(annot.T, 'strip')) else None
            if not raw_field_name:
                print("⚠️ 发现无名字段,跳过")
                continue

            print(f" 发现字段:{raw_field_nwww.devze.comame}")
            found_fields.append(raw_field_name)

            if raw_field_name in data:
                annot.V = data[raw_field_name]
                print(f"✏️ 已为字段 [{raw_field_name}] 赋值:{data[raw_field_name]}")
                missing_fields.remove(raw_fiewww.devze.comld_name)
            else:
                print(f"ℹ️ 字段 [{raw_field_name}] 不在待填python充数据中,跳过")

    print("\n--- 填充结果总结 ---")
    print(f"✅ 成功填充的字段:{found_fields}")
    if missing_fields:
        print(f"❌ 未找到的字段:{missing_fields}(可尝试(sex_female)、(gender_m)等,或用PDF工具直接查看性别字段名)")
    else:
        print("✅ 所有字段(含性别)均已填充完成")

    output_pdf_path = "填写完成的个人信息表.pdf"
    output_pdf = PdfWriter()
    output_pdf.addpages(input_pdf.pages)
    with open(output_pdf_path, "wb") as f:
        output_pdf.write(f)
    print(f"\n 已保存到:{output_pdf_path}")

except Exception as e:
    print(f"\n❌ 处理出错:{str(e)}")
    traceback.print_exc()

个人信息表格.pdf生成代码如下:

from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors

# 注册MAC系统预装的STHeiti pythonLight字体
# 字体路径为macOS默认路径,无需额外安装
font_path = "/System/Library/Fonts/STHeiti Light.ttc"
font_name = "STHeitiLight"  # 自定义字体名称用于引用
pdfmetrics.registerFont(TTFont(font_name, font_path))

# 表单字段使用PDF标准字体(避免非标准字体导致的表单错误)
form_font_name = "Helvetica"

# 初始化PDF画布
c = canvas.Canvas("个人信息表.pdf", pagesize=A4)
width, height = A4  # A4尺寸:宽595,高842

# 绘制标题(使用STHeiti Light字体,中文正常显示)
c.setFont(font_name, 16)
c.drawCentredString(width/2, height-50, "个人信息登记表")
c.setFont(font_name, 12)  # 恢复标签字体大小

y_position = height - 100  # 起始Y坐标
spacing = 40  # 行间距


# 1. 姓名
c.drawString(100, y_position, "1. 姓名:")  # 中文标签用STHeiti Light
c.acroForm.textfield(
    name="full_name",
    x=200, y=y_position-20,
    width=200, height=20,
    borderColor=colors.black,
    fillColor=colors.white,
    fontName=form_font_name  # 表单字段用标准字体
)
y_position -= spacing


# 2. 性别(单选按钮组)
c.drawString(100, y_position, "2. 性别:")
c.acroForm.radio(
    name="gender",
    value="male",
    x=200, y=y_position-10,
    size=10
)
c.drawString(220, y_position, "男")  # 中文选项用STHeiti Light

c.acroForm.radio(
    name="gender",
    value="female",
    x=280, y=y_position-10,
    size=10
)
c.drawString(300, y_position, "女")
y_position -= spacing


# 3. 出生日期
c.drawString(100, y_position, "3. 出生日期:")
c.acroForm.textfield(
    name="birth_dahttp://www.devze.comte",
    x=200, y=y_position-20,
    width=200, height=20,
    borderColor=colors.black,
    fontName=form_font_name
)
y_position -= spacing


# 4. 身份证号
c.drawString(100, y_position, "4. 身份证号:")
c.acroForm.textfield(
    name="id_card",
    x=200, y=y_position-20,
    width=300, height=20,
    borderColor=colors.black,
    fontName=form_font_name
)
y_position -= spacing


# 5. 联系电话
c.drawString(100, y_position, "5. 联系电话:")
c.acroForm.textfield(
    name="phone",
    x=200, y=y_position-20,
    width=200, height=20,
    borderColor=colors.black,
    fontName=form_font_name
)
y_position -= spacing


# 6. 电子邮箱
c.drawString(100, y_position, "6. 电子邮箱:")
c.acroForm.textfield(
    name="email",
    x=200, y=y_position-20,
    width=300, height=20,
    borderColor=colors.black,
    fontName=form_font_name
)
y_position -= spacing


# 7. 居住地址
c.drawString(100, y_position, "7. 居住地址:")
c.acroForm.textfield(
    name="address",
    x=200, y=y_position-20,
    width=350, height=20,
    borderColor=colors.black,
    fontName=form_font_name
)
y_position -= spacing


# 保存PDF
c.save()
print("个人信息表已生成:个人信息表.pdf")
    

到此这篇关于使用python实现自动填写PDF表格的文章就介绍到这了,更多相关Python自动填写PDF内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜