You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取PDF问卷复选框选中状态并导入Pandas?

提取PDF复选框选中状态并导入Pandas的解决方案

你用PyPDF2的getFields()方法返回的字典里,每个字段的详细属性(包括复选框选中状态)藏在嵌套结构中,直接转成DataFrame时未展开,所以看不到选中状态。以下是修正后的实现方法:

1. 解析PyPDF2返回的字段结构

getFields()返回的每个字段是嵌套字典,其中:

  • /V 代表复选框的实际值,默认选中时为/Yes,未选中通常是/Off或该字段不存在;
  • /AS 代表外观状态,和/V对应,选中时一般也是/Yes;
  • /FT 为/Btn且/Ff属性包含1<<15(复选框标志)时,说明这是一个复选框字段。

2. 修正后的PyPDF2代码实现

import PyPDF2
import pandas as pd

PDF_Path = "你的问卷文件路径.pdf"

pdfFileObj = open(PDF_Path, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
fields = pdfReader.getFields()

# 整理复选框数据
checkbox_data = []
for field_name, field_props in fields.items():
    # 判断当前字段是否为复选框
    if field_props.get('/FT') == '/Btn' and (field_props.get('/Ff', 0) & (1 << 15)):
        # 判断选中状态:默认以/V为/Yes作为选中依据
        is_checked = field_props.get('/V') == '/Yes'
        checkbox_data.append({
            "字段名称": field_name,
            "是否选中": is_checked,
            "原始字段值": field_props.get('/V'),
            "外观状态": field_props.get('/AS')
        })

# 转换为DataFrame
df_checkboxes = pd.DataFrame(checkbox_data)
print(df_checkboxes)

3. 复杂表单替代方案:使用PyMuPDF(fitz)

如果你的问卷PDF由不同工具生成(如WPS、自定义表单),PyPDF2可能解析不全,推荐用PyMuPDF,它对表单字段的兼容性更好:

import fitz
import pandas as pd

PDF_Path = "你的问卷文件路径.pdf"

doc = fitz.open(PDF_Path)
checkbox_data = []

# 遍历每页提取复选框
for page in doc:
    widgets = page.widgets()
    for widget in widgets:
        if widget.field_type == fitz.PDF_WIDGET_TYPE_CHECKBOX:
            checkbox_data.append({
                "字段名称": widget.field_name,
                "是否选中": widget.field_value,
                "所在页面": page.number + 1,
                "字段位置": widget.rect
            })

df_checkboxes = pd.DataFrame(checkbox_data)
print(df_checkboxes)

注意事项

不同PDF生成工具的复选框值可能有差异,比如部分自定义表单会用True/False作为选中值,你可以根据实际返回的/V或field_value调整判断逻辑。

内容的提问来源于stack exchange,提问作者Moritz Uthe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:57:24