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

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

需求简单描述如下所示:

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文件中的图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python如何实现从视频中提取每秒图片

    我是在做行人检测中需要将一段视频变为图片数据集,然后想将视频每秒钟的图片提取出来. 语言:python 所需要的库:cv2,numpy (自行安装) opencv中提供了读取视频每帧图片的函数,下面的代码可以将视频的每帧图片提取出来.注:我的视频名字叫 2.mp4  ,提取图片保存目录 需要自己建一个名字叫 output 的文件夹. # 导入所需要的库 import cv2 import numpy as np # 定义保存图片函数 # image:要保存的图片名字 # addr:图片地址与相片

  • python 三种方法提取pdf中的图片

    有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定! 今天就跟大家系统分享几种Python提取 PDF 图片的方法.其实没有非常完美的方法,每种方法提取效率都不是百分之百,因此可以考虑用多种方法进行互补,主要将涉及: 基于 fitz 库和正则搜索提取图片 基于 pdf2image 库的两种方法提取图片 基于 fitz 库和正则搜索 fitz 是 pymupdf 的子模块,需要先用命令行安装 pymu

  • python实现图片处理和特征提取详解

    这是一张灵异事件图...开个玩笑,这就是一张普通的图片. 毫无疑问,上面的那副图画看起来像一幅电脑背景图片.这些都归功于我的妹妹,她能够将一些看上去奇怪的东西变得十分吸引眼球.然而,我们生活在数字图片的年代,我们也很少去想这些图片是在怎么存储在存储器上的或者去想这些图片是如何通过各种变化生成的. 在这篇文章中,我将带着你了解一些基本的图片特征处理.data massaging 依然是一样的:特征提取,但是这里我们还需要对跟多的密集数据进行处理,但同时数据清理是在数据库.表.文本等中进行.这是如何

  • python批量提取图片信息并保存的实现

    程序运行环境 code # -*- coding:utf-8 -*- # ----------------------------------- # @Time : 2021/2/3 9:23 # @Author : HaoWu # @File : OutPixel.py # ------------------------------------ import sys import os from glob import glob from PIL import Image sys.path.

  • python提取word文件中的所有图片

    前言 办公中,偶尔会碰到一种情况,需要提取word文档中的图片,决定写这样一款工具自动提取图片. 关于脚本的使用: 情景1:如果你拿到的是一个文件夹,所有的word文件都在这个文件夹的子目录下,深度为1层,你可以直接使用该脚本 情景2:如果你拿到的是一个文件夹,打开之后,里面杂乱无章的充斥着各种文件,你也不确定word文档都在哪,那么你需要使用Everything来手动提取出所有的word文档,虽然我也可以让脚本实现这个功能,但是使用脚本需要考虑到有可能存在同名文件,再处理起来代码量会更大,还是

  • Python基于百度API识别并提取图片中文字

    利用百度 AI 开发平台的 OCR 文字识别 API 识别并提取图片中的文字.首先需注册获取 API 调用的 ID 和 key,步骤如下: 打开百度AI开放平台,进入控制台中的文字识别应用(需要有百度账号). 创建一个应用,并进入管理应用,记下 AppID, API Key, Secrect Key,调用 API需用到. 最后安装 python 的百度ai接口的的库 pip install baidu-aip 以下是代码实现,需将所有识别的图片放进名为 picture 的文件夹. #!/usr/

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

    该需求是一个真实的实战需求,如果你的公司在做题库类的系统,一定会涉及该方面的内容,所以收藏起来吧. 需求简单描述如下所示: 1.提取 Word(为了便于解决,统一格式为 docx)中的题干/选项图片: 2.将其传递到云 OSS 上,并返回图片地址: 3.部分场景,需要将其拼接为 HTML 的 img 标签进行返回. 实操环节 首先你需要准备好云OSS的 AccessKeyId 和 AccessKeySecret ,这两个值一般由运维工程师提供给你,如果你的公司比较小,没有运维岗位,那就需要自己去

  • Java下载https文件并上传阿里云oss服务器

    这篇文章主要介绍了Java下载https文件并上传到阿里云oss服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** * @author mazhq * @Title: X509TrustUtiil * @ProjectName: zeus * @Description: 证书信任管理器类 * @d

  • 教你用python提取txt文件中的特定信息并写入Excel

    目录 问题描述: 工具: 操作: 源代码: Reference: 总结 问题描述: 我有一个这样的数据集叫test_result_test.txt,大概几百上千行,两行数据之间隔一个空行. N:505904X:0.969wsecY:0.694wsec N:506038X:4.246wsecY:0.884wsec N:450997X:8.472wsecY:0.615wsec ... 现在我希望能提取每一行X:和Y:后面的数字,然后保存进Excel做进一步的数据处理和分析 就拿第一行来说,我只需要0

  • 使用python提取html文件中的特定数据的实现代码

    例如 具有如下结构的html文件 复制代码 代码如下: <div class='entry-content'> <p>感兴趣内容1</p> <p>感兴趣内容2</p> -- <p>感兴趣内容n</p> </div> <div class='content'> <p>内容1</p> <p>内容2</p> -- <p>内容n</p>

  • 解决springcloud阿里云OSS文件访问跨域问题的实现

    目录 引言 解决 引言 最近在高德地图中引用阿里云OSS存储的图片时,出现跨域访问问题,特此记录,以方便后续同学参考 解决 1.在阿里云OSS后台管理中,进入权限管理,进入跨域设置,添加跨域规则,设置来源为* 2.至此配置完成后访问图片还是会出现跨域问题,这是因为OSS文件默认会开启缓存,及后续访问的实际上是缓存的文件,这就会导致不能匹配到我们上述配置的跨域规则 于是我们需要将缓存禁用掉,如果文件就一两个的话,可以直接在后台中设置禁用缓存,将HTTP头中Cache-Control设置为no-ca

  • django 配置阿里云OSS存储media文件的例子

    1. 安装django-aliyun-oss2-storage包 linux上用 pip install django-aliyun-oss2-storage 无报错,顺利安装 windows上报错: (python3_sbs) F:\projects\virtualenv\python3_sbs\Scripts>pip install django-aliyun-oss2-storage Collecting django-aliyun-oss2-storage Using cached dj

  • springboot操作阿里云OSS实现文件上传,下载,删除功能

    参考资料:Java操作阿里云OSS操作官方文档 学会看文档,并实际运用也是一种习惯和技能 下面就来简单入门一下,用当下比较热门的Springboot 去操作阿里云OSS文件存储. 1.需求 (没踩过下面的坑的小伙伴可以直接跳过这一章节) 问题简述 首先,我在之前自己做一些开源小项目案例中遇到一些文件上传下载的问题,比如在本机文件上传和下载都可以正常使用,通过将文件上传到Springboot项目的根目录下,按日期分文件夹,文件访问也很方便,可以直接返回文件相对路径地址,并直接可以访问. 问题 然而

  • vue-cropper插件实现图片截取上传组件封装

    基于vue-cropper插件实现图片截取上传组件封装的具体代码,供大家参考,具体内容如下 需求场景: 后台开发需要上传图片并进行相应比例尺寸图片的截取,本组件开发采用Ant Design Vue组件库搭配vue-cropper插件进行封装 实现如下 html <template> <div> <a-upload name="avatar" list-type="picture-card" class="avatar-uplo

  • Python提取Word中图片的实现步骤

    目录 1.思路 2.具体实现 2.1导入相关库 2.2定义函数 2.3重命名word文件,将后缀名docx改为zip 2.4zip还原为docx文件,并获得图片的列表 2.5将图片复制到需要保存的文件夹中 2.6删除tmp缓冲文件夹中的文件,用以存储下一次的文件 2.7运行程序 3效果预览 3.1源word 3.2提取的图片 4附:doc转docx 1.思路 在网上查找了半天,基本都是提取word中文字的,没有找到可以把word中的图片提取出来的方法.一个巧合的情况下,发现将word的后缀名改为

随机推荐