如何使用 python 提取 PDF 表格及文本,并保存到 Excel?

image.png

pdf 是一種便攜式文檔格式,由Adobe公司設(shè)計(jì)。因?yàn)椴皇芷脚_(tái)限制,且方便保存和傳輸,所以pdf非常受歡迎。目前市場(chǎng)上有很多pdf工具,大部分是閱讀類(lèi),也有支持對(duì)pdf的修改、轉(zhuǎn)換等功能,但這部分工具不少是收費(fèi)的。這次介紹一個(gè)開(kāi)源python工具庫(kù)-pdfplumber,可以方便地獲取pdf的各種信息,包括文本、表格、圖表、尺寸等。pdfplumber在github上有英文官方文檔,后面我們會(huì)撿重點(diǎn)講解,先看下如何用pdfplumber提取pdf表格?以NBA 2020-2021 常規(guī)賽數(shù)據(jù)作為范例,pdf表格如下:

圖片

第一步:使用pdfplumber提取表格文本

# 導(dǎo)入pdfplumber
import pdfplumber

# 讀取pdf文件,保存為pdf實(shí)例
pdf =  pdfplumber.open("E:\\nba.pdf") 

# 訪問(wèn)第二頁(yè)
first_page = pdf.pages[1]

# 自動(dòng)讀取表格信息,返回列表
table = first_page.extract_table()

輸出:

圖片

第二步:整理成dataframe格式,保存為excel

import pandas as pd

# 將列表轉(zhuǎn)為df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

# 保存excel
table_df.to_excel('test.xlsx')

table_df

輸出:

圖片

一個(gè)小小的腳本,不到十行代碼,便將pdf表格提取并轉(zhuǎn)化為dataframe格式,最終保存到excel。有個(gè)初步認(rèn)知后,接下來(lái)詳細(xì)講講pdfplumber的安裝、導(dǎo)入、api接口等信息。

pdfplumber簡(jiǎn)介

前面已經(jīng)介紹過(guò)pdfplumber的用途,也用一個(gè)小案例展示了如何提取表格,我覺(jué)得對(duì)于pdfplumber只需要了解三點(diǎn)就可以。1、它是一個(gè)純python第三方庫(kù),適合python 3.x版本2、它用來(lái)查看pdf各類(lèi)信息,能有效提取文本、表格3、它不支持修改或生成pdf,也不支持對(duì)pdf掃描件的處理Github地址
https://github.com/jsvine/pdfplumber

pdfplumber安裝和導(dǎo)入

同其他python庫(kù)一樣,pdfplumber支持使用pip安裝,在命令行輸入:

pip install pdfplumber

如果遇到安裝慢的問(wèn)題,可以替換鏡像源,會(huì)快很多。pdfplumber安裝后,用import導(dǎo)入即可使用:

import pdfplumber
....

pdfplumber簡(jiǎn)單使用

pdfplumber中有兩個(gè)基礎(chǔ)類(lèi),PDF和Page。看字面意思能猜出,前者是處理整個(gè)文檔,后者是處理頁(yè)面。「pdfplumber.PDF類(lèi)」
屬性
描述

image.png

「pdfplumber.Page類(lèi)」這是pdfplumber的核心功能,對(duì)pdf的大部分操作都是基于這個(gè)類(lèi),包括提取文本、表格、尺寸等。這里暫不一一列舉它的屬性和方法。通過(guò)一個(gè)簡(jiǎn)單的案例,就可以明白它們的作用。示例pdf文檔,共兩頁(yè):

圖片

1. 讀取pdf

# 導(dǎo)入pdfplumber
import pdfplumber

# 讀取pdf文件,返回pdfplumber.PDF類(lèi)的實(shí)例
pdf = pdfplumber.open("e:\\nba2.pdf")

2. 獲取該pdf文檔的信息

# 通過(guò)pdfplumber.PDF類(lèi)的metadata屬性獲取pdf信息
pdf.metadata

輸出:

圖片

這些是pdf的基礎(chǔ)信息,包括作者、來(lái)源、日期等。

3. 總頁(yè)數(shù)

# 通過(guò)pdfplumber.PDF類(lèi)的metadata屬性獲取pdf頁(yè)數(shù)
len(pdf.pages)

4. 讀取第一頁(yè)的頁(yè)寬、頁(yè)高等信息

# 第一頁(yè)pdfplumber.Page實(shí)例
first_page = pdf.pages[0]

# 查看頁(yè)碼
print('頁(yè)碼:',first_page.page_number)

# 查看頁(yè)寬
print('頁(yè)寬:'first_page.width)

# 查看頁(yè)高
print('頁(yè)高:'first_page.height)

輸出:

圖片

5. 讀取第一頁(yè)的文本

# 讀取文本
text = first_page.extract_text()
print(text)

輸出:

圖片

6. 讀取第二頁(yè)的表格

import pandas as pd

# 第二頁(yè)pdfplumber.Page實(shí)例
first_page = pdf.pages[1]

# 自動(dòng)讀取表格信息,返回列表
table = first_page.extract_tables()

# 將列表轉(zhuǎn)為df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

table_df
圖片

pdfplumber提取表格有很多的細(xì)節(jié)需要處理,這里給到的范例表格線框比較規(guī)范,所以能很簡(jiǎn)單的提取,但對(duì)于線框不完全(包含無(wú)線框)的表格,其效果就差了不少。在實(shí)際項(xiàng)目所需處理的pdf文檔中,線框完全及不完全的表格都比較多,為了能夠理解pdfplumber實(shí)現(xiàn)表格抽取的原理和方法,我們需要去細(xì)究相關(guān)參數(shù)的設(shè)置。正如案例所示,pdfplumber.Page對(duì)象的.extract_table()方法可以提取表格,返回從頁(yè)面上最大的表中提取的文本,以列表列表的形式顯示,結(jié)構(gòu)為row -> cell。「表格抽取參數(shù)設(shè)置」默認(rèn)情況下,extract_table使用頁(yè)面的垂直和水平線(或矩形邊緣)作為單元格分隔符。該方法可以通過(guò)table_settings參數(shù)進(jìn)行高度自定義??赡艿脑O(shè)置及其默認(rèn)值:

{
    "vertical_strategy": "lines", 
    "horizontal_strategy": "lines",
    "explicit_vertical_lines": [],
    "explicit_horizontal_lines": [],
    "snap_tolerance": 3,
    "join_tolerance": 3,
    "edge_min_length": 3,
    "min_words_vertical": 3,
    "min_words_horizontal": 1,
    "keep_blank_chars": False,
    "text_tolerance": 3,
    "text_x_tolerance": None,
    "text_y_tolerance": None,
    "intersection_tolerance": 3,
    "intersection_x_tolerance": None,
    "intersection_y_tolerance": None,
}
圖片

pdfplumber支持對(duì)圖表進(jìn)行可視化調(diào)試,能輸出圖像,顯示如何提取表。

圖片

pdfplumber的獨(dú)特之處

python中有很多庫(kù)可以處理pdf,比如PyPDF2、pdfminer等,那pdfplumber的優(yōu)勢(shì)在哪呢?

首先,pdfplumber能輕松訪問(wèn)有關(guān)PDF對(duì)象的所有詳細(xì)信息,且用于提取文本和表格的方法高級(jí)可定制,使用者可根據(jù)表格的具體形式來(lái)調(diào)整參數(shù)。

最關(guān)鍵的是pdfplumber作者持續(xù)在維護(hù)該庫(kù),而同樣受歡迎的PyPDF2已經(jīng)不再維護(hù)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容