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表格的代码

  1. import pdfplumber
  2. pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
  3. pdf = pdfplumber.open(pdf_path)
  4. pages = pdf.pages
  5. k = 10 #指定页面,注意列表是从0开始
  6. page = pages[k-1] #提取指定页面表格
  7. tables =page.extract_tables() #提取当前页面表格
  8. table = tables[0] #提取当前页面第1个表格
  9. print(table)
  10. pdf.close() #关闭PDF文件

去掉单元格中的换行符

可以看到获得的表格内容中存在一些换行符\n,这是因为在原表格中这些字符之间是存在换行的。如果想把这些换行符去掉,可以利用replace()函数将换行符替换掉,代码如下:

  1. # 去掉表格单元中的换行符
  2. for i in range(len(table)):
  3. for j in range(len(table[i])):
  4. table[i][j] = table[i][j].replace('\n', '') #替换换行符
  5. #print(table)

table是一个嵌套列表结构,所以需要通过2层循环来定位到具体的文本内容。其中,table[i]表示子列表,table[i][j]表示子列表中的元素。然后通过replace()函数替换换行符,注意这里还需要将替换后的内容重新赋值给table[i][j],才能真正完成替换。

将列表转为DataFrame

  1. import pandas as pd
  2. df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
  3. print(df)

通过print()函数打印输出DataFrame时可能不会把所有的列都显示出来,如果想显示所有列,可在引用pandas库时添加如下代码:
pd.set_option('display.max_columns', None) #显示全部列

无表格报错处理

  1. try:
  2. except Exception as err:
  3. print(err)
  4. print("无表格")

连续提取所有表格

  1. for k in range(len(pages)):
  2. page = pages[k]
  3. print("page"+str(k)+"正在解析")

存为CSV

DataFrame存为csv

df.to_csv("stu_info.csv",mode = "a", encoding='utf-8', index=False)

全代码

  1. #pdf解析表格.py
  2. import pdfplumber
  3. import pandas as pd
  4. pd.set_option('display.max_columns', None) #显示全部列
  5. pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
  6. pdf = pdfplumber.open(pdf_path)
  7. pages = pdf.pages #获取所有pdf页面,是一个列表
  8. for k in range(len(pages)):
  9. page = pages[k]
  10. print("page"+str(k)+"正在解析")
  11. #k = 11 #指定页面,注意列表是从0开始
  12. page = pages[k-1] #提取指定页面表格
  13. try:
  14. tables =page.extract_tables() #提取当前页面表格
  15. #table = tables[0] #提取当前页面第1个表格
  16. for z in range(len(tables)):
  17. table = tables[z]
  18. # 去掉表格单元中的换行符
  19. for i in range(len(table)):
  20. for j in range(len(table[i])):
  21. table[i][j] = table[i][j].replace('\n', '') #替换换行符
  22. print(table)
  23. df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
  24. print(df)
  25. df.to_csv("tables_info.csv",mode = "a", encoding='utf-8', index=False)
  26. except Exception as err:
  27. print(err)
  28. print("无表格")
  29. pdf.close() #关闭PDF文件

将部分代码封闭成函数,使代码简洁些:

优化后的全代码:

  1. #pdf解析.py
  2. import pdfplumber
  3. import pandas as pd
  4. import os
  5. import xlwings as xw
  6. pd.set_option("display.max_columns", None) #显示全部列
  7. pdf_path = "Q1A(R2) Stability Testing of New Drug Substances and Products.pdf"
  8. pdf = pdfplumber.open(pdf_path)
  9. def read_page(page):
  10. tables =page.extract_tables() #提取当前页面表格
  11. #print(tables)
  12. for i in range(len(tables)):
  13. table = tables[i]
  14. #print(table)
  15. # 去掉表格单元中的换行符
  16. for i in range(len(table)):
  17. for j in range(len(table[i])):
  18. table[i][j] = table[i][j].replace('\n', '') #替换换行符
  19. #print(table)
  20. df = pd.DataFrame(table[1:],columns = table[0]) #将表格列表转成DataFrame显示
  21. print(df)
  22. df.to_csv("stu_info.csv",mode = "a", encoding='utf-8', index=False
  23. print(str(i)+"成功")
  24. print("\n")
  25. pdf.close() #关闭PDF文件
  26. pages = pdf.pages
  27. #print(pages)
  28. for k in range(len(pages)):
  29. page = pages[k]
  30. print("page"+str(k)+"正在解析")
  31. try:
  32. read_page(page)
  33. except Exception as err:
  34. print(err)
  35. print("无表格")