Python中有多个用于解析PDF文本的库,如pdfplumber库、pdfminer库、Tabula库等。 pdfplumber库是目前使用最方便的库,它不仅能解析文字,还能方便地解析表格。
pip安装pdfplumber库
pip install pdfplumber
换国内源pip安装(推荐)pip install pdfplumber -i [https://pypi.tuna.tsinghua.edu.cn/simple/](https://pypi.tuna.tsinghua.edu.cn/simple/)
提取PDF表格数据
提取pdf表格的代码
import pdfplumber
pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
pdf = pdfplumber.open(pdf_path)
pages = pdf.pages
k = 10 #指定页面,注意列表是从0开始
page = pages[k-1] #提取指定页面表格
tables =page.extract_tables() #提取当前页面表格
table = tables[0] #提取当前页面第1个表格
print(table)
pdf.close() #关闭PDF文件
去掉单元格中的换行符
可以看到获得的表格内容中存在一些换行符\n,这是因为在原表格中这些字符之间是存在换行的。如果想把这些换行符去掉,可以利用replace()函数将换行符替换掉,代码如下:
# 去掉表格单元中的换行符
for i in range(len(table)):
for j in range(len(table[i])):
table[i][j] = table[i][j].replace('\n', '') #替换换行符
#print(table)
table是一个嵌套列表结构,所以需要通过2层循环来定位到具体的文本内容。其中,table[i]表示子列表,table[i][j]表示子列表中的元素。然后通过replace()函数替换换行符,注意这里还需要将替换后的内容重新赋值给table[i][j],才能真正完成替换。
将列表转为DataFrame
import pandas as pd
df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
print(df)
通过print()函数打印输出DataFrame时可能不会把所有的列都显示出来,如果想显示所有列,可在引用pandas库时添加如下代码:pd.set_option('display.max_columns', None) #显示全部列
无表格报错处理
try:
except Exception as err:
print(err)
print("无表格")
连续提取所有表格
for k in range(len(pages)):
page = pages[k]
print("page"+str(k)+"正在解析")
存为CSV
DataFrame存为csv
df.to_csv("stu_info.csv",mode = "a", encoding='utf-8', index=False)
全代码
#pdf解析表格.py
import pdfplumber
import pandas as pd
pd.set_option('display.max_columns', None) #显示全部列
pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
pdf = pdfplumber.open(pdf_path)
pages = pdf.pages #获取所有pdf页面,是一个列表
for k in range(len(pages)):
page = pages[k]
print("page"+str(k)+"正在解析")
#k = 11 #指定页面,注意列表是从0开始
page = pages[k-1] #提取指定页面表格
try:
tables =page.extract_tables() #提取当前页面表格
#table = tables[0] #提取当前页面第1个表格
for z in range(len(tables)):
table = tables[z]
# 去掉表格单元中的换行符
for i in range(len(table)):
for j in range(len(table[i])):
table[i][j] = table[i][j].replace('\n', '') #替换换行符
print(table)
df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
print(df)
df.to_csv("tables_info.csv",mode = "a", encoding='utf-8', index=False)
except Exception as err:
print(err)
print("无表格")
pdf.close() #关闭PDF文件
优化后的全代码:
#pdf解析.py
import pdfplumber
import pandas as pd
import os
import xlwings as xw
pd.set_option("display.max_columns", None) #显示全部列
pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
pdf = pdfplumber.open(pdf_path)
def read_page(page):
tables =page.extract_tables() #提取当前页面表格
#print(tables)
for i in range(len(tables)):
table = tables[i]
#print(table)
# 去掉表格单元中的换行符
for i in range(len(table)):
for j in range(len(table[i])):
table[i][j] = table[i][j].replace('\n', '') #替换换行符
#print(table)
df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
print(df)
df.to_csv("stu_info.csv",mode = "a", encoding='utf-8', index=False
print(str(i)+"成功")
print("\n")
pdf.close() #关闭PDF文件
pages = pdf.pages
#print(pages)
for k in range(len(pages)):
page = pages[k]
print("page"+str(k)+"正在解析")
try:
read_page(page)
except Exception as err:
print(err)
print("无表格")