PDF文件信息不會提取怎么辦??別急!Python幫你解決
點擊上方“數(shù)據(jù)管道”,選擇“置頂星標”公眾號
干貨福利,第一時間送達

01. 引言
02. pdfplumber簡介及安裝
pip install pdfplumber03. pdf文件主要信息(表格+文本)提取
具體的屬性及基本使用方法大家都可以去官網(wǎng)自己查看,這里僅介紹常用信息(表格+文本)的提取方法,文件也是使用官網(wǎng)提供的。
(1)表格信息提取
表格提取方法主要包括find_tables()、extract_tables()、extract_table()以及debug_tablefinder()。我們提取表格信息主要使用extract_tables()、extract_table() 方法,而debug_tablefinder() 則是查看表格信息提取的依據(jù)。官網(wǎng)解釋如下:

接下來,我們使用extract_table()結合具體的pdf文件進行介紹說明。Pdf文件信息如下(部分):

提取數(shù)據(jù):
import?pandas?as?pdimport?pdfplumberpdf?=?r"pdfplumber-stable\examples\pdfs\ca-warn-report.pdf"ta_pdf?=?pdfplumber.open(pdf)ta_pdf_info?=?ta_pdf.pages[0]?#獲取pdf文件第一頁信息tables?=?ta_pdf_info.extract_table()?#獲取表格信息tabes[:3]
結果顯示如下:

使用.extract_table從頁面上最大的表中獲取數(shù)據(jù):.extract_table返回一個鑲嵌列表,每個內(nèi)部列表為表中的一行,對比pdf文件可以發(fā)現(xiàn),主要的信息我們已經(jīng)提取出來,接下來我們對信息進行保存。
信息保存:
table_df = pd.DataFrame(tables[1:],columns=tables[0])table_df.head()
結果如下:

這樣我們就完美的提取pdf第一頁表格信息了,可以發(fā)現(xiàn),Effective和Received列由于是直接提取,導致文本之間存在空格,接下來整理下即可,代碼如下:
for?column?in?["Effective",?"Received"]:????table_df[column]?=?table_df[column].str.replace("?",?"")table_df.head()
結果如下:

通過pandas的to_excel等文件保存方法即可實現(xiàn)文件另存。到此,我們就實現(xiàn)了pdf第一頁表格信息的提取、整理和另存。若想對多頁進行批量處理,進行簡單的循環(huán)處理即可。
此外,我們還可以直接通過 within_bbox()方法直接定位我們需要提取信息的位置進行特定位置信息的提取。within_bbox() 介紹如下:

(2)文本信息提取
文本信息的提取主要使用extract_text()方法,這里使用的pdf文件預覽如下(部分):

提取文本信息代碼如下:
file = r"pdfplumber-stable\examples\pdfs\san-jose-pd-firearm-sample.pdf"text_pdf?=?pdfplumber.open(file)text_info?=?text_pdf.pages[0]text?=?text_info.extract_text()print(text)
結果為:

對比pdf可知,文本信息已全部提出。這里我們就可以使用正則表達式對提取信息進行篩選。代碼如下:
core_part = re.compile(r"LOCATION[\-\s]+(.*)\n\s+Flags = e", re.DOTALL)core?=?re.search(core_part,?text).group(1)print(core)
這里解釋下:LOCATION[\-\s]+(.*)\n\s+Flags = e 就是匹配 LOCATION 和 Flags = e 字符串 之間的所有元素,無論換行還是空格等。結果如下:

由于使用print()方法進行輸出,結果較為規(guī)范,但實際情況如下:

含有多個換行符號(\n),接下來以此為依據(jù)進行拆分(split),如下:

再對結果進行提取,代碼如下:
line_groups = list(zip(lines[::2], lines[1::2]))line_groups
結果如下:

最后使用collections模塊中的OrderedDict類 進行字典有序排列,構建pandas所需數(shù)據(jù),具體代碼如下:
from?collections?import?OrderedDictline_groups?=?list(zip(lines[::2],?lines[1::2]))def?parse_row(first_line,?second_line):????return?OrderedDict([????????("type",?first_line[:20].strip()),????????("item",?first_line[21:41].strip()),????????("make",?first_line[44:89].strip()),????????("model",?first_line[90:105].strip()),????????("calibre",?first_line[106:111].strip()),????????("status",?first_line[112:120].strip()),????????("flags",?first_line[124:129].strip()),????????("serial_number",?second_line[0:13].strip()),????????("report_tag_number",?second_line[21:41].strip()),????????("case_file_number",?second_line[44:64].strip()),????????("storage_location",?second_line[68:91].strip())????])parsed?=?[?parse_row(first_line,?second_line)????for?first_line,?second_line?in?line_groups?]parsed[:2]
結果如下:

可以看出,數(shù)據(jù)已經(jīng)過整合并符合pandas 構建數(shù)據(jù)DataFrame形式。如下:
text_df?=?pd.DataFrame(parsed)text_df
結果如下(部分):

通過to_excel等方法即可實現(xiàn)另存。
04. 總結
本期推文簡單介紹了如何使用Python第三方庫pdfplumber 實現(xiàn)對pdf文件解析及基本信息提取。其目的是為大家提供一個數(shù)據(jù)解決思路,這里只是簡單介紹表格信息和文本信息的提取,其他的方法,大家可以查看官網(wǎng)獲取啊。
