數據清洗(三)----- 清洗PDF文件中的數據

       可移植文檔格式(PDF)存儲的文件相對較複雜,因爲它是以二進制的形式存儲的,格式固定,不可修改。使用起來很方便,但是裏面的信息相對較難提取,下面將介紹一些方式提取FDF中的信息。

1. 最簡單的方式----複製

      有pdf文件裏面的內容可以複製出來再整理,這對於需要從PDF中拿少量信息來說十分便利;但是數據比較多時這樣做的效率低下,而且有的PDF根本無法複製,因此這種方式侷限性很大。

2. pdfMiner3k

      這個python的程序包使我們可以從PDF中提取出需要的信息。它自帶的 pdf2txt 和 dumpPDF 工具可以提取並輸出相應的信息。

比如下面的這個例子:(別人寫的,我這裏只是借用說明一下)

import sys
import importlib
importlib.reload(sys)

from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

'''
 解析pdf 文本,保存到txt文件中
'''
path = r'../../data/pdf/阿里巴巴Java開發規範手冊.pdf'
def parse():
    fp = open(path, 'rb') # 以二進制讀模式打開
    #用文件對象來創建一個pdf文檔分析器
    praser = PDFParser(fp)
    # 創建一個PDF文檔
    doc = PDFDocument()
    # 連接分析器 與文檔對象
    praser.set_document(doc)
    doc.set_parser(praser)

    # 提供初始化密碼
    # 如果沒有密碼 就創建一個空的字符串
    doc.initialize()

    # 檢測文檔是否提供txt轉換,不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 創建PDf 資源管理器 來管理共享資源
        rsrcmgr = PDFResourceManager()
        # 創建一個PDF設備對象
        laparams = LAParams()
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        # 創建一個PDF解釋器對象
        interpreter = PDFPageInterpreter(rsrcmgr, device)

        # 循環遍歷列表,每次處理一個page的內容
        for page in doc.get_pages(): # doc.get_pages() 獲取page列表
            interpreter.process_page(page)
            # 接受該頁面的LTPage對象
            layout = device.get_result()
            # 這裏layout是一個LTPage對象 裏面存放着 這個page解析出的各種對象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要獲取文本就獲得對象的text屬性,
            for x in layout:
                if (isinstance(x, LTTextBoxHorizontal)):
                    with open(r'../../data/pdf/1.txt', 'a') as f:
                        results = x.get_text()
                        print(results)
                        f.write(results + '\n')

if __name__ == '__main__':
    parse()

原文:https://blog.csdn.net/u011389474/article/details/60139786 

            pdfMiner3k在提取行信息的PDF時比較規整,但在提取表格數據上表現較糟糕。下面將要介紹的工具包在提取PDF中的表格信息時比較好用。

3. Tabula

       該工具包專門用來提取PDF表格數據的,同時支持PDF導出爲CSV、Excel格式。它是一個基於JAVA的程序,因此如果要在python上使用的話需要這麼安裝:pip install tabula-py;

        tabula-py依賴庫包括java、pandas、numpy,所以需保證運行環境中安裝了這些庫。

       比如有一個PDF文件中有一個企業信息的表格,用這種辦法將信息提取出來:

import tabula

df = tabula.read_pdf("E:\\test\\cb7b5.pdf", encoding='gbk', pages='all')
print(df)
for indexs in df.index:
    # 遍歷打印企業名稱
    print(df.loc[indexs].values[1].strip())

4. pdf2htmlEX

      這個包的作用是將pdf格式轉換成html格式;

import subprocess

subprocess.call('"D:\Program Files (x86)\pdf2htmlEX-win32-0.14.6-upx-with-poppler-data\pdf2htmlEX.exe"  
--dest-dir E:\\test\extract\\2017gq\\out  E:\\test\extractb7b5.pdf', shell=True)

      整體轉換的效果非常不錯,但是轉換後的標籤沒有特點,使數據的提取變得非常困難。

5. 殺手鐗

      如果上面的所有辦法效果都不太好的話,可以考慮使用付費的軟件,因爲很多工具可以將PDF轉換爲其它格式的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章