轉(zhuǎn)https://blog.csdn.net/robolinux/article/details/43318229
原文地址: http://euske.github.io/pdfminer/programming.html
軟件版本:pdfminer-20140328
翻譯:robolinux
時間:20150110
概覽:
PDF格式不是規(guī)范格式. 盡管它被叫做"PDF文檔", 但并不像word或者html文檔。PDF的表現(xiàn)更像一張圖片。PDF更像是在一張紙的各個準確的位置上把內(nèi)容都擺放出來。大部分情況下,沒有邏輯結(jié)構(gòu),比如句子或段落,并且不能自適應(yīng)頁面大小的調(diào)整。PDFMiner嘗試通過猜測它們的布局來重建它們的結(jié)構(gòu),但是不保證一定能工作。我知道這樣很難看,但是,PDF確實不夠規(guī)范。
更多關(guān)于PDF內(nèi)部結(jié)構(gòu)的技術(shù)詳情,請見《如何手工提取PDF內(nèi)容》。
http://www.youtube.com/watch?v=k34wRxaxA_c http://www.youtube.com/watch?v=_A1M4OdNsiQ http://www.youtube.com/watch?v=sfV_7cWPgZE
由于PDF文件有如此大和復(fù)雜的結(jié)構(gòu),完整解析PDF文件很費時費力。好吧,大多數(shù)PDF工作中,很多模塊是不需要加進來的。因此 PDFMiner 采用了一個懶惰分析的策略,就是只分析所需要的部分。解析時候,至少需要2個核心類,PDFParser 和 PDFDocument。這兩個模塊配合其他模塊來使用。
PDFParser 從文件中獲取數(shù)據(jù)
PDFDocument 存儲文檔數(shù)據(jù)結(jié)構(gòu)到內(nèi)存中
PDFPageInterpreter 解析page內(nèi)容
PDFDevice 把解析到的內(nèi)容轉(zhuǎn)化為你需要的東西
PDFResourceManager存儲共享資源,例如字體或圖片
下圖顯示了PDFMiner中各個類之間的關(guān)系。
基本用法:
下面是解析pdf的一個典型方法:
#!/usr/bin/python
#--*-- 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 LAParams
from pdfminer.converter import PDFPageAggregator
password = ''
#打開pdf文件
fp = open('test.pdf','rb')
#從文件句柄創(chuàng)建一個pdf解析對象
parser = PDFParser(fp)
#創(chuàng)建pdf文檔對象,存儲文檔結(jié)構(gòu)
document = PDFDocument(parser,password)
#創(chuàng)建一個pdf資源管理對象,存儲共享資源
rsrcmgr = PDFResourceManager()
#創(chuàng)建一個device對象
device = PDFDevice(rsrcmgr)
#創(chuàng)建一個解釋對象
interpreter = PDFPageInterpreter(rsrcmgr, device)
#處理包含在文檔中的每一頁
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
通過布局分析:
#!/usr/bin/python
#--*-- 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 LAParams
from pdfminer.converter import PDFPageAggregator
password = ''
#打開pdf文件
fp = open('test.pdf','rb')
#從文件句柄創(chuàng)建一個pdf解析對象
parser = PDFParser(fp)
#創(chuàng)建pdf文檔對象,存儲文檔結(jié)構(gòu)
document = PDFDocument(parser,password)
#創(chuàng)建一個pdf資源管理對象,存儲共享資源
rsrcmgr = PDFResourceManager()
laparams = LAParams()
#創(chuàng)建一個device對象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
#創(chuàng)建一個解釋對象
interpreter = PDFPageInterpreter(rsrcmgr, device)
#處理包含在文檔中的每一頁
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
layout = device.get_result()
布局分析把pdf文檔中每一頁返回為一個 LTPage 對象. 該對象包含該頁面中的子對象,格式化為樹形結(jié)構(gòu)。
下圖顯示了這些對象之間的關(guān)系。
LTPage
代表一個完整的頁面??梢园訉ο?,例如LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine.
LTTextBox
它包含 LTTextLine 對象的列表
代表一組被包含在矩形區(qū)域中的文本
需要注意的是,該box是根據(jù)幾何學(xué)分析得到的,并不一定準確地表現(xiàn)為該文本的邏輯范圍
get_text()方法可以返回文本內(nèi)容
LTTextLine
包含一個LTChar對象的列表,表現(xiàn)為單行文本
字符表現(xiàn)為一行或一列,取決于文本書寫方式
get_text()方法返回文本內(nèi)容
LTChar / LTAnno
代表一個在文本中的真實的字母,作為一個unicode字符串
LTChar 對象有真實的分隔符
LTAnno 對象沒有,是虛擬分隔符,按照兩個字符之間的關(guān)系,布局分析器插入虛擬分隔符
LTFigure
代表一個被PDF Form對象使用的區(qū)域
pdf form適用于目前的圖表(present figures)或者頁面中植入的另一個pdf文檔圖片。LTFigure對象可以遞歸
LTImage
代表一個圖形對象。可以是JPEG或者其他格式,但PDFMiner目前沒有花太多精力在圖形對象上。
LTLine
代表一根直線。用來分割文本或圖表(figures)。
LTRect
代表一個矩形。
用來框住別的圖片或者圖表。
LTCurve
代表一個貝塞爾曲線。
也可以從下面URL獲得更多完整的示例。
http://denis.papathanasiou.org/?p=343
獲得目錄
PDFMiner支持訪問文檔目錄的功能。
#!/usr/bin/python
#--*-- coding:utf-8 --*--
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
password = ''
fp = open('PURCHASE ORDER-62142.pdf','rb')
parser = PDFParser(fp)
document = PDFDocument(parser,password)
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
print (level, title)
PDF文檔沒有目錄時會報:
raise PDFNoOutlines
pdfminer.pdfdocument.PDFNoOutlines
一些pdf文檔使用頁號作為目錄指向,另外的文檔則使用頁號和頁面中的物理位置。由于pdf文檔沒有邏輯結(jié)構(gòu),并且不支持從外部指向頁內(nèi)對象,所以沒有辦法準確告知這些目錄指向文本的哪一部分。
擴展功能
你可以擴展PDFPageinterpreter類和PDFDevice類以便進行不同的加工,或者獲得其他信息。