如何填写PDF表格的例子

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

个人信息表格.pdf

填写后的效果:

填写代码如下:

from pdfrw import PdfReader, PdfWriter
import tracebackdef fill_personal_info_form(input_path, output_path):# 待填充数据(匹配文档中的字段项)text_data = {"(full_name)": "李四",  # 对应文档中“1. 姓名”"(birth_date)": "1985年8月15日",  # 对应“3. 出生日期”"(id_card)": "310104198508152345",  # 对应“4. 身份证号”"(phone)": "13987654321",  # 对应“5. 联系电话”"(email)": "lisi1985@qq.com",  # 对应“6. 电子邮箱”"(address)": "上海市徐汇区淮海中路789号2号楼1003室"  # 对应“7. 居住地址”}# 性别单选按钮组目标值(对应文档中“2. 性别”的“男”)male_value = "male"try:input_pdf = PdfReader(input_path)print(f"✅ 成功读取文件:{input_path}")print(f"📄 包含 {len(input_pdf.pages)} 页")found_fields = []unnamed_annot_count = 0  # 计数无名字段(性别单选按钮组)gender_male_assigned = False  # 标记“男”是否已选中for page_num, page in enumerate(input_pdf.pages, 1):print(f"\n--- 处理第 {page_num} 页 ---")if not page.Annots:print("⚠️ 无表单字段")continuefor annot in page.Annots:# 提取字段名(文本框有明确名称,性别单选按钮可能无名称)raw_field_name = annot.T.strip() if (annot.T and hasattr(annot.T, 'strip')) else None# 处理文本框字段(匹配文档中的姓名、出生日期等)if raw_field_name:if raw_field_name in text_data:annot.V = text_data[raw_field_name]  # 文本框用V属性赋值found_fields.append(raw_field_name)print(f"✏️ 已填充 [{raw_field_name}]:{text_data[raw_field_name]}")else:print(f"ℹ️ 跳过字段 [{raw_field_name}]")# 处理无名字段(性别单选按钮组,文档中含“男”“女”)else:unnamed_annot_count += 1print(f"⚠️ 无名字段(序号:{unnamed_annot_count})")# 第1个无名字段设为“男”(选中),用AS属性控制单选按钮状态if not gender_male_assigned and unnamed_annot_count == 1:annot.AS = male_value  # 单选按钮用AS属性设置选中状态gender_male_assigned = Trueprint(f"✏️ 已选中第{unnamed_annot_count}个无名字段(男)")# 第2个无名字段设为“女”(未选中)elif unnamed_annot_count == 2:annot.AS = None  # 确保“女”未选中print(f"✏️ 第{unnamed_annot_count}个无名字段(女)设为未选中")# 填充结果总结print("\n--- 结果总结 ---")print(f"✅ 成功填充:{found_fields}")print(f"✅ 性别“男”选中状态:{'已选中' if gender_male_assigned else '未选中'}")# 保存文件output_pdf = PdfWriter()output_pdf.addpages(input_pdf.pages)with open(output_path, "wb") as f:output_pdf.write(f)print(f"\n💾 保存至:{output_path}")except Exception as e:print(f"\n❌ 错误:{str(e)}")traceback.print_exc()# 执行填充(输入输出路径可修改)
fill_personal_info_form(input_path="个人信息表.pdf",output_path="填写完成的个人信息表.pdf"
)

个人信息表格.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 Light字体
# 字体路径为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 Lightc.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_date",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")

注意:性别竟然找不到对应的(gender),需要特殊处理。

环境为masOS,其它系统字体设置会有所差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91798.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年影响重大的网络安全典型案例

以下是2023年影响重大的网络安全典型案例,按时间顺序梳理事件经过及技术细节:---一、DeFi协议攻击:dForce借贷协议遭入侵(2023年4月)** - 时间线: - 4月19日08:58:黑客开始攻击Lendf.Me合约&…

Vue 响应式基础全解析2

DOM更新时机 修改响应式状态后,DOM更新不是同步的。Vue会缓冲所有修改,在"next tick"周期中统一更新,确保每个组件只更新一次。 如需在DOM更新后执行代码,可使用nextTick(): import {nextTick } from vueasync function increment() {count.value++

【黑马SpringCloud微服务开发与实战】(九)elasticsearch基础

1. 认识elasticsearch2. 认识和安装ES主播这里之前已经安装好了,资料包里面有镜像 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugin…

由浅入深地讲清楚浏览器缓存

一、什么是浏览器缓存?(入门级) 1. 浏览器缓存的定义浏览器缓存就是:浏览器把之前请求过的资源保存起来,下次访问同样的资源时可以直接用本地副本,而不是重新请求服务器。举个生活例子: 你第一次…

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select 1. 概述 I/O 多路复用是现代高性能网络编程的核心技术,它允许单个线程同时监视多个文件描述符的状态变化,从而实现高效的并发处理。Linux 提供了多种 I/O 多路复用机制&#xff0c…

高防服务器租用:保障数据安全

您的网络速度是否卡顿,业务是否经常受到网络攻击的威胁呢?别担心,高防服务器租用能够帮助你解决这些困扰!高防服务器租用拥有着卓越的防御能力,可以帮助企业抵御各种网络攻击,能够轻松化解各种超大流量的网…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用

基于卫星或无人机平台的多光谱数据在地质、土壤调查和农业等应用领域发挥了重要作用,在地质应用方面,综合Aster的短波红外波段、landsat热红外波段等多光谱数据,可以通过不同的多光谱数据组合,协同用于矿物信息有效提取。第一&…

CSS content-visibility:提升页面渲染性能的 “智能渲染开关”

在前端开发中,你是否遇到过这样的问题:页面包含大量 DOM 元素(如长列表、复杂表格)时,滚动变得卡顿,交互响应迟缓?这往往是因为浏览器需要不断渲染屏幕外的元素,浪费了大量计算资源。…

Javascript面试题及详细答案150道之(016-030)

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

仿真电路:(十七下)DC-DC升压压电路原理简单仿真

1.前言 升压的环境用的没降压的多,但是升压会用在LED的很多电路上,所以理解一下原理 2.DC-DC升压原理简单仿真 升压原理 下面还是对升压进行简单的仿真 拓扑结构以及原理和降压还是很相似的,只是位置不太一样,过程推导就不推导…

ros2--source

setup脚本类型 install下面会有几个setup.xxx的shell脚本。 setup.bash setup.ps1 setup.sh setup.zsh 什么区别呢 文件名 Shell 类型 适用场景 setup.bash Bash (Linux/macOS) 标准 Linux/macOS 终端(默认使用) setup.sh 通用 Shell 兼容性更广,但功能可能受限 setu…

40.MySQL事务

1.事务的作用事务用于保证数据的一致性,它由一组相关的 dml (update delete insert) 语句组成,该组的 dml (update delete insert) 语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。假…

java导入pdf(携带动态表格,图片,纯java不需要模板)

java导出pdf文件一、介绍二、准备三、实现效果四、代码一、介绍 上一篇文章(java使用freemarker操作word(携带动态表格,图片))https://blog.csdn.net/weixin_45853881/article/details/129298494 紧跟上文&#xff0c…

【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?

开发dropdown组件填坑之hideDelay 引言 在开发下拉菜单(dropdown)或弹出框(popover)组件时,一个常见的用户体验问题就是鼠标移出触发区域后,弹出内容立即消失,这会导致用户无法移动到弹出内容上…

Linux I/O 函数完整清单

Linux I/O 函数完整清单 1. 基础 I/O 函数 1.1 基本读写 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定读写 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…

面经——电子电路技术知识详解

电子电路技术知识详解 目录 德摩根定律周期性矩形波产生方法自激振荡器原理与设计晶体管温度效应分析反向饱和电流影响因素放大电路负反馈类型判断正弦波90相移电路直接耦合放大器的缺点二阶有源低通滤波器分析开关电源与线性电源对比 德摩根定律 德摩根定律&#xff08;De …

docker 安装 gitlab

null文章浏览阅读445次。问题&#xff1a;运行 docker run hello-world 报错。原因&#xff1a;原镜像源网络不稳定。https://blog.csdn.net/sszdzq/article/details/145733419 镜像获取 在线下载 docker pull gitlab/gitlab-ce:17.11.1-ce.0 离线获取 创建运行 sudo docke…

PHP中的日期/时间处理之Carbon组件

日常开发中&#xff0c;我们会经常用到日期和时间的操作&#xff0c;但官方的一般操作比较复杂&#xff0c;需要大量的时间进行格式化问题和大量计算等等。Carbon组件 可以帮助我们在 PHP 开发中处理日期/时间变得更加简单、更语义化&#xff0c;从而使得我们的代码更容易阅读和…

学习嵌入式第十八天

文章目录1.数据结构1.概念2.衡量代码质量和效率1.时间复杂度2.空间复杂度3.数据结构分类1.逻辑结构2.存储结构3.常见的数据结构2.链表1.与顺序表的区别2.链表分类1.单向链表1.定义链表节点类型2.空链表的创建3.链表的头插法4.链表的遍历5.链表元素删除3.makefile习题1.数据结构…

基于SpringBoot+Vue实现校园商铺系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…