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

需求简单描述如下所示:

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

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

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

实操环节

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

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

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

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

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

接下来在 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 的概览中找到,如下图所示。

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

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

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

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

首先通过 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 属性,输出里面的文字。

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

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


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() 方法可以进行数据提取。

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

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

在上文的注释中,还存在一个图片属性 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

标签:python,提取,word,图片
0
投稿

猜你喜欢

  • php投票系统之增加与删除投票(管理员篇)

    2023-10-14 09:44:53
  • 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复

    2023-11-06 19:25:27
  • Python关于__name__属性的含义和作用详解

    2021-10-28 09:29:51
  • Python 中的函数装饰器和闭包详解

    2021-08-03 17:52:40
  • 详解Python3定时器任务代码

    2023-10-15 14:50:26
  • 基于webpack.config.js 参数详解

    2024-05-02 16:28:30
  • 深入Golang中的sync.Pool详解

    2024-02-02 05:31:27
  • Django实现文件上传下载

    2022-03-17 18:42:48
  • 深入了解Golang中的格式化输出

    2024-04-26 17:35:27
  • 一键生成各种尺寸Icon的php脚本(实例)

    2024-06-05 09:48:41
  • Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例

    2023-08-16 05:23:31
  • 解决go 生成的exe不在bin文件夹里的问题

    2024-03-16 20:49:52
  • Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中

    2023-07-19 04:13:23
  • 一篇文章搞懂python的转义字符及用法

    2022-01-29 17:19:12
  • Python3实现并发检验代理池地址的方法

    2023-10-14 01:03:58
  • webpack-dev-server自动更新页面方法

    2024-04-19 09:48:10
  • Anaconda2下实现Python2.7和Python3.5的共存方法

    2022-06-30 12:43:30
  • vue axios form-data格式传输数据和文件方式

    2024-04-30 10:18:57
  • Python编程mac下使用pycharm小技巧

    2022-10-21 19:23:52
  • Python数据可视化库seaborn的使用总结

    2022-08-07 11:43:04
  • asp之家 网络编程 m.aspxhome.com