Python PDF数据提取问题:提取全页数据及筛选导出至Excel方法咨询
问题解决与优化方案
一、修复仅提取第一页的问题
你的代码核心问题是return pdf_text写在了for page in reader.pages循环内部,导致循环执行第一次(处理第一页)就直接返回结果,后续页面根本没机会处理。另外代码里的subprocess.call(['test', 'forms.pdf', 'output'])属于无意义的冗余代码,建议直接删除。
修改后可提取所有页面的基础代码:
import PyPDF2 def extract_text_from_pdf(pdf_file: str) -> list[str]: with open(pdf_file, 'rb') as pdf: reader = PyPDF2.PdfReader(pdf, strict=False) pdf_text = [] for page in reader.pages: content = page.extract_text() if content: # 跳过空内容页面 pdf_text.append(content) # 将return移到循环外部,确保所有页面处理完成后再返回 return pdf_text if __name__ == '__main__': extracted_text = extract_text_from_pdf('test.pdf') for idx, text in enumerate(extracted_text, 1): print(f"第{idx}页内容:\n{text}\n{'='*50}")
二、添加特殊字符筛选功能
可以在提取文本后增加过滤逻辑,精准提取包含指定特殊字符(如$、@、#)的内容片段。以下是筛选包含$字符的示例代码:
import PyPDF2 def extract_text_from_pdf(pdf_file: str, special_char: str = None) -> list[str]: filtered_text = [] with open(pdf_file, 'rb') as pdf: reader = PyPDF2.PdfReader(pdf, strict=False) for page_num, page in enumerate(reader.pages, 1): content = page.extract_text() if not content: continue # 若指定特殊字符,只保留包含该字符的行 if special_char: lines = content.split('\n') matched_lines = [line.strip() for line in lines if special_char in line] if matched_lines: filtered_text.append(f"第{page_num}页匹配内容:\n" + '\n'.join(matched_lines)) else: filtered_text.append(f"第{page_num}页内容:\n{content}") return filtered_text if __name__ == '__main__': # 提取包含$的内容 extracted_text = extract_text_from_pdf('test.pdf', special_char='$') for text in extracted_text: print(text + '\n' + '='*50)
三、导出结果到Excel文件
使用pandas库可以快速将提取内容导出为Excel文件,先安装依赖:pip install pandas openpyxl
完整功能代码:
import PyPDF2 import pandas as pd def extract_text_from_pdf(pdf_file: str, special_char: str = None) -> list[dict]: result_data = [] with open(pdf_file, 'rb') as pdf: reader = PyPDF2.PdfReader(pdf, strict=False) for page_num, page in enumerate(reader.pages, 1): content = page.extract_text() if not content: continue page_content = "" if special_char: lines = content.split('\n') matched_lines = [line.strip() for line in lines if special_char in line] page_content = '\n'.join(matched_lines) else: page_content = content # 用字典存储每页数据,方便转换为表格格式 result_data.append({ "页码": page_num, "内容": page_content }) return result_data if __name__ == '__main__': # 提取包含$的内容并导出到Excel extracted_data = extract_text_from_pdf('test.pdf', special_char='$') df = pd.DataFrame(extracted_data) df.to_excel('提取结果.xlsx', index=False, engine='openpyxl') print("导出完成,文件名为:提取结果.xlsx")
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

