程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python語言Camelot庫: 人類的 PDF 表提取

編輯:Python

python語言Camelot庫: 人類的 PDF 表提取

一、介紹

官方介紹Camelot是一個 Python 庫,可以幫助您從 PDF 中提取表格!需注意的是Camelot 僅適用於基於文本的 PDF,不適用於掃描文檔。針對從長 PDF 文檔中提取表格期間,RAM 使用量會顯著增加。可以通過將提取分成塊,並在每個塊的末尾將提取的數據保存到磁盤來減少長 PDF 的內存使用量。
那麼為何選擇Camelot來進行PDF表的提取了?
Camelot的優點:
1、可配置性:Camelot 通過可調整的設置讓您控制表格提取過程。
2、指標:您可以根據准確性和空白等指標丟棄壞表,而無需手動查看每個表。
3、輸出:每個表都被提取到一個pandas DataFrame中,它可以無縫集成到ETL 和數據分析工作流中。您還可以將表格導出為多種格式,包括 CSV、JSON、Excel、HTML、Markdown 和 Sqlite。

二、安裝

安裝依賴項Ghostscript

特定於操作系統的說明

#Ubuntu
$ apt install ghostscript python3-tk
#MacOS
$ brew install ghostscript tcl-tk
#Windows
對於 Ghostscript,您可以在他們的下載頁面獲取安裝程序。對於 Tkinter,您可以從 ActiveState下載ActiveTcl 社區版。
驗證Ghostscript 是否安裝成功

打開 Python REPL 並運行以下命令:

#對於 Ubuntu/MacOS:
from ctypes.util import find_library
find_library("gs")
"libgs.so.9"
#對於 Windows:
import ctypes
from ctypes.util import find_library
find_library("".join(("gsdll", str(ctypes.sizeof(ctypes.c_voidp) * 8), ".dll")))
<name-of-ghostscript-library-on-windows>

檢查:函數的輸出find_library不應為空。
如果輸出為空,則可能是 Ghostscript 庫不可用 // 變量之一,LD_LIBRARY_PATH具體DYLD_LIBRARY_PATH取決於PATH您的操作系統。在這種情況下,您可能必須修改其中一個路徑變量。

三、安裝 Camelot

1、pip
要使用 PyPI 從 PyPI 安裝 Camelot pip,請包括cv如下所示的額外要求:

$ pip install "camelot-py[base]"

2、conda
conda是Anaconda發行版的包管理器和環境管理系統。它可用於從conda-forge頻道安裝 Camelot:

conda install -c conda-forge camelot-py

3、從源代碼
安裝依賴項後,您可以通過以下方式從源代碼安裝 Camelot:

a. 克隆 GitHub 存儲庫

$ git clone https://www.github.com/camelot-dev/camelot

b. 然後再次簡單地使用 pip

$ cd camelot
$ pip install ".[base]"

四、初級使用

閱讀 PDF 以使用 Camelot 提取表格非常簡單。

首先導入 Camelot 模塊:


import camelot

點擊這裡獲取PDF文件

tables = camelot.read_pdf('foo.pdf')
tables

結果是

<TableList n=1>

現在,我們有一個TableList名為 的對象tables,它是一個Table對象列表。我們可以從這個對象中得到我們需要的一切。我們可以使用每個表的索引來訪問它。從上面的代碼片段中,我們可以看到該tables對象只有一個表,因為n=1. 讓我們使用索引訪問表0並查看它的shape.

tables[0]
<Table shape=(7, 7)>

讓我們打印解析報告。

print tables[0].parsing_report

結果是

{

'accuracy': 99.02,
'whitespace': 12.24,
'order': 1,
'page': 1
}

准確性是一流的,並且空格較少,這意味著該表很可能被正確提取。table您可以使用對象的df屬性以 pandas DataFrame 的形式訪問該表。

tables[0].df

您現在可以使用其to_csv()方法將表導出為 CSV 文件。to_json()或者,您可以使用或方法將表格分別導出為 JSON、Excel、HTML 文件或 sqlite 數據庫。to_excel() to_html() to_markdown()to_sqlite()

tables[0].to_csv('foo.csv')

這會將表格導出為指定路徑的 CSV 文件。在這種情況下,它foo.csv位於當前目錄中。

tables您還可以使用對象的export()方法一次導出所有表。

tables.export('foo.csv', f='csv')

指定頁碼

默認情況下,Camelot 僅使用 PDF 的第一頁來提取表格。要指定多個頁面,您可以使用pages關鍵字參數:

camelot.read_pdf('your.pdf', pages='1,2,3')

關鍵字參數接受以逗號分隔的pages頁碼字符串形式的頁面。您還可以指定頁面范圍 - 例如,pages=1,4-10,20-30或pages=1,4-10,20-end。

閱讀加密的 PDF

要從加密的 PDF 文件中提取表格,您必須在調用時提供密碼read_pdf()。

tables = camelot.read_pdf('foo.pdf', password='******')
tables

目前,Camelot 僅支持使用 ASCII 密碼和算法代碼 1 或 2加密的 PDF 。如果無法讀取 PDF,則會引發異常。這可能是由於未提供密碼、密碼不正確或加密算法不受支持。

將來可能會添加進一步的加密支持,但與此同時,如果您的 PDF 文件使用不受支持的加密算法,建議您在調用read_pdf(). 這可以通過QPDF等第三方工具成功實現。

qpdf --password=<PASSWORD> --decrypt input.pdf output.pdf

五、高級使用

資料來源PDF
在這裡插入圖片描述

處理背景線

要處理背景線,您可以通過process_background=True.

tables = camelot.read_pdf('background_lines.pdf', process_background=True)
tables[1].df

可視化調試

您可以使用該plot()方法生成在處理 PDF 頁面時檢測到的各種元素的matplotlib圖。這可以通過調整不同的配置參數來幫助您選擇表格區域、列分隔符和調試錯誤的表格輸出。

kind您可以使用關鍵字參數指定要繪制的元素類型。生成的圖可以通過傳遞filename關鍵字參數保存到文件中。支持以下繪圖類型:

文本
text
讓我們繪制表格 PDF 頁面上的所有文本。

camelot.plot(tables[0], kind='text').show()

網格

讓我們繪制表格(看看它是否被正確檢測到)。這種繪圖類型以及等高線、直線和關節對於調試和改進提取輸出很有用,以防表格未被正確檢測到。(稍後會詳細介紹。)

camelot.plot(tables[0], kind='grid').show()

輪廓

contour
現在,讓我們繪制表格 PDF 頁面上存在的所有表格邊界。

camelot.plot(tables[0], kind='contour').show()


line
可以繪制表格 PDF 頁面上的所有線段。

camelot.plot(tables[0], kind='line').show()

聯合的
joint
最後,讓我們繪制表格 PDF 頁面上存在的所有線交點。

camelot.plot(tables[0], kind='joint').show()

文本邊緣
textedge

您還可以通過指定kind=‘textedge’. 要了解更多關於“textedge”是什麼的信息,您可以查看Anssi Nurminen 碩士論文的第 20、35和 40 頁。

camelot.plot(tables[0], kind='textedge').show()

指定表格區域

在這些情況下,指定准確的表邊界會很有用。您可以在此頁面上繪制文本並注意表格的左上角和右下角坐標。

您希望 Camelot 分析的表格區域可以作為逗號分隔的字符串列表傳遞給read_pdf(),使用table_areas關鍵字參數。

tables = camelot.read_pdf('table_areas.pdf', flavor='stream', table_areas=['316,499,566,337'])
tables[0].df

指定列分隔符

指定列分隔符
在這種情況下,文本彼此非常接近,Camelot 可能會錯誤地猜測列分隔符的坐標。要更正此問題,您可以通過在頁面上繪制文本來明確指定每個列分隔符的x坐標。read_pdf()您可以使用columns關鍵字參數將列分隔符作為逗號分隔的字符串列表傳遞給。如果您傳遞了單列分隔符字符串列表,並且未指定表格區域,則分隔符將應用於整個頁面。當指定了表格區域列表並且您還需要指定列分隔符時,兩個列表的長度應該相等。每個表格區域將使用它們的索引映射到每個列分隔符的字符串。
例如,如果您指定了兩個表格區域,並且只想為第一個表格指定列分隔符,您可以像這樣在列分隔符列表中為第二個表格傳遞一個空字符串,.table_areas=[‘12,54,43,23’, ‘20,67,55,33’]columns=[‘10,120,200,400’, ‘’]
繪制此PDF上存在的文本所得到的x坐標,然後將表格拿出來!

tables = camelot.read_pdf('column_separators.pdf', flavor='stream', columns=['72,95,209,327,442,529,566,606,683'])
tables[0].df

下期為大家分享介紹Camelot更多高級用法


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved