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 pdfplumberpdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"pdf = pdfplumber.open(pdf_path)pages = pdf.pagesk = 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 pddf = 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解析表格.pyimport pdfplumberimport pandas as pdpd.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解析.pyimport pdfplumberimport pandas as pdimport osimport xlwings as xwpd.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=Falseprint(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("无表格")
