Python將PDF轉為TXT


PDFMiner----python的PDF解析器和分析器

1.官方文檔:http://www.unixuser.org/~euske/python/pdfminer/index.html

2.特征   

  • 完全使用python編寫。 (適用於2.4或更新版本)   
  • 解析,分析,並轉換成PDF文檔。  
  • PDF-1.7規范的支持。 (幾乎)   
  • 中日韓語言和垂直書寫腳本支持。   
  • 各種字體類型(Type1、TrueType、Type3,和CID)的支持。    
  • 基本加密(RC4)的支持。     
  • PDF與HTML轉換。  
  • 綱要(TOC)的提取。    
  • 標簽內容提取。     
  • 通過分組文本塊重建原始的布局。

3.安裝

注:使用源碼安裝,並且處理中日韓語言的時候還需要一個額外的安裝步驟

4.用法

4.1解析pdf文件用到的類:

  • PDFParser:從一個文件中獲取數據
  • PDFDocument:保存獲取的數據,和PDFParser是相互關聯的
  • PDFPageInterpreter處理頁面內容
  • PDFDevice將其翻譯成你需要的格式
  • PDFResourceManager用於存儲共享資源,如字體或圖像。

PDFMiner的類之間的關系圖:

http://www.unixuser.org/~euske/python/pdfminer/objrel.png

 

4.2基本用法

4.2.1解析pdf文件

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
  
  
fp = open('mypdf.pdf', 'rb')
#創建一個PDF文檔解析器對象
parser = PDFParser(fp)
#創建一個PDF文檔對象存儲文檔結構
#提供密碼初始化,沒有就不用傳該參數
document = PDFDocument(parser, password)
#檢查文件是否允許文本提取
if not document.is_extractable:
    raise PDFTextExtractionNotAllowed
#創建一個PDF資源管理器對象來存儲共享資源
rsrcmgr = PDFResourceManager()
#創建一個pdf設備對象
device = PDFDevice(rsrcmgr)
#創建一個PDF解析器對象
interpreter = PDFPageInterpreter(rsrcmgr, device)
#處理文檔當中的每個頁面
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)

 當然這只是進行解析,還可進行布局分析,我的數據就是從這一步的到的

4.2.2布局分析

首先對第一步的代碼進行修改和增加

from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator

# 設定參數進行分析
laparams = LAParams()
# 創建一個PDF頁面聚合對象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    # 接收該頁面的LTPage對象
    layout = device.get_result() 

布局分析返回的PDF文檔中的每個頁面LTPage對象。這個對象和頁內包含的子對象,形成一個樹結構

如圖所示:

http://www.unixuser.org/~euske/python/pdfminer/layout.png

  • LTPage :表示整個頁。可能會含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子對象。
  • LTTextBox:表示一組文本塊可能包含在一個矩形區域。注意此box是由幾何分析中創建,並且不一定
    表示該文本的一個邏輯邊界。它包含LTTextLine對象的列表。使用 get_text()方法返回的文本內容。
  • LTTextLine :包含表示單個文本行LTChar對象的列表。字符對齊要么​​水平或垂直,取決於文本的寫入模式。
    get_text()方法返回的文本內容。
  • LTChar
  • LTAnno:在文本中實際的字母表示為Unicode字符串(?)。需要注意的是,雖然一個LTChar對象具有實際邊界,
    LTAnno對象沒有,因為這些是“虛擬”的字符,根據兩個字符間的關系(例如,一個空格)由布局分析后插入。
  • LTImage:表示一個圖像對象。嵌入式圖像可以是JPEG或其它格式,但是目前PDFMiner沒有放置太多精力在圖形對象。
  • LTLine:代表一條直線。可用於分離文本或附圖。
  • LTRect:表示矩形。可用於框架的另一圖片或數字。
  • LTCurve:表示一個通用的Bezier曲線

4.2.3獲得目錄(綱要)

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument

# Open a PDF document.
fp = open('mypdf.pdf', 'rb')
parser = PDFParser(fp)
document = PDFDocument(parser, password)

# Get the outlines of the document.
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
    print (level, title)

5.個人使用

# -*- coding: utf-8 -*-   
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator
import os
os.chdir(r'F:\test')
fp = open('python.pdf', 'rb')
#來創建一個pdf文檔分析器
parser = PDFParser(fp)  
#創建一個PDF文檔對象存儲文檔結構
document = PDFDocument(parser)
# 檢查文件是否允許文本提取
if not document.is_extractable:
    raise PDFTextExtractionNotAllowed
else:
    # 創建一個PDF資源管理器對象來存儲共賞資源
    rsrcmgr=PDFResourceManager()
    # 設定參數進行分析
    laparams=LAParams()
    # 創建一個PDF設備對象
    # device=PDFDevice(rsrcmgr)
    device=PDFPageAggregator(rsrcmgr,laparams=laparams)
    # 創建一個PDF解釋器對象
    interpreter=PDFPageInterpreter(rsrcmgr,device)
    # 處理每一頁
    for page in PDFPage.create_pages(document):
        interpreter.process_page(page)
        # 接受該頁面的LTPage對象
        layout=device.get_result()
        for x in layout:
            if(isinstance(x,LTTextBoxHorizontal)):
                with open('a.txt','a') as f:
                    f.write(x.get_text().encode('utf-8')+'\n')

 文章轉自:http://www.bkjia.com/Pythonjc/1073800.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM