如何用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
相关产品推荐
相关产品推荐

