广告位联系
返回顶部
分享到

教你用Python提取PPT中的图片

python 来源:互联网 作者:秩名 发布时间:2023-01-19 21:45:29 人浏览
摘要

一、前言 今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到别人的模板或者素材,这个时候提取PPT图片就

一、前言

今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到别人的模板或者素材,这个时候提取PPT图片就可以减少我们很多工作。

二、实现原理

其实实现原理很简单,我们的pptx文件其实是一个压缩包。我们可以直接修改pptx文件的后缀,改成zip然后解压,比如下面这个:

BTH0Q0$4CJH0}2VQP~06KH1.png

这是解压后的文件。我们可以在ppt目录下找到一个media目录,这个目录下就是我们要的图片的。这个目录包含了PPT的所有多媒体文件。

知道这点后,我们就可以选择用Python来解压出PPT中的media目录就可以提取出所有图片了。

三、提取PPT中的图片

1、打开压缩包

在Python中提供了一个zipfile模块用于处理压缩包文件。我们来看看它的简单操作:

1

2

3

4

5

6

7

8

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、解压文件

我们还可以通过下面的方式打开压缩包:

1

2

3

4

from zipfile import ZipFile

with ZipFile("test.pptx") as f:

    for file in f.namelist():

        print(file)

通过with语句,就可以不显示地调用close方法。下面我们看看解压操作:

1

2

3

4

5

from zipfile import ZipFile

with ZipFile("test.pptx") as f:

    for file in f.namelist():

        # 解压文件

        f.extract(file, path="unzip")

解压文件的操作通过f.extract来实现,这里传入了两个参数,分别是压缩包文件,和解压路径,如果压缩包有密码还需要传入解压密码。

然后我们还需要判断一下,如果是媒体目录我们才解压。我们添加一点代码:

1

2

3

4

5

6

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中的图片

我们把上面代码再完善一下:

1

2

3

4

5

6

7

8

9

10

11

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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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()]

代码分析:

1

presentation = pptx.Presentation(fp)

实例化ppt对象,只有实例化Presentation对象才能操作ppt,通过此对象可以访问其他类的接口。

通过presentation访问幻灯片presentation.slides,slides是由每一个幻灯片对象组成的列表。

通过幻灯片对象slide访问包含在此幻灯片上的形状对象shape,如文本框,表格,图片等

1

if shape.has_text_frame

判断形状对象是否为文本对象

1

2

3

4

5

for paragraph in shape.text_frame.paragraphs:

    part = []

    for run in paragraph.runs:

        part.append(run.text)

    results.append(''.join(part))

获取文本框的文本,文本框中也会出现多个段落内容

1

2

3

elif isinstance(shape, Picture):

    content = self.parsepic.request_api(shape.image.blob)

    results.append(''.join(content))

判断是否为图片对象或者艺术字对象,这里是调用百度图片提取文字的接口来提取PPT中包含在图片中的文字。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/ZackSock/article/details/120539753
相关文章
  • pandas实战:分析三国志人物的实现

    pandas实战:分析三国志人物的实现
    简介 背景 Pandas 是 Python 的一个工具库,用于数据分析。 由 AQR Capital Management 于 2008 年 4 月开发,2009 年开源,最初被作为金融数据分析工具
  • 教你用Python提取PPT中的图片

    教你用Python提取PPT中的图片
    一、前言 今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到
  • Python3微信支付(小程序支付)V3接口的实现
    起因: 因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付
  • YOLOv8训练自己的数据集(详细教程)

    YOLOv8训练自己的数据集(详细教程)
    等了好久终于等到了V8,赶紧测测效果,放张官网的比对图 官网链接 https://github.com/ultralytics/ultralytics 再下载自己所需要的权重 https://githu
  • Pandas读取csv的实现介绍
    对于文件的操作中,读写csv操作是一个比较常见的操作,很多时候可能会选择使用python中的文件读取的方式对csv文件操作,这种方式并没有
  • PyQt5使用pyqtgraph绘制波形图

    PyQt5使用pyqtgraph绘制波形图
    主程序代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
  • Python+Pygame编写一个Pong游戏

    Python+Pygame编写一个Pong游戏
    这次,我们要用Pygame写一个Pong游戏 先看看效果: 需要的模块:Pygame 在python文件同目录下新建resources文件夹,在文件夹中新建Pong文件夹,文
  • 简单有效上手Python3异步asyncio问题
    Python3异步asyncio问题 官方文档: https://docs.python.org/zh-cn/3/library/asyncio-task.html#asyncio.run 看了一大堆相关的资料和教程,针对的Python版本不同,
  • python提取xml指定内容的方法
    第一种方法:python操作xml文件 随手找了一个xml文件内容(jenkins相关文件) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  • 22个Python的万用公式总结分享

    22个Python的万用公式总结分享
    在大家的日常python程序的编写过程中,都会有自己解决某个问题的解决办法,或者是在程序的调试过程中,用来帮助调试的程序公式。 小编
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计