本文作者:王碧琪
文字編輯:錢夢璇
技術(shù)總編:張 邯
在《提取PDF文本信息:入門》中壁酬,我們介紹了使用pdfminer提取PDF中的信息,其中提取的是文本內(nèi)容巷查,而對于表格內(nèi)容皱坛,使用pdfminer會(huì)輸出無格式的文本,不能保留表格格式靶剑,而pdfplumber就能很好的解決問題。本文將比較兩個(gè)方法的差異池充。
待處理的PDF文檔中的表格如下:
image
一桩引、pdfminer
我們用以下程序使用pdfminer進(jìn)行提取(具體原理已在上篇文章中詳述):
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
parser = PDFParser(open(r"d: \table.pdf"))
doc = PDFDocument()
parser.set_document(doc)
doc.set_parser(parser)
rsrcmgr = PDFResourceManager() #創(chuàng)建PDF資源管理器來管理共享資源
laparams = LAParams() #創(chuàng)建一個(gè)PDF設(shè)備對象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device) #創(chuàng)建一個(gè)PDF解釋器對象
with open(r"d:\table.txt", 'w') as f:
for page in doc.get_pages(): #循環(huán)遍歷列表,每次處理一個(gè)page的內(nèi)容
interpreter.process_page(page)
layout = device.get_result()
for x in layout:
if isinstance(x, LTTextBox):
print(x.get_text().strip())
f.write(x.get_text().strip()+"\n")
結(jié)果為:
2010
Things
Quantity
Apples
Oranges
Pears
10
20
8
由于只能提取文字收夸,這樣的結(jié)果已經(jīng)破壞了最初的表格樣式坑匠。
二、pdfplumber
首先導(dǎo)入庫咱圆,生成pdfplumber對象:
import pdfplumber
pdf = pdfplumber.open(r"d: \table.pdf")
print(pdf)
結(jié)果如下:
<pdfplumber.pdf.PDF object at 0x000001A536631DC8>
結(jié)果表明生成了一個(gè)pdfplumber對象笛辟,我們可以調(diào)用.pages()方法解析得到每一頁的內(nèi)容:
pages=pdf.pages
print(pages)
結(jié)果如下:
[<pdfplumber.page.Page object at 0x000001A534FD8348>]
生成的可迭代對象可以通過for遍歷:
for p in pages:
table1=p.extract_table()
print(table1)
結(jié)果如下:
[['2010', None], ['Things', 'Quantity'], ['Apples', '10'], ['Oranges', '20'], ['Pears', '8']]
table1是一個(gè)列表,到這里我們就得到了文檔中的表格內(nèi)容了序苏。列表table1中有若干個(gè)小列表手幢,分別表示表格內(nèi)容中的每一行,每個(gè)小列表中有兩個(gè)元素忱详,雖然原表格內(nèi)容的第一行只有一個(gè)元素围来,但是這里的結(jié)果是補(bǔ)齊成兩個(gè)元素。我們逐行打印出來匈睁。
for unitrow in table1:
print(unitrow)
結(jié)果如下:
['2010', None]
['Things', 'Quantity']
['Apples', '10']
['Oranges', '20']
['Pears', '8']
另外监透,這里為了更清晰明了地展示列表內(nèi)容,可以引入pandas庫航唆。
import pandas as pd
df=pd.DataFrame(table1[1:],columns=table1[0])
print(df)
結(jié)果如下:
這樣胀蛮,就得到了比較規(guī)整的保留原格式的PDF表格內(nèi)容了。PDF文檔的內(nèi)容提取比較費(fèi)工夫糯钙,這里提供的表格內(nèi)容提取方式相對比較成熟粪狼。接下來,小編將繼續(xù)探索PDF文檔的內(nèi)容提取方式任岸,敬請關(guān)注~