1. 程式人生 > 其它 >Python提取PDF文字資料

Python提取PDF文字資料

很多檔案為了安全都會存成pdf格式,如論文、技術文件、書籍等,而通過程式從pdf文件中提取對應的文字內容比較麻煩。在Python中,用於解析pdf檔案的擴充套件包有很多,常用的有pdfminer3k、PyPDF2、Camelot、pdfplumber等。本文主要介紹如何使用pdfplumber庫來解析pdf檔案。

簡介

很多檔案為了安全都會存成pdf格式,如論文、技術文件、書籍等,而通過程式從pdf文件中提取對應的文字內容比較麻煩。在Python中,用於解析pdf檔案的擴充套件包有很多,常用的有pdfminer3k、PyPDF2、Camelot、pdfplumber等。本文主要介紹如何使用pdfplumber庫來解析pdf檔案。

pdfplumber最適合提取電腦生成的pdf,而不是掃描出來的pdf。它是在pdfminer和pdfminer.six的基礎上設計的。

安裝

pip3 install pdfplumber

python3 -m pip install pdfplumber

執行

有如下pep8.pdf

檔案

我們可以通過pdfplumber來提取以上pdf檔案的文字資訊。

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    print(pdf.pages)  # Page物件列表

結果如下

[<Page:1>, <Page:2>, <Page:3>, <Page:4>, <Page:5>, <Page:6>, <Page:7>, <Page:8>, <Page:9>, <Page:10>, <Page:11>, <Page:12>, <Page:13>, <Page:14>, <Page:15>, <Page:16>, <Page:17>]

上面的pdf.pages代表pdf檔案中每頁(共17頁)的物件列表。

我們來提取第一頁的文字資訊

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    page = pdf.pages[0]
    print(page.extract_text())  # 提取文字

結果如下

Python PEP8 編碼規範 中文版
原文連結:http://legacy.python.org/dev/peps/pep-0008/
PEP 8
Title Style Guide for Python Code
Version c451868df657
Last-Modified 2016-06-08 10:43:53 -0400 (Wed, 08 Jun 2016)
Author Guido van Rossum <guido at python.org>, Barry Warsaw
<barry at python.org>, Nick Coghlan <ncoghlan at gmail.co
m>
Status Active
Type Process
Content-Type: text/x-rst
Created 05-Jul-2001
Post-History 05-Jul-2001, 01-Aug-2013
Introduction 介紹
本文提供的Python程式碼編碼規範基於Python主要發行版本的標準庫。Python的C語言實現的C程式碼規範請檢視相應的PEP指南[1]。
這篇文件以及PEP 257(文件字串的規範)改編自Guido原始的《Python Style Guide》一文,同時添加了一些來自Barry的風格指南[2]。
這篇規範指南隨著時間的推移而逐漸演變,隨著語言本身的變化,過去的約定也被淘汰了。
許多專案有自己的編碼規範,在出現規範衝突時,專案自身的規範優先。
A Foolish Consistency is the Hobgoblin of Little
Minds 盡信書,則不如無書
Guido的一條重要的見解是程式碼閱讀比寫更加頻繁。這裡提供的指導原則主要用於提升程式碼的可讀性,使得在大量的Python程式碼中保持一致。
就像PEP 20提到的,“Readability counts”。
這是一份關於一致性的風格指南。這份風格指南的風格一致性是非常重要的。更重要的是專案的風格一致性。在一個模組或函式的風格一致性
是最重要的。
然而,應該知道什麼時候應該不一致,有時候編碼規範的建議並不適用。當存在模稜兩可的情況時,使用自己的判斷。看看其他的示例再決定
哪一種是最好的,不要羞於發問。
特別是不要為了遵守PEP約定而破壞相容性!
幾個很好的理由去忽略特定的規則:
1.  當遵循這份指南之後程式碼的可讀性變差,甚至是遵循PEP規範的人也覺得可讀性差。
2.  與周圍的程式碼保持一致(也可能出於歷史原因),儘管這也是清理他人混亂(真正的Xtreme Programming風格)的一個機會。
3.  有問題的程式碼出現在發現編碼規範之前,而且也沒有充足的理由去修改他們。
4.  當代碼需要相容不支援編碼規範建議的老版本Python。
Code lay-out 程式碼佈局
Indentation 縮排
每一級縮排使用4個空格。
續行應該與其包裹元素對齊,要麼使用圓括號、方括號和花括號內的隱式行連線來垂直對齊,要麼使用掛行縮排對齊[7]。當使用掛行縮排時,
應該考慮到第一行不應該有引數,以及使用縮排以區分自己是續行。

如果只想提取第一頁中的表格資訊,則可以用以下方法

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    page = pdf.pages[0]
    for row in page.extract_table():
        print(row)

結果如下

['PEP', '8']
['Title', 'Style Guide for Python Code']
['Version', 'c451868df657']
['Last-Modified', '2016-06-08 10:43:53 -0400 (Wed, 08 Jun 2016)']
['Author', 'Guido van Rossum <guido at python.org>, Barry Warsaw\n<barry at python.org>, Nick Coghlan <ncoghlan at gmail.co\nm>']
['Status', 'Active']
['Type', 'Process']
['Content-Type:', 'text/x-rst']
['Created', '05-Jul-2001']
['Post-History', '05-Jul-2001, 01-Aug-2013']

extract_table()會返回一個包含表格資料的巢狀列表。

其他常用的提取方法

  • .extract_text() 用來提頁面中的文字,將頁面的所有字元物件整理為的那個字串
  • .extract_words() 返回的是所有的單詞及其相關資訊
  • .extract_tables() 提取頁面的所有表格
  • .to_image() 用於視覺化除錯時,返回PageImage類的一個例項(使用此方法需要安裝視覺化除錯工具ImageMagick

總結

pdfplumber是一個很強大的pdf解析工具包,上面也只是簡單的介紹了其中一部分功能,如果想了解更多關於pdfplumber的使用方法,可以去相關的官方文件中檢視。