Python 解析 PDF 文本和表格的四大方法介紹
== code for paper and NSFC Proj. parsing==: https://gitee.com/sonica/pdf_parsing
看到一個不錯的知識文章,和大家分享一下:
很多文件為了安全都會存成 PDF 格式,比如有的論文、技術文檔、書籍等等,程序讀取這些文檔內容帶來了很多麻煩。Python 目前解析 PDF 的擴展包有很多,這里將對比介紹 PyPDF2、pdfplumber、pdfminer3k 以及 Camelot,告訴你哪個是好用的 PDF 解析工具。
本文使用的案例 PDF 文檔下載鏈接:
鏈接:
https://pan.baidu.com/s/1zH7vY47AqBYKM0XbdABbUA
提取碼:xhem
另外,獲取 PDF 文檔之后,會發現 PDF 文檔中的換行符是以行的位置相同的,而不是跟段落相同。
1. PyPDF2 解析 PDF 文檔
這里主要參考了 2019-03-07,Usman Malik 寫的一篇文章:
Python for NLP: Working with Text and PDF Files
使用 Python 安裝 PyPDF2 擴展包:
pip install PyPDF2
#---------OR
conda install -c conda-forge pypdf2
讀取 PDF 文件
import PyPDF2
path = r"****.pdf"
#使用open的‘rb’方法打開pdf文件(這里必須得使用二進制rb的讀取方式)
mypdf = open(path,mode='rb')
#調用PdfFileReader函數
pdf_document = PyPDF2.PdfFileReader(mypdf)
#使用pdf_document變量,獲取各個信息
#或者PDF文檔的頁數
pdf_document.numPages
#輸出PDF文檔的第一頁內容
first_page = pdf_document.getPage(0)
print(first_page.extractText())
輸出文檔第一頁內容之后會發現,PyPDF2 方法對中文的支持不好,而對英文的支持會很好,所以如果處理中文文檔的話,可以使用下面這個方法。
2. pdfplumber 解析 PDF 文檔
安裝的話直接使用下面語句即可:
pip install pdfplumber
(1)解析文本內容
pdfplumber 中的 extract_text 函數是可以直接識別 PDF 中的文本內容。
首先讀取整個 PDF 文檔文本內容
import pdfplumber
import pandas as pd
with pdfplumber.open(path) as pdf:
content = ''
#len(pdf.pages)為PDF文檔頁數
for i in range(len(pdf.pages)):
#pdf.pages[i] 是讀取PDF文檔第i+1頁
page = pdf.pages[i]
#page.extract_text()函數即讀取文本內容,下面這步是去掉文檔最下面的頁碼
page_content = '\n'.join(page.extract_text().split('\n')[:-1])
content = content + page_content
print(content)
解析文本內容,取出 PDF 的售后解決方案中的故障代碼內容,可以看到故障代碼內容,如下圖所示,故障代碼在兩頁里面。
根據這類文檔的規律可以知道,故障代碼內容都是在文本故障代碼列舉如下:和 2. 之間,因此解析 PDF 之后取出這部分內容還是比較容易的:
print(content.split('故障代碼列舉如下:')[1].split('2.')[0])
運行結果如下,可以看出來很好的取出來這部分內容了。
(2)解析表格內容
上面介紹了 pdfplumber 解析文本內容的方法,這里介紹一下解析表格內容的方法,和上面十分類似,pdfplumber 中的 extract_tables 函數是可以直接識別 PDF 中的表格的。
這里展示解析 PDF 文檔中第一頁表格的方法,可以看出案例 PDF 中第一頁的開頭就是一個表格:
由於使用 extract_tables 函數得到的是 Table 一個嵌套的 List 類型,轉化成 DataFrame 會更方便查看和分析。
import pdfplumber
import pandas as pd
with pdfplumber.open(path) as pdf:
first_page = pdf.pages[0]
for table in first_page.extract_tables():
df = pd.DataFrame(table)
df
可以看出這個函數非常容易的將 PDF 文檔中的表格提取出來了。
看完上面的可以知道 pdfplumber 擴展包可以非常好的解析 PDF 的文本內容和表格內容,並且對中文有很好的支持,十分推薦使用該方法。
3. pdfminer3k 解析 PDF 文檔
pdfminer3k 是 pdfminer 的 python3 版本,主要用於讀取 pdf 中的文本。如果直接搜索 pdfminer3k 的話會發現網上有非常多的教程,但是看了之后,你可能就想吐槽這些教程太繁瑣了,看着頭疼。
下面這個是 pdfminer 解析 PDF 文檔的流向圖。
pdfminer 方法解析 PDF 可以很好的提取文本內容,但是對於表格數據,能提取出文字,但是沒有格式,會很不友好。因此你如果只需要提取文本內容的話,可以使用 pdfminer 擴展包,這個包也能很好的支持中文。中文需要考慮編碼和全角半角問題。
4. Camelot 解析 PDF 文檔
安裝
Camelot 先使用 pip install camelot-py 語句安裝,如果報錯,參考安裝 Camelot 教程。
另外,使用 camelot 需要安裝 cv2 包,上面這個安裝教程中也有。
import camelot
import pandas as pd
tables = camelot.read_pdf(filepath=path,pages='1',flavor='stream')
df = pd.DataFrame(tables[0].data)
Camelot 讀取 PDF 文件中的表格數據很好用,並且能夠很好的支持中文,但是 Camelot 有很多局限性。
首先,使用 stream 時,表格無法被自動偵測到,stream 把整個頁面當成一個 table。
其次,camelot 只用使用基於文本的 PDF 文件而不能使用掃描文檔。
綜上所述,建議使用 pdfplumber 擴展包來解析 PDF 文檔的文本和表格,如果只解析文本內容,也可以使用 pdfminer ,而解析英文文檔內容,可以使用 PyPDF2 。