首頁 > 軟體

一步步教你用Python提取PPT中的圖片

2023-01-18 14:01:31

一、前言

今天要帶大家實現的是PPT圖片的提取。在我們學習工作中,PPT的使用還是非常頻繁的,但是自己做PPT是很麻煩的,所以就需要用到別人的模板或者素材,這個時候提取PPT圖片就可以減少我們很多工作。

二、實現原理

其實實現原理很簡單,我們的pptx檔案其實是一個壓縮包。我們可以直接修改pptx檔案的字尾,改成zip然後解壓,比如下面這個:

這是解壓後的檔案。我們可以在ppt目錄下找到一個media目錄,這個目錄下就是我們要的圖片的。這個目錄包含了PPT的所有多媒體檔案。

知道這點後,我們就可以選擇用Python來解壓出PPT中的media目錄就可以提取出所有圖片了。

三、提取PPT中的圖片

1、開啟壓縮包

在Python中提供了一個zipfile模組用於處理壓縮包檔案。我們來看看它的簡單操作:

from zipfile import ZipFile
# 開啟壓縮檔案
f = ZipFile("test.pptx")
# 檢視壓縮包所有檔案
for file in f.namelist():
    print(file)
# 關閉壓縮包檔案
f.close()

輸出的部分結果如下:

[Content_Types].xml
_rels/.rels
ppt/presentation.xml
ppt/slides/_rels/slide2.xml.rels
ppt/slides/slide1.xml
ppt/slides/slide2.xml
ppt/slides/slide3.xml

可以看到我們列印出了壓縮包的檔案。

2、解壓檔案

我們還可以通過下面的方式開啟壓縮包:

from zipfile import ZipFile
with ZipFile("test.pptx") as f:
    for file in f.namelist():
        print(file)

通過with語句,就可以不顯示地呼叫close方法。下面我們看看解壓操作:

from zipfile import ZipFile
with ZipFile("test.pptx") as f:
    for file in f.namelist():
        # 解壓檔案
        f.extract(file, path="unzip")

解壓檔案的操作通過f.extract來實現,這裡傳入了兩個引數,分別是壓縮包檔案,和解壓路徑,如果壓縮包有密碼還需要傳入解壓密碼。

然後我們還需要判斷一下,如果是媒體目錄我們才解壓。我們新增一點程式碼:

from zipfile import ZipFile
with ZipFile("test.pptx") as f:
    for file in f.namelist():
        # 如果是media目錄下的檔案就解壓
        if file.startswith("ppt/media/"):
            f.extract(file, path="unzip")

這樣我們就實現了PPT圖片的提取。

四、提取PPT中的圖片

我們把上面程式碼再完善一下:

import os
from zipfile import ZipFile
# 解壓目錄
unzip_path = "unzip"
# 如果解壓目錄不存在則建立
if not os.path.exists(unzip_path):
    os.mkdir(unzip_path)
with ZipFile("test1/test.pptx") as f:
    for file in f.namelist():
        if file.startswith("ppt/media/"):
            f.extract(file, path=unzip_path)

這裡我們就是新增了一個解壓目錄的建立,這樣我們執行的時候就不會因為目錄不存在而報錯了。

另外,其實我們手動解壓然後提取PPT中的圖片也是很方便的,也並不會比程式慢。

附:python提取PPT中的文字(包括圖片中的文字)

很多人都知道,Python可以操作Excel,PDF·還有PPT,這篇文章就圍繞Python提取PPT中的文字來寫,包括提取PPT中的藝術字,圖片中的文字。

因為實現環境是linux,所以無法用win32com來實現這個需求,使用extract庫也可以提取PDF,PPT等檔案中的文字,但這裡不用extract來實現,用python-pptx,如果熟悉extract庫一點的也知道,extract中也使用了python-pptx,實現過程也是呼叫了python-pptx。

presentation = pptx.Presentation(fp)
results = []
for slide in presentation.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            for paragraph in shape.text_frame.paragraphs:
                part = []
                for run in paragraph.runs:
                    part.append(run.text)
                results.append(''.join(part))
        elif isinstance(shape, Picture):
            content = self.parsepic.request_api(shape.image.blob)
            results.append(''.join(content))
results = [line for line in results if line.strip()]

程式碼分析:

presentation = pptx.Presentation(fp)

範例化ppt物件,只有範例化Presentation物件才能操作ppt,通過此物件可以存取其他類的介面。

通過presentation存取幻燈片presentation.slides,slides是由每一個幻燈片物件組成的列表。

通過幻燈片物件slide存取包含在此幻燈片上的形狀物件shape,如文字方塊,表格,圖片等

if shape.has_text_frame

判斷形狀物件是否為文字物件

for paragraph in shape.text_frame.paragraphs:
    part = []
	for run in paragraph.runs:
		part.append(run.text)
	results.append(''.join(part))

獲取文字方塊的文字,文字方塊中也會出現多個段落內容

elif isinstance(shape, Picture):
    content = self.parsepic.request_api(shape.image.blob)
    results.append(''.join(content))

判斷是否為圖片物件或者藝術字物件,這裡是呼叫百度圖片提取文字的介面來提取PPT中包含在圖片中的文字。

    def request_api(self, img_data):
        url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic'
        # 高進度版
        # url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic'
        postdata = {
            'language_type': 'CHN_ENG',  # 中英文混合
            'detect_direction': 'true',
            'image': base64.b64encode(img_data)
        }
        headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': random.choice(USER_AGENT['pc'])
        }
        r = requests.post(url, params={'access_token': self.get_token()}, data=postdata, headers=headers).json()
        if r.get('error_code'):
            raise Exception(r['error_msg'])
        return [item['words'] for item in r['words_result']]

需要註冊一個賬號,並且開通圖片提取文字的服務,獲取APPKEY, APPSECRETKEY,從而獲取到token,具體介面詳情看百度開發者檔案。

python-pptx官方檔案:https://python-pptx.readthedocs.io/en/latest/api/slides.html#pptx.slide.Slides

總結

到此這篇關於用Python提取PPT中的圖片的文章就介紹到這了,更多相關Python提取PPT的圖片內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com