python提取word文件中的图片并上传阿里云OSS

 更新时间:2021年12月22日 15:51:20   作者:梦想橡皮擦  
这篇文章主要介绍了通过Python提取Word文件中的所有图片,并将其上传至阿里云OSS。文中的示例代码对学习Python有一定的帮助,快跟随小编一起学习一下吧

该需求是一个真实的实战需求,如果你的公司在做题库类的系统,一定会涉及该方面的内容,所以收藏起来吧。

需求简单描述如下所示:

1.提取 Word(为了便于解决,统一格式为 docx)中的题干/选项图片;

2.将其传递到云 OSS 上,并返回图片地址;

3.部分场景,需要将其拼接为 HTML 的 img 标签进行返回。

实操环节

首先你需要准备好云OSS的 AccessKeyId 和 AccessKeySecret ,这两个值一般由运维工程师提供给你,如果你的公司比较小,没有运维岗位,那就需要自己去申请并进行配置啦。

云 OSS 的购买和设置的流程非常简单,创建一个 Bucket 之后,就可以使用了。

然后点击创建好的 Bucket ,进行权限设置,选择公共读即可。

接下来在 Python 文件中编写如下代码,并测试是否可以返回 Bucket 对象,下述的字符串一定要写准确,任意内容错误都会报错,导致 oss 无法链接。

AccessKeyId = '你的 AccessKeyId'
AccessKeySecret = '你的 AccessKeySecret'
oos_auth = oss2.Auth(AccessKeyId, AccessKeySecret)
endpoint = 'http://oss-cn-beijing.aliyuncs.com'

bucket = oss2.Bucket(oos_auth, endpoint, 'Bucket 名称')  
print(bucket)

上述字符串的值,可以在云 OSS 的概览中找到,如下图所示。

接下来就进入 Word 图片的环节,读取文件依旧使用第三方模块, python-docx 。

在正式开始前,需要准备好一个测试用的 Word 文档,可以参考下图设置 Word 文档的内容。

首先通过 python-docx 读取文档中的所有行 paragraphs ,使用如下代码:

import oss2
import time

from docx import Document

def get_questions():
    document = Document(docx='测试 Word 文档.docx')
    for p in document.paragraphs:
        print(p.text)

if __name__ == '__main__':
    get_questions()

上述代码重点为 document.paragraphs ,调用该属性将逐段落返回文档内容,然后再通过对象的 .text 属性,输出里面的文字。

此时的代码无法获取到段落中的图片,可以使用下述代码进行提取。

import oss2
import time

from docx import Document

# 获取 Word 文档中的图片
def get_picture(document, paragraph):
    img = paragraph._element.xpath('.//pic:pic')
    if not img:
        return
    img = img[0]
    embed = img.xpath('.//a:blip/@r:embed')[0]
    related_part = document.part.related_parts[embed]
    image = related_part.image
    return image

def get_questions():
    document = Document(docx='测试 Word 文档.docx')

    for p in document.paragraphs:
    	# 读取图片
        img = get_picture(document, p)

        print(img)
        if img is not None:
        	# 输出图片名
            print(img.filename)
            # 输出图片后缀
            print(img.ext)
            # 输出图片的二进制流
        	# print(img.blob)
        print(p.text)

if __name__ == '__main__':
    get_questions()

在上述代码中,最重要的函数为 get_picture() 函数,核心逻辑是由于 docx 文档是一种 xml 结构,通过 paragraph._element.xpath() 方法可以进行数据提取。

读取数据的结果如下所示:

在上文的注释中,还存在一个图片属性 img.blob ,即读取图片的二进制流。

拿该文件流即可写入云 OSS,然后拼接图片的访问路径,最后将其拼接到 img 标签中即可。

import oss2
import time

from docx import Document

# 获取 Word 文档中的图片
def get_picture(document, paragraph):
    img = paragraph._element.xpath('.//pic:pic')
    if not img:
        return
    img = img[0]
    embed = img.xpath('.//a:blip/@r:embed')[0]
    related_part = document.part.related_parts[embed]
    image = related_part.image
    return image

def ret_up_imgurl(image):
    blob = image.blob
    # 后缀
    ext = image.ext

    AccessKeyId = '你的 AccessKeyId'
    AccessKeySecret = '你的 AccessKeySecret '
    oos_auth = oss2.Auth(AccessKeyId, AccessKeySecret)
    endpoint = 'http://oss-cn-beijing.aliyuncs.com'

    bucket = oss2.Bucket(oos_auth, endpoint, 'Bucket 名称')  

    base_file_url = 'https://Bucket 名称.oss-cn-beijing.aliyuncs.com/'
    # 获取一个文件名
    file_name = str(int(time.time())) + "." + ext
    # 上传二进制流
    res = bucket.put_object(file_name, blob)
    if res.status == 200:
    	# 返回标签
        img_format = '<img src="{}" />'
        return img_format.format(base_file_url + file_name)
    else:
        return False

def get_questions():
    document = Document(docx='测试 Word 文档.docx')

    for p in document.paragraphs:
        print(p.text)
        img = get_picture(document, p)

        print(img)
        if img is not None:
            print(img.filename)
            print(img.ext)
            ret_up_imgurl(img.blob)

if __name__ == '__main__':
    get_questions()

上述代码重点部分在 bucket.put_object(file_name, blob) ,该方法将图片二进制流传递到OSS空间。 

到此这篇关于python提取word文件中的图片并上传阿里云OSS的文章就介绍到这了,更多相关python提取word文件中的图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 操作hive pyhs2方式

    python 操作hive pyhs2方式

    今天小编就为大家分享一篇python 操作hive pyhs2方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python Pandas中的分组聚合操作详解

    Python Pandas中的分组聚合操作详解

    Pandas是Python中用于数据分析的重要工具,提供了丰富的数据操作方法,本文将介绍 Pandas 中的数据分组方法以及不同的聚合操作,感兴趣的小伙伴可以学习一下
    2023-11-11
  • python-sys.stdout作为默认函数参数的实现

    python-sys.stdout作为默认函数参数的实现

    今天小编就为大家分享一篇 python-sys.stdout作为默认函数参数的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 教你用python实现一个加密的文字处理器

    教你用python实现一个加密的文字处理器

    生活中有时候我们需要对一些重要的文件进行加密,下面这篇文章主要给大家介绍了关于如何用python实现一个加密文字处理器的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python 无监督生成模型的示例

    python 无监督生成模型的示例

    无监督生成模型在机器学习中扮演着重要角色,特别是当我们在没有标签数据的情况下想要生成新的样本或理解数据的内在结构时,这篇文章主要介绍了python 无监督生成模型的示例,需要的朋友可以参考下
    2024-07-07
  • Pysvn 使用指南

    Pysvn 使用指南

    本文主要介绍了Pysvn 使用指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 为什么在函数中运行的 Python 代码速度更快?

    为什么在函数中运行的 Python 代码速度更快?

    对于Python解释器来说,读取和写入局部变量比全局变量更容易和更快,因为它们的作用域范围较小
    2023-09-09
  • python实现自幂数的示例代码

    python实现自幂数的示例代码

    这篇文章主要介绍了python实现自幂数的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python 异常处理总结

    python 异常处理总结

    这篇文章主要介绍了python 异常的相关资料,并整理了相关异常资料,需要的朋友可以参考下
    2016-10-10
  • Python Diagrams创建高质量图表和流程图实例探究

    Python Diagrams创建高质量图表和流程图实例探究

    Python Diagrams是一个强大的Python库,使创建这些图表变得简单且灵活,本文将深入介绍Python Diagrams,包括其基本概念、安装方法、示例代码以及一些高级用法,以帮助大家充分利用这一工具来创建令人印象深刻的图表
    2024-01-01

最新评论