
一、需求背景在财务数据分析场景中经常需要从 PDF 格式的财报中提取指定的财务指标如货币资金、净利润、现金流等手动复制粘贴效率极低且易出错。本文将分享一套基于 PyPDF2 的 Python 脚本实现批量读取 PDF 文件夹中的财报文件精准提取目标财务字段对应的数值并将结果保存为文本文件大幅提升数据处理效率。二、环境准备1. 依赖包安装脚本核心依赖 PyPDF2 库实现 PDF 文本读取使用清华镜像源加速安装pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple2. 文件夹结构需在脚本运行目录下创建PDFfile文件夹将需要处理的 PDF 财报文件放入该文件夹├── pdf_extract.py # 脚本文件 └── PDFfile/ # PDF文件目录 ├── 财报1.pdf ├── 财报2.pdf └── ...三、完整代码解析1. 导入核心库import PyPDF2 # PDF文本读取核心库 import os # 路径处理 import pandas as pd # 预留数据处理扩展本文暂未使用PyPDF2负责读取 PDF 文件、提取页面文本os处理文件路径保证跨系统兼容性pandas预留扩展可后续将结果转为 DataFrame 做进一步分析。2. 路径配置与字段定义# 获取当前工作目录使用os.path.join提高路径兼容性 pwd os.getcwd() PDF_pth os.path.join(pwd, PDFfile) # 定义需要提取的财务字段分三类便于管理 field1 [货币资金,应收账款,存货,交易性金融资产, 在建工程,资产总计,应付账款,预收款项,负债合计, 合同负债,短期借款,未分配利润,所有者权益合计] field2 [现金及现金等价物净增加额,经营活动产生的现金流量净额,销售商品、提供劳务收到的现金, 投资活动产生的现金流量净额,投资支付的现金,收回投资收到的现金, 取得借款收到的现金,偿还债务支付的现金,筹资活动产生的现金流量净额] field3 [归属于母公司所有者的净利润,归属于母公司股东的净利润净亏损以“—”号填列, 归属于母公司股东的净利润净亏损以“-”号填列,归属于母公司股东的净利润, 营业外收入,营业总收入,营业成本,销售费用,管理费用, 财务费用,研发费用,税金及附加,营业总成本,营业利润亏损以“”号填列, 营业利润亏损以“-”号填列,利润总额亏损总额以“-”号填列, 利润总额亏损总额以“”号填列,资产减值损失损失以“-”号填列, 资产减值损失损失以“”号填列,信用减值损失损失以“-”号填列, 信用减值损失损失以“”号填列] # 合并所有字段如需提取全部字段可启用 all_fields field1 field2 field3 # 存储提取结果的列表 string_list []路径配置使用os.path.join替代硬编码的路径分隔符如\适配 Windows/Linux/Mac 系统字段分类将财务字段分为资产负债类field1、现金流量类field2、利润表类field3便于按需提取结果存储string_list用于暂存提取的 “文件名字段名数值” 格式结果。3. PDF 文件筛选与前置检查# 获取PDF文件列表过滤非PDF文件 PDFname [f for f in os.listdir(PDF_pth) if f.lower().endswith(.pdf)] # 检查PDF文件夹是否有文件 if not PDFname: print(警告PDFfile文件夹中未找到PDF文件) else: # 核心提取逻辑下文展开 pass过滤非 PDF 文件通过f.lower().endswith(.pdf)确保只处理 PDF 文件避免其他格式文件干扰空文件夹检查提前判断文件夹是否有 PDF 文件避免无意义的循环。4. 核心字段与数值提取逻辑本程序使用field3做为示例可以更换或者替换为all_fields提取全部# 遍历需要提取的字段示例提取利润表类字段field3可替换为all_fields for target_field in field3: # 遍历每个PDF文件 for pdf_file in PDFname: pdf_full_path os.path.join(PDF_pth, pdf_file) # 打开PDF文件with语句自动释放文件句柄 with open(pdf_full_path, rb) as file: reader PyPDF2.PdfReader(file) num_pages len(reader.pages) field_found False # 标记是否找到目标字段 # 遍历PDF每一页 for page_num in range(num_pages): page_text reader.pages[page_num].extract_text() # 查找目标字段位置 field_index page_text.find(target_field) if field_index ! -1: # 提取字段后50个字符范围内的内容覆盖数值区域 content page_text[field_index len(target_field) 1 : field_index 50] print(f找到字段【{target_field}】- 文件{pdf_file} - 内容片段{page_text[field_index:field_index50]}) # 清理内容中的空格和逗号标准化数值格式 content content.replace( , ).replace(,, ) if not content: break # 提取数字部分处理负数开头的情况 if content[0] -: num_part content[1:5] else: num_part content[:5] # 验证数字部分并提取带两位小数的数值 if num_part.isdigit(): dot_index content.find(.) if dot_index ! -1: # 确保截取到小数点后两位避免索引越界 if dot_index 3 len(content): final_value content[:dot_index3] else: final_value content[:dot_index] content[dot_index:] 0*(3 - (len(content)-dot_index)) # 存储结果文件名:字段名:数值 string_list.append(f{pdf_file}:{target_field}:{final_value}) field_found True break # 找到后退出当前PDF页面遍历 if field_found: continue # 找到后退出当前PDF文件遍历关键逻辑说明多层循环字段→PDF 文件→PDF 页面逐层遍历确保不遗漏字段定位通过page_text.find(target_field)找到字段在页面文本中的位置数值截取提取字段后 50 个字符覆盖数值区域清理空格 / 逗号等干扰字符负数处理单独判断以-开头的数值避免误判非数字小数补位确保数值保留两位小数如123.4补为123.40保证格式统一提前终止找到字段后通过break终止后续循环提升效率。5. 结果输出与保存# 输出最终提取结果 print(\n 最终提取结果 ) for result in string_list: print(result) # 保存结果到txt文件 with open(pdf_extract_result.txt, w, encodingutf-8) as f: for line in string_list: f.write(line \n) print(\n结果已保存至 pdf_extract_result.txt)控制台输出直观展示提取结果便于调试文件保存将结果写入pdf_extract_result.txt便于后续数据分析使用。四、控制台输出示例1. 运行过程输出找到字段【归属于母公司所有者的净利润】- 文件2024财报.pdf - 内容片段归属于母公司所有者的净利润 123456.78 万元 找到字段【营业总收入】- 文件2024财报.pdf - 内容片段营业总收入 987654.32 万元 找到字段【财务费用】- 文件2024财报.pdf - 内容片段财务费用 -12345.67 万元 最终提取结果 2024财报.pdf:归属于母公司所有者的净利润:123456.78 2024财报.pdf:营业总收入:987654.32 2024财报.pdf:财务费用:-12345.67 结果已保存至 pdf_extract_result.txt2. 异常提示输出如无 PDF 文件警告PDFfile文件夹中未找到PDF文件 最终提取结果 结果已保存至 pdf_extract_result.txt五、生成的 txt 文件内容示例pdf_extract_result.txt文件内容2024财报.pdf:归属于母公司所有者的净利润:123456.78 2024财报.pdf:营业总收入:987654.32 2024财报.pdf:财务费用:-12345.67 2023财报.pdf:归属于母公司所有者的净利润:112233.44 2023财报.pdf:营业总收入:876543.21六、功能扩展建议支持更多字段将for target_field in field3改为for target_field in all_fields即可提取资产负债、现金流、利润表全量字段结果格式化结合 pandas 将string_list转为 DataFrame输出为 Excel 文件更便于财务分析批量去重对同一字段在多个 PDF 中的重复提取结果做去重处理异常兼容可新增 PDF 文件损坏、字段无数值等异常的处理逻辑本文为简化未添加。七、总结本脚本基于 PyPDF2 实现了 PDF 财务报表指定字段数值的批量提取核心优势在于跨系统兼容使用os.path.join处理路径适配不同操作系统高效提取找到字段后立即终止循环避免无效遍历格式统一自动处理负数、补全两位小数保证数值格式规范结果留存控制台输出 文件保存便于后续核对与分析。