Python 第三方模塊之 PDFMiner(pdf信息提取)

PDFMiner簡介

pdf提取目前的解決方案大致只有pyPDF和PDFMiner。據說PDFMiner更適合文本的解析,首先說明的是解析PDF是非常蛋疼的事,即使是PDFMiner對于格式不工整的PDF解析效果也不怎么樣,所以連PDFMiner的開發者都吐槽PDF is evil. 不過這些并不重要。

PDFMiner是一個可以從PDF文檔中提取信息的工具。與其他PDF相關的工具不同,它注重的完全是獲取和分析文本數據。PDFMiner允許你獲取某一頁中文本的準確位置和一些諸如字體、行數的信息。它包括一個PDF轉換器,可以把PDF文件轉換成HTML等格式。它還有一個擴展的PDF解析器,可以用于除文本分析以外的其他用途。

PDFMiner內置兩個好用的工具:pdf2txt.py和dumppdf.py

  • pdf2txt.py從PDF文件中提取所有文本內容。但不能識別畫成圖片的文本,這需要特征識別。對于加密的PDF你需要提供一個密碼才能解析,對于沒有提取權限的PDF文檔你得不到任何文本。
  • dumppdf.py把PDF文件內容變成pseudo-XML格式。這個程序主要用于debug,但是它也可能用于提取一些有意義的內容(比如圖片)。

PDFMiner在python2中名為PDFMiner,在python3中名為PDFMiner3k,分別上鏈接

PDFMiner? 官方主頁:https://euske.github.io/pdfminer/
PDFMiner? github主頁:https://github.com/euske/pdfminer

pdfminer3k? 官方主頁:https://pypi.org/project/pdfminer3k/
pdfminer3k? github主頁:https://github.com/jaepil/pdfminer3k

解析pdf文件用到的類:

  • PDFParser:PDF文檔分析器:從一個文件中獲取數據
  • PDFDocument:PDF文檔對象:保存獲取的數據,和PDFParser是相互關聯的
  • PDFPageInterpreter:PDF文檔解析器:處理頁面內容,變成Python可以解析
  • PDFResourceManager:PDF資源管理器:用于存儲共享資源,如字體或圖像。
  • PDFDevice: 將其翻譯成你需要的格式
  • LAParams:PDF參數分析器:分析pdf文件參數
  • PDFPageAggregator:PDF聚合器:讀取獲取的文檔對象

他們之間的關系圖如下:

?

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

?

  • 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曲線

一個簡單的示例

# encoding: utf-8
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 PDFTextExtractionNotAllowedpath ="C:\\Users\\admin\\Desktop\\t.pdf"
def parse():fp = open(path, 'rb') #用文件對象來創建一個pdf文檔分析器PDFParserpraser = PDFParser(fp)# 創建一個PDF文檔PDFDocumentdoc = PDFDocument()# 連接分析器 與文檔對象praser.set_document(doc)doc.set_parser(praser)# 提供初始化密碼,如果沒有密碼 就創建一個空的字符串doc.initialize()# 檢測文檔是否提供txt轉換,不提供就忽略if not doc.is_extractable:raise PDFTextExtractionNotAllowedelse:# 創建PDf 資源管理器 來管理共享資源PDFResourceManagerrsrcmgr = PDFResourceManager()# 創建一個PDF設備對象LAParamslaparams = LAParams()# 創建聚合器,用于讀取文檔的對象PDFPageAggregatordevice = PDFPageAggregator(rsrcmgr, laparams=laparams)# 創建一個PDF解釋器對象,對文檔編碼,解釋成Python能夠識別的格式:PDFPageInterpreterinterpreter = PDFPageInterpreter(rsrcmgr, device)# 循環遍歷列表,每次處理一個page的內容for page in doc.get_pages(): # doc.get_pages() 獲取page列表# 利用解釋器的process_page()方法解析讀取單獨頁數interpreter.process_page(page)# 這里layout是一個LTPage對象,里面存放著這個page解析出的各種對象,一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal等等,想要獲取文本就獲得對象的text屬性,# 使用聚合器get_result()方法獲取頁面內容layout = device.get_result()for x in layout:if (isinstance(x, LTTextBoxHorizontal)):#需要寫出編碼格式with open(r'C:\Users\admin\Desktop\1.txt', 'a',encoding='utf-8') as f:results = x.get_text()f.write(results + '\n')if __name__ == '__main__':parse()

或者使用官方的一個例子,簡單寫如下

rsrcmgr = PDFResourceManager(caching=caching)    # 創建一個PDF資源管理器對象來存儲共賞資源
outfp = io.open(outfile, 'wt', encoding=codec, errors='ignore')    #指定outfile
device = XMLConverter(rsrcmgr, outfp, laparams=laparams, outdir=outdir)
fp = io.open(file, 'rb')     #來創建一個pdf文檔分析器
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True)   #調用process_pdf
fp.close()
device.close()
outfp.close()
參考鏈接:
https://blog.csdn.net/liuqingpeng_1/article/details/79560753
https://www.zhangshengrong.com/p/Z9a2AAy1Vk/
https://blog.csdn.net/qq_29750461/article/details/80011255
https://blog.csdn.net/sinat_37967865/article/details/80145487

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TFS2017持續發布中調用PowerShell啟停遠程應用程序

目前團隊項目中有多個Web、服務以及與大數據平臺對接接口等應用,每次的發布和部署采用手工的方式進行。停止應用程序,拷貝發布包,啟動應用程序,不停的循環著,并且時不時地會出現一些人為錯誤性問題。這種模式消耗的很多…

Flask 多線程

參數 app.run()中可以接受兩個參數,分別是threaded和processes,用于開啟線程支持和進程支持。 threaded: 是否開啟多線程,默認不開啟。 if __name__ __main__:app.run(threadedTrue)processes:進程數量&#xff0c…

40天python入門教程_Python入門教程超詳細1小時學會Python

Java和Javascript,不用1小時你就可以用Python快速流暢地寫有用的Python程序.為什么使用Python假設我們有這么一項任務:簡單測試局域網中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windo…

基于LVS對LAMP做負載均衡集群

一、簡介 LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要…

Python_Day1

1、猜年齡游戲: (1):每循環3次,counter值返回為0,重新開始循環;(2):continue 意思是跳出當前循環;(3)&#xff1…

kafka 入門

初識 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司開發的,它是一個分布式的,支持多分區、多副本,基于 Zookeeper 的分布式消息流平臺,它同時也是一款開源的 基于發布訂閱模式的消息引擎系統。 Kafka 的基本術語 消息&#xf…

實體詞典 情感詞典_tidytextpy包 | 對三體進行情感分析

騰訊課堂 | Python網絡爬蟲與文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析庫 但是tidytext不夠完善,我在tidytext基礎上增加了情感詞典,可以進行情感計算,為了區別前者,將其命名為tidytextpy。大家有時間…

TensorFlow實現LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 獲取mnist數據mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注冊默認session 后面操作無需指定session 不同sesson之間的數據是獨立…

Python基礎第一天

一、內容 二、練習 練習1 題目&#xff1a;使用while循環輸出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 圖示&#xff1a; 代碼&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1輸出結果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上傳下載 api_Flask 文件下載API

給前端提供一個文件下載接口時, 遇到了文件名亂碼的問題, 幾經折騰總算實現效果, 代碼如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL實用開源代碼列表

有了網絡的最大好處就是可以資源共享。網絡是最大的知識庫&#xff0c;也是最好的老師&#xff0c;正所謂“沒有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戲編程&#xff0c;OpenGL 3D編程相關的免費擴展庫資料。不斷更新中&#xff0c;如果你有好的建義&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少個衛星&#xff0c;那么就是有 最多有S-1個通道&#xff01; 然后將最小生成樹中的后邊的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 匯總

簡介 python連接kafka的標準庫&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比較成熟的庫&#xff0c;kafka-python并沒有zk的支持。pykafka是Samsa的升級版本&#xff0c;使用samsa連接zookeeper&#xff0c;生產者直接連接kafka服務器列表&#xff0c;消費者…

scp選擇二進制_二進制傳輸與文本傳輸區別

Ftp&#xff0c;winscp等工具下載文件時候有選項&#xff0c;可選的有二進制方式和文本方式。文本方式又稱為ASCII方式兩者區別如下。ASCII 方式和BINARY方式的區別是回車換行的處理&#xff0c;binary方式不對數據執行任何處理&#xff0c;ASCII 方式將回車換行轉換為本機的回…

在ffmpeg中加入x264模塊

引言&#xff1a;最近一直致力于多媒體應用開發&#xff0c;一說起編碼解碼就不得不說下FFmpeg。FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發是基于Linux操作系統&#xff0c;但是可以在大多數操作系統中編譯和使用。下面就詳細介…

RabbitMQ實例教程:發布/訂閱者消息隊列

消息交換機&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生產者永遠不會直接發送任何消息給隊列&#xff0c;一般的情況生產者甚至不知道消息應該發送到哪些隊列。 相反的&#xff0c;生產者只能發送消息給交換機&#xff08;Exchange&#xff09;。交換機的…

OAuth 2.0(網轉)

&#xff08;一&#xff09;背景知識 OAuth 2.0很可能是下一代的“用戶驗證和授權”標準&#xff0c;目前在國內還沒有很靠譜的技術資料。為了弘揚“開放精神”&#xff0c;讓業內的人更容易理解“開放平臺”相關技術&#xff0c;進而長遠地促進國內開放平臺領域的發展&#xf…

kafka 自動提交 和 手動提交

Consumer 需要向 Kafka 匯報自己的位移數據&#xff0c;這個匯報過程被稱為提交位移&#xff08;Committing Offsets&#xff09;。因為 Consumer 能夠同時消費多個分區的數據&#xff0c;所以位移的提交實際上是在分區粒度上進行的&#xff0c;即 Consumer 需要為分配給它的每…

axios vue 回調函數_vue中ajax請求與axios包完美處理

這次給大家帶來vue中ajax請求與axios包完美處理&#xff0c;vue中ajax請求與axios包處理的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。在vue中&#xff0c;經常會用到數據請求&#xff0c;常用的有&#xff1a;vue-resourse、axios今天我說的是axio…

用int還是用Integer?

昨天例行code review時大家有討論到int和Integer的比較和使用。 這里做個整理&#xff0c;發表一下個人的看法。【int和Integer的區別】int是java提供的8種原始類型之一&#xff0c;java為每個原始類型提供了封裝類&#xff0c;Integer是int的封裝類。int默認值是0&#xff0c;…