python提取word文件中的图片并上传阿里云OSS
作者:梦想橡皮擦 发布时间:2021-02-01 10:52:25
该需求是一个真实的实战需求,如果你的公司在做题库类的系统,一定会涉及该方面的内容,所以收藏起来吧。
需求简单描述如下所示:
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空间。
来源:https://blog.csdn.net/hihell/article/details/122033985


猜你喜欢
- matplotlib及相关cmap参数的取值在matplotlib中对于图片的显示有如下方法(这不是重点), 其中有cmap=&ls
- 在 Go 语言中切片是使用非常频繁的一种聚合类型,它代表变长的序列,底层引用一个数组对象。一个切片由三个部分构成:指针、长度和容量。指针指向
- Deferred对象结构Deferred由一系列成对的回调链组成,每一对都包含一个用于处理成功的回调(callbacks)和一个用于处理错误
- 本文实例汇总了python求列表交集的方法。分享给大家供大家参考。具体方法如下:交集对于给定的两个集合A 和 集合B 的交集是指含有所有既属
- 需求一般Django开发为了保障避免 csrf 的攻击,如果使用Django的模板渲染页面,那么则可以在请求中渲染设置一个csrftoken
- 本文实例讲述了python使用正则表达式匹配字符串开头并打印的方法。分享给大家供大家参考,具体如下:import res="nam
- 前言本人做SSM项目的时候,在做删除功能时,发现找不到字段,在搜索了各种博客之后终于找到了解决办法一、报错Unknown column &a
- 其所用项目由Asp.Net技术开发,仍然使用的Webform作为前端处理,但某些功能包含了jQuery的功能,他遇到的问题就是无论用IE还是
- 这里介绍一个nii文件保存为png格式的方法。这篇文章是介绍多个nii文件保存为png格式的方法:https://www.jb51.net/
- 前言经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考
- 本文实例为大家分享了python3实现基于用户协同过滤的具体代码,供大家参考,具体内容如下废话不多说,直接看代码。#!/usr/bin/py
- plt.subplot()plt.subplot(nrows, ncols, index, **kwargs)第一个参数:*args (官网
- 一、概述全文索引在表中包括一个或多个基于字符的列。这些列可以具有以下任何数据类型:char、varchar、nchar、nvarchar、t
- 本文实例为大家分享了js实现九宫格布局效果的具体代码,供大家参考,具体内容如下效果代码如下:<!DOCTYPE html><
- 本文为大家分享了Centos7.3下mysql5.7.18的安装,和修改初始密码,供大家参考,具体内容如下1、官方安装文档http://de
- 本文实例讲述了Python实现的企业粉丝抽奖功能。分享给大家供大家参考,具体如下:一 代码def scode9(schoice): &nbs
- 环境:python3.5,pycharm2017.2.3目录结构a.pyt=5b.pyfrom a import tprint(t)平台显示
- "合成大西瓜"这个游戏在年前很火热,还上过微博热搜,最近便玩了一阵还挺有意思的,所以研究了一下小球碰撞原理,自己亲自手写
- Python中除了字典,列表,元组还有一个非常好用的数据结构,那就是set了,灵活的运用set可以减去不少的操作(虽然set可以用列表代替)
- 介绍每当我使用pandas进行分析时,我的第一个目标是使用众多可用选项中的一个将数据导入Pandas的DataFrame 。对于绝大多数情况