如何在LangChain中处理PDF表单?获取已填问卷答案
解决PDF问卷问题与填写答案同时提取的方法
PyPDFLoader默认仅提取PDF中的静态文本内容,而问卷中填写的答案通常存储在PDF表单字段中(不属于普通文本流),因此无法被直接获取。以下是几种可行的解决方案:
方法1:直接读取PDF表单字段(推荐)
使用PyPDF2库直接访问PDF的表单字段,获取每个字段对应的填写值:
from PyPDF2 import PdfReader # 加载PDF文件 reader = PdfReader("files/blo-file.pdf") # 如果PDF加密,先解密(无密码则传空字符串) if reader.is_encrypted: reader.decrypt("") # 遍历所有表单字段,输出问题/字段名和对应的答案 form_fields = reader.get_fields() for field_label, field in form_fields.items(): # 字段值存储在/V键中,默认显示"未填写" answer = field.get("/V", "未填写") print(f"问题:{field_label}") print(f"答案:{answer}\n")
这种方法适合结构化的问卷表单,能精准获取每个问题对应的填写答案。
方法2:结合LangChain与表单提取
如果需要保留LangChain的文档处理流程,可以先提取静态问题文本,再关联表单字段的答案:
from langchain.document_loaders import PyPDFLoader from PyPDF2 import PdfReader # 用LangChain提取问题文本 loader = PyPDFLoader("files/blo-file.pdf") pages = loader.load_and_split() question_content = "\n".join([page.page_content for page in pages]) # 提取表单答案 reader = PdfReader("files/blo-file.pdf") if reader.is_encrypted: reader.decrypt("") form_fields = reader.get_fields() # 关联问题与答案(若字段名与问题文本匹配) for field_label, field in form_fields.items(): answer = field.get("/V", "未填写") print(f"问题:{field_label}") print(f"答案:{answer}\n")
若表单字段名与问题文本不直接对应,可能需要手动建立映射或通过文本匹配关联内容。
方法3:OCR提取非结构化填写内容
如果答案是手写输入或直接绘制在文本框中的非表单内容,需要用OCR工具提取:
from pdf2image import convert_from_path import pytesseract # 将PDF页面转换为图片 pdf_pages = convert_from_path("files/blo-file.pdf") # 逐页执行OCR提取文本(中文问卷指定lang='chi_sim') for page_num, page_img in enumerate(pdf_pages, 1): extracted_text = pytesseract.image_to_string(page_img, lang="chi_sim") print(f"第{page_num}页提取内容:\n{extracted_text}\n")
使用前需先安装依赖:pip install pdf2image pytesseract,并安装Tesseract OCR引擎(需配置环境变量)。
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

