python解析并读取PDF文件:函数总结

目录

1.PyPDF2

2. pdfminer & pdfminer3k

3. pdfplumber

4. Camelot


虽然PDF文件对文本布局非常好,容易打印并阅读,但软件要将它们解析为纯文本并不容易,Python目前解析PDF的扩展包有很多,本文将分别介绍PyPDF2、pdfplumber、pdfminer3k以及Camelot(若发现还有其他函数,继续补充),并分析优缺点,告诉你哪个是好用的PDF解析工具。

1.PyPDF2

PyPDF2 没有办法从 PDF 文档中提取图像、图表或其他媒体,但它可以提取文 本,并将文本返回为 Python 字符串

缺点:PyPDF2从PDF提取文本时可能会出错,甚至根本打不开某些PDF文件。

基本实现代码如下:

import PyPDF2

# 使用open的‘rb’方法打开pdf文件,使用二进制模式
mypdf = open('pdfexample.pdf',mode='rb')

# 调用PdfFileReader函数
pdf_document = PyPDF2.PdfFileReader(mypdf)

# 使用PdfFileReader对象的变量,获取各个信息,如numPages属性获取PDF文档的页数
pdf_document.numPages  

# 调用PdfFileReader对象的getPage()方法,传入页码,取得Page对象:输出PDF文档的第一页内容
first_page = pdf_document.getPage(0)

# 调用Page对象的extractText()方法,返回该页文本的字符串
text = first_page.extractText()) 

2. pdfminer & pdfminer3k

PDFMiner是一个从PDF文档中提取信息的工具。与其他pdf相关的工具不同,它完全专注于获取和分析文本数据。PDFMiner允许获取页面中文本的确切位置,以及其他信息,比如字体或行。它包括一个PDF转换器,可以将PDF文件转换成其他文本格式(如HTML)。它有一个可扩展的PDF解析器,可以用于其他目的而不是文本分析。

pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本,下面是pdfminer 解析PDF文档的流向图。

                  

pdfminer方法解析PDF可以很好的提取文本内容,但是对于表格数据,能提取出文字,但是没有格式,会很不友好。因此你如果只需要提取文本内容的话,可以使用pdfminer扩展包,这个包也能很好的支持中文。

参考:https://www.cnblogs.com/wj-1314/p/9429816.html

3. pdfplumber

Pdfplumber是一个可以处理pdf格式信息的库,可以很好地解析PDF的文本和表格内容。可以查找关于每个文本字符、矩阵、和行的详细信息,也可以对表格进行提取并进行可视化调试,并且对中文有很好的支持,十分推荐使用该方法。

参考:https://blog.csdn.net/blmoistawinde/article/details/82051915

pdfplumber.pdf中包含了.metadata和.pages两个属性:

  • .metadata是一个包含pdf信息的字典。
  • .pages是一个包含页面信息的列表。

每个pdfplumber.page的类中包含了几个主要的属性:

  • .page_number 页码
  • .width 页面宽度
  • .height 页面高度
  • .objects/.chars/.lines/.rects 这些属性中每一个都是一个列表,每个列表都包含一个字典,每个字典用于说明页面中的对象信息, 包括直线,字符, 方格等位置信息。

一些常用的方法:

  • .extract_text() 用来提页面中的文本,将页面的所有字符对象整理为的那个字符串
  • .extract_words() 返回的是所有的单词及其相关信息
  • .extract_tables() 提取页面的表格
  • .to_image() 用于可视化调试时,返回PageImage类的一个实例
     

1. 解析文本内容

pdfplumber中的extract_text()函数是可以直接识别PDF中的文本内容:

import pdfplumber
import pandas as pd

with pdfplumber.open(path) as pdf: 
    content = ''
    for i in range(len(pdf.pages)):
    	# 读取PDF文档第i+1页
        page = pdf.pages[i] 

        # page.extract_text()函数即读取文本内容,下面这步是去掉文档最下面的页码
        page_content = '\n'.join(page.extract_text().split('\n')[:-1])
        content = content + page_content


# 提取以上解析结果中,“地方法规”和“2.其他有关资料”之间的内容
result = content.split('地方法规列举如下:')[1].split('2.其他有关资料')[0]

2. 解析表格内容

pdfplumber中的extract_tables()函数是可以直接识别PDF中的表格的,使用extract_tables函数得到的是Table一个嵌套的List类型,转化成DataFrame会更方便查看和分析。

import pdfplumber
import pandas as pd

with pdfplumber.open(path) as pdf:      
    first_page = pdf.pages[0] 
    tables = first_page.extract_tables()
    for table in tables 
        df = pd.DataFrame(table) 
        # 第一列当成表头: 
        df = pd.DataFrame(table[1:],columns=table[0]) 

4. Camelot

Camelot读取PDF文件中的表格数据很好用,并且能够很好的支持中文,但是Camelot有很多局限性:

  • 首先,使用stream时,表格无法被自动侦测到,stream把整个页面当成一个table。
  • 其次,camelot只用使用基于文本的PDF文件而不能使用扫描文档。
import camelot
import pandas as pd

tables = camelot.read_pdf(filepath=path,pages='1',flavor='stream')
df = pd.DataFrame(tables[0].data)

综上所述,建议使用pdfplumber扩展包来解析PDF文档的文本和表格,如果只解析文本内容,也可以使用pdfminer ,而解析英文文档内容,可以使用PyPDF2。
 

 

 

 

你可能感兴趣的:(Python)