Python提取Word图片并上传阿里云OSS实战

Cora
Cora
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍如何使用Python和python-docx库从Word文档中提取题干及选项图片,并通过阿里云OSS SDK将图片二进制流上传至云存储。教程涵盖OSS配置、Bucket权限设置、XML结构解析提取图片Blob,以及生成HTML img标签返回访问URL的完整流程,适用于题库系统开发场景。

需求背景与概述

这是一个真实的业务场景,若企业正在开发题库类系统,此类功能不可或缺,建议收藏备用。

具体需求描述如下:

1. 从Word文档(统一为docx格式)中提取题目或选项相关的图片;

2. 将提取的图片上传至云对象存储(OSS),并获取图片访问地址;

3. 在特定场景下,需将图片地址拼接为HTML img标签后返回。

阿里云OSS环境配置

具体实施步骤

首先需获取云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文档图片提取实现

随后进入Word图片处理环节,读取文件需使用第三方模块python-docx。

正式操作前,准备一个包含测试内容的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即为读取到的图片二进制流。

图片上传与HTML拼接

利用该文件流写入云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 相关产品和应用

全部下载

专题列表