如何使用pypdf提取指定PDF页面数据并导出为CSV?
从PDF第4-605页提取数据并转CSV的Python方案
第一步:安装所需依赖
在终端运行以下命令:
pip install pypdf pandas
第二步:完整可运行代码
将代码保存为pdf_to_csv.py,替换your_pdf_file.pdf为你的PDF文件路径:
from pypdf import PdfReader import pandas as pd import re def clean_valor(text): # 统一VALOR列格式:去掉所有非数字字符,空值返回None if not text or text.strip() == "": return None cleaned = re.sub(r'[^\d]', '', text.strip()) return int(cleaned) if cleaned else None def extract_pdf_to_csv(pdf_path, start_page=4, end_page=605, output_csv="output.csv"): # 初始化PDF阅读器 reader = PdfReader(pdf_path) # 转换页码:pypdf从0开始索引,第4页对应索引3,第605页对应索引604 start_idx = start_page - 1 end_idx = end_page - 1 all_data = [] # 遍历指定页码范围 for page_num in range(start_idx, end_idx + 1): page = reader.pages[page_num] text = page.extract_text() if not text: continue # 按行分割文本(若PDF行分隔符为\n\r可自行调整) lines = text.split('\n') for line in lines: line = line.strip() if not line: continue # 按多空格拆分列(若PDF用其他分隔符,比如竖线,修改正则即可) columns = re.split(r'\s{2,}', line) # 补全空列(假设固定5列,可根据实际调整) while len(columns) < 5: columns.append(None) # 清洗VALOR列(假设是第3列,索引2,根据实际位置修改) if len(columns) > 2: columns[2] = clean_valor(columns[2]) all_data.append(columns) # 转为DataFrame并设置列名(替换成你的实际列名) df = pd.DataFrame(all_data, columns=["COLUMN1", "COLUMN2", "VALOR", "COLUMN4", "COLUMN5"]) # 删除全空行,保留部分空值的行 df = df.dropna(how='all') # 导出CSV df.to_csv(output_csv, index=False, encoding='utf-8-sig') print(f"数据已导出到 {output_csv}") # 调用函数 extract_pdf_to_csv("your_pdf_file.pdf")
关键部分说明
- 页码适配:pypdf的页面索引从0开始,代码已自动转换用户输入的页码范围。
- VALOR列清洗:不管是带点、空格的格式,都会被转换成纯数字,空值保留为
None。 - 列拆分逻辑:默认用多空格拆分列,若你的PDF用其他分隔符(比如制表符、竖线),修改
re.split的正则表达式即可。 - 空值处理:自动删除全空的行,部分空值的行会保留,你也可以用
df.fillna("")将空值替换为空字符串。
注意事项
- 如果PDF是扫描件(图片格式),pypdf无法提取文本,需要用OCR工具(比如pytesseract)处理。
- 必须根据你的实际PDF结构,修改列名和VALOR列的索引位置(比如VALOR是第4列就改成
columns[3])。 - 确保PDF文件路径正确,且有读取权限。
内容的提问来源于stack exchange,提问作者Michael Picazo
相关产品推荐
相关产品推荐

