LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Python一键读取PDF表格到Excel!打工人必备,告别复制粘贴​

admin
2025年8月28日 1:54 本文热度 16

作为财务、审计、数据分析的打工人,你是否经常遇到这样的场景:收到几十页的PDF报告,需要手动复制其中的表格到Excel,稍有不慎就错位乱码,加班到深夜……

本文用 5个真实案例 + 10段即用代码,教你用Python实现PDF表格全自动提取→清洗→导出Excel,从此告别复制粘贴!文末附完整工具包。

一、PDF表格提取的三大痛点

  1. 格式混乱
    :合并单元格、文字换行、空白填充
  2. 中文乱码
    :PDF编码与Python默认编码冲突
  3. 扫描件难题
    :图片型PDF无法直接读取(需OCR,文末附方案)

二、工具链:pdfplumber + pandas

2.1 环境准备

# 安装核心库(注意pdfplumber的版本)  pip install pdfplumber pandas openpyxl  

2.2 核心工具说明

  • pdfplumber
    :精准提取PDF文本、表格、坐标信息
  • pandas
    :数据清洗、合并、导出Excel
  • openpyxl
    :处理Excel复杂格式(如合并单元格)

三、基础案例:提取简单表格

案例1:单页PDF → 单Sheet Excel

目标:将如下结构的销售数据表提取到Excel(无需图片,直接模拟数据):

PDF表格示例

产品   销量  单价  销售额  
手机   100  2000 200000  
笔记本 50   5000 250000  

import pdfplumber  import pandas as pd  
def pdf_to_excel(pdf_path, excel_path):      with pdfplumber.open(pdf_path) as pdf:          first_page = pdf.pages[0]          table = first_page.extract_table()          df = pd.DataFrame(table[1:], columns=table[0])          df.to_excel(excel_path, index=False)  
# 生成测试PDF(仅需运行一次)  from fpdf import FPDF  pdf = FPDF()  pdf.add_page()  pdf.set_font("Arial", size=12)  pdf.cell(20010, txt="产品   销量  单价  销售额", ln=True)  pdf.cell(20010, txt="手机   100  2000 200000", ln=True)  pdf.cell(20010, txt="笔记本 50   5000 250000", ln=True)  pdf.output("sales.pdf")  
# 调用函数  pdf_to_excel("sales.pdf""sales.xlsx")  

输出Excel效果

产品
销量
单价
销售额
手机
100
2000
200000
笔记本
50
5000
250000

四、进阶案例:处理复杂表格

案例2:多页PDF → 多Sheet Excel

目标:将年报中的多页表格合并到一个Excel的不同Sheet

def multi_page_to_excel(pdf_path, excel_path):      with pdfplumber.open(pdf_path) as pdf:          with pd.ExcelWriter(excel_path, engine='openpyxl'as writer:              for i, page in enumerate(pdf.pages):                  table = page.extract_table()                  if table:                      df = pd.DataFrame(table[1:], columns=table[0])                      df.to_excel(writer, sheet_name=f"Sheet_{i+1}", index=False)  
# 生成测试PDF(含两页)  pdf = FPDF()  for _ in range(2):      pdf.add_page()      pdf.cell(20010, txt="产品   销量  单价  销售额", ln=True)      pdf.cell(20010, txt="手机   100  2000 200000", ln=True)  pdf.output("multi_page.pdf")  
multi_page_to_excel("multi_page.pdf""multi_page.xlsx")  

案例3:处理合并单元格

目标:提取如下结构的合并单元格表格:

PDF表格示例

地区   城市   销售额  
华东   上海   500  
       杭州   300  

def handle_merged_cells(pdf_path):      with pdfplumber.open(pdf_path) as pdf:          page = pdf.pages[0]          table = page.extract_table({              "vertical_strategy""lines",              "horizontal_strategy""lines"          })          df = pd.DataFrame(table)          df.iloc[1:30] = df.iloc[00]  # 合并第一列          return df  
# 生成测试PDF  pdf = FPDF()  pdf.add_page()  pdf.set_font("Arial", size=12)  pdf.cell(20010, txt="地区   城市   销售额", ln=True)  pdf.cell(20010, txt="华东   上海   500", ln=True)  pdf.cell(20010, txt="       杭州   300", ln=True)  pdf.output("merged.pdf")  
df = handle_merged_cells("merged.pdf")  df.to_excel("merged.xlsx")  

输出Excel效果

地区
城市
销售额
华东
上海
500

杭州
300

案例4:处理扫描件PDF(OCR方案)

目标:图片型PDF的文字识别

from pdf2image import convert_from_path  import pytesseract  import cv2  import numpy as np  
def ocr_pdf_table(pdf_path):      images = convert_from_path(pdf_path, 500)      all_dfs = []      for img in images:          img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)          gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)          _, thresh = cv2.threshold(gray, 150255, cv2.THRESH_BINARY)          text = pytesseract.image_to_string(thresh)          # 解析文本为表格          rows = [line.split() for line in text.split('\n') if line.strip()]          df = pd.DataFrame(rows[1:], columns=rows[0])          all_dfs.append(df)      return pd.concat(all_dfs)  
# 生成测试图片型PDF(需提前截图为PDF)  # 假设扫描件内容与案例1相同  final_df = ocr_pdf_table("scanned.pdf")  final_df.to_excel("scanned_output.xlsx")  

五、避坑指南:常见问题解决

5.1 中文乱码问题

with pdfplumber.open(pdf_path, encoding="UTF-8"as pdf:      ...  df.to_excel("output.xlsx", encoding="utf-8-sig")  

5.2 表格错位校正

table = page.extract_table({      "vertical_strategy""text",       "horizontal_strategy""text",      "snap_tolerance": 4  })  

5.3 处理空白单元格

df.fillna("N/A", inplace=True)  df.dropna(how="all", inplace=True)


阅读原文:原文链接


该文章在 2025/8/28 15:41:56 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved