如何提取Adobe PDF表单控件位置属性,可使用Python实现吗
实现PDF表单控件位置提取的Python方案
完全可以通过Python实现该需求,以下是两种成熟的实现方案:
方案1:使用PyMuPDF(推荐,对表单控件的适配更完善
PyMuPDF(库导入名为fitz,可以直接识别所有主流表单控件类型,直接返回标准位置坐标
安装命令
pip install pymupdf
示例代码
import fitz def extract_form_fields(pdf_path): doc = fitz.open(pdf_path) form_fields = [] # 遍历PDF所有页 for page_num, page in enumerate(doc, 1): # 遍历当前页所有表单控件 for field in page.widgets(): field_info = { "page_number": page_num, # 控件类型,直接返回可读文本 "field_type": fitz.widget_types[field.field_type], "field_name": field.field_name, # 位置坐标格式:(左上x, 左上y, 右下x, 右下y),单位为PDF标准点 "position": field.rect, # 控件当前填充/选中状态,可选返回 "current_value": field.field_value } form_fields.append(field_info) return form_fields # 调用示例 fields = extract_form_fields("你的PDF文件路径.pdf") for item in fields: print(item)
可识别的控件类型对应关系:
- 文本输入框:
Text - 复选框:
CheckBox - 单选按钮:
RadioButton - 列表框:
ListBox - 下拉选择框:
ComboBox
方案2:使用PyPDF2实现
如果习惯用PyPDF2生态也可以实现,需要自行解析控件子类型
安装命令
pip install pypdf2
示例代码
from PyPDF2 import PdfReader def extract_form_fields_pypdf2(pdf_path): reader = PdfReader(pdf_path) form_fields = [] for page_num, page in enumerate(reader.pages, 1): if "/Annots" not in page: continue annots = page["/Annots"] for annot in annots: annot_obj = annot.get_object() # 筛选表单控件类注解 if annot_obj.get("/Subtype") == "/Widget": field_info = { "page_number": page_num, "field_name": annot_obj.get("/T").decode() if annot_obj.get("/T") else None, # 位置坐标格式:[x0, y0, x1, y1] "position": annot_obj.get("/Rect"), "field_type_flag": annot_obj.get("/FT") } form_fields.append(field_info) return form_fields
控件类型标识对应:
- 文本框:
/Tx - 按钮类(复选框、单选按钮都属于该大类,可通过额外字段细分):
/Btn - 选择类(列表框、下拉框都属于该大类):
/Ch
注意事项
- PDF默认坐标原点在页面左下角,如果你需要转换为左上角为原点的坐标,用对应页面的高度减去y轴坐标值换算即可
- 加密的PDF需要先提供密码解密后再提取,上述两个库都支持标准PDF解密功能。
内容的提问来源于stack exchange,提问作者dsmalenb
相关产品推荐
相关产品推荐

