python3处理docx并flask显示

news2025/1/21 4:47:40

前言:

最近有需求处理docx文件,并讲内容显示到页面,对world进行在线的阅读,这样我这里就使用flask+Document对docx文件进行处理并显示,下面直接上代码:

Document处理:

首先下载Document的库文件,先直接安装最新版的python-docx,如果不行则换成1.1.0版本:

pip install python-docx
pip install python-docx==1.1.0

处理docx代码如下:

def ReadVADocx(ProjectName,DocxName):
    docxfilepath = vaReportDir + "\\" + ProjectName + "\\" + DocxName
    paragraphs = ReadDocx(docxfilepath)
    return paragraphs

def ReadDocx(docxfilepath):
    doc = Document(docxfilepath)
    paragraphs = list()
    pattern = re.compile('rId\d+')
    for graph in doc.paragraphs:
        level = graph.style.name.split(' ')[-1]
        if level == "Normal":
            level = None
        elif level == "Preformatted":
            level = None
        paragraph = {
            'text': graph.text,
            'level': level,
            'images': ""
        }
        paragraphs.append(paragraph)
        for run in graph.runs:
            if run.text == '':
                contentID = pattern.search(run.element.xml)
                if contentID:
                    contentID = contentID.group(0)
                    try:
                        contentType = doc.part.related_parts[contentID].content_type
                    except KeyError as e:
                        print(e)
                        continue
                    if not contentType.startswith('image'):
                        continue
                    imgData = doc.part.related_parts[contentID].blob
                    image_base64 = base64.b64encode(imgData).decode('utf-8')
                    paragraph = {
                        'text':  run.text,
                        'level': run.style.name.split(' ')[-1] if run.style.name.startswith('Heading') else None,
                        'images': image_base64
                    }
                    paragraphs.append(paragraph)

上述代码会对docx文件进行遍历,并将对应的内容和等级放入数组中

下面是调用代码:

@app.route('/ViewVADocx', methods=['GET'])
def ViewVADocx():
     try:
        DocxName = request.args.get('docx')
        ProjectName = request.args.get('name')
        paragraphs = engine.ReadVADocx(ProjectName,DocxName)
        return render_template("viewdocx.html", n_getname=ProjectName, n_user=user,paragraphs=paragraphs)
     except Exception as e:
         return render_template('error-500.html')

html编写: 

然后就是需要讲对应的内容在页面进行展示,下面列出html代码:

{% extends "mould.html" %}

{% block head %}
{% endblock %}

{% block body %}
        <!--body wrapper start-->
        <div class="wrapper">
            <div class="floating-box" id="floatingBox">↑回到顶部↑</div>

              <!--Start Page Title-->
               <div class="page-title-box">
                    <h4 class="page-title">{{ n_getname }}:扫描节点线</h4>
                    <div class="clearfix"></div>
                 </div>
                  <!--End Page Title-->
                <!--Start row-->
                  <div class="row">
                     <div class="col-md-12">
                         <div class="white-box">
                            <h2 style="font-weight: bold;">快速导航:</h2>
                            {% for paragraph in paragraphs %}
                                {% if paragraph.level == "1"  %}
                                    <p>
                                    <a href="#Section{{ loop.index0 }}" class="hover-link" style="font-weight: bold;">{{ paragraph.text }}</a>
                                {% elif  paragraph.level == "2" %}
                                    <p style="text-indent: 25px;">
                                    <a href="#Section{{ loop.index0 }}" class="hover-link2" style="font-weight: bold;">{{ paragraph.text }}&#9;</a>
                                    </p>
                                {% endif %}
                            {% endfor %}
                         </div>
                            {% for paragraph in paragraphs %}
                                {% if paragraph.level  %}
                                    {% if paragraph.level == "Title" %}
<!--                                        <h2 align="center">{{ paragraph.text }}</h2>-->
                                    {% elif  paragraph.level == "1" %}
                                        </div>
                                        <div class="white-box">
                                        <h{{ paragraph.level }} id="Section{{ loop.index0 }}" style="font-weight: bold;">{{ paragraph.text }}</h{{ paragraph.level }}>
                                    {% else %}
                                        <h{{ paragraph.level }} id="Section{{ loop.index0 }}">{{ paragraph.text }}</h{{ paragraph.level }}>
                                    {% endif %}
                                {% else %}
                                    {% if paragraph.images %}
                                        <p><img src="data:image/png;base64,{{ paragraph.images }}" alt="Image"></p>
                                    {% else %}
                                        <p style="color: black;">{{ paragraph.text }}</p>
                                    {% endif %}
                                {% endif %}
                            {% endfor %}

                     </div>
                </div>
        </div>

{% endblock %}

{% block list %}
        <style>
           .hover-link {
                font-size: 20px;
            }
            .hover-link:hover {
                color: red;
                font-size: 30px;
            }
            .hover-link2 {
                font-size: 15px;
            }
            .hover-link2:hover {
                color: red;
                font-size: 20px;
            }
        </style>
      <style>
        /* CSS 样式,用于定义悬浮框的外观 */
        .floating-box {
          position: fixed;
          bottom: 20px;
          right: 20px;
          width: 80px;
          height: 50px;
          background-color: #ff9900;
          color: #fff;
          text-align: center;
          line-height: 50px;
          cursor: pointer;
        }
      </style>
  <script>
    // JavaScript 代码
    var floatingBox = document.getElementById('floatingBox');

    // 点击事件监听器
    floatingBox.addEventListener('click', function() {
      window.scrollTo({ top: 0, behavior: 'smooth' });
    });
  </script>
{% endblock %}

其中添加了样式和回到顶部等小功能,方便浏览,最后的使用效果如下:

 

后记:

代码只做了docx文件的内容展示,包括文字和图片,并对等级进行了划分,没有对docx的修改功能,感兴趣的可以自己研究下 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文解读】Learning based fast H.264 to H.265 transcoding

时间&#xff1a; 2015 年 级别&#xff1a; APSIPA 机构&#xff1a; 上海电力大学 摘要 新提出的视频编码标准HEVC (High Efficiency video coding)以其比H.264/AVC更好的编码效率&#xff0c;被工业界和学术界广泛接受和采用。在HEVC实现了约40%的编码效率提升的同时&…

源码补丁神器—patch-package

一、背景 vue项目中使用 vue-pdf 第三方插件预览pdf&#xff0c;书写业务代码完美运行&#xff0c;pdf文件内容正常预览无问题。后期需求有变&#xff0c;业务需求增加电子签章功能。这个时候pdf文件的内容可以显示出来&#xff0c;但是公司的电子签章无法显示。这令人沮丧&am…

B/S架构云端SaaS服务的医院云HIS系统源码,自主研发,支持电子病历4级

医院云HIS系统源码&#xff0c;自主研发&#xff0c;自主版权&#xff0c;电子病历病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统…

科研学习|论文解读——融合类目偏好和数据场聚类的协同过滤推荐算法研究

论文链接&#xff08;中国知网&#xff09;&#xff1a; 融合类目偏好和数据场聚类的协同过滤推荐算法研究 - 中国知网 (cnki.net) 摘要&#xff1a;[目的/意义]基于近邻用户的协同过滤推荐作为推荐系统应用最广泛的算法之一&#xff0c;受数据稀疏和计算可扩展问题影响&#x…

大数据应用开发2-Scala语言各个环境配置

一、首先安装JDK1.8版本(简单过一下) 1.下载与安装 下载Java1.8 地址&#xff1a;Java Downloads | Oracle 中国 点击跳转&#xff08;下载需要登录甲骨文账号&#xff09; 下载完成运行 修改安装目录&#xff08;两个都要改&#xff09; 复制第一次修改的安装目录 2.配置环…

构建安全防线:SDLC中的供应链攻击防范最佳实践与Log360解决方案

在过去的12个月里&#xff0c;有10家公司发现了软件供应链风险。供应链中依赖关系的增加扩大了对手的攻击面。这也导致威胁行为者将注意力从仅影响最终用户的下游链转移到上游链&#xff0c;影响供应商、客户和最终用户。因此&#xff0c;让我们立即讨论如何使你的SOC团队在产品…

netty源码:(40)ReplayingDecoder

ReplayingDecoder是ByteToMessageDecoder的子类&#xff0c;我们继承这个类时&#xff0c;也要实现decode方法&#xff0c;示例如下&#xff1a; package cn.edu.tju;import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handle…

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录 之前发布过Window方式,这次结合以上主题,完善下Linux相关登入方式过程,纯属做个记录,有需要的朋友可以做个学习参考。 一、Windows环境提示“‘mysql’ 不是内部或外部命令,也不是可运行的程序或批…

超声波清洗机到底实不实用?哪些超声波清洗机值得入手

在日常生活中&#xff0c;我们常常会遇到各种难以清洗的物品&#xff0c;如眼镜、首饰、牙套等。传统的手工清洗方法不仅费时费力&#xff0c;而且难以彻底清除污渍。这时&#xff0c;超声波清洗机便进入了人们的视野。它利用超声波的振动来清除物品表面的污渍和杂质&#xff0…

观察者模式概述

观察者模式,它用于建立一种对象与对象之间的依赖关系&#xff0c; 一个对象发生改变将自动通知其他对象&#xff0c; 其他对象将相应做出反应。在观察者模式种&#xff0c;发生改变的对象称为观察目标&#xff0c; 而被通知的对象称为观察者&#xff0c;一个观察目标可以对应多…

【Spring实战】09 MyBatis Generator

文章目录 1. 依赖2. 配置文件3. 生成代码4. 详细介绍 generatorConfig.xml5. 代码详细总结 Spring MyBatis Generator 是 MyBatis 官方提供的一个强大的工具&#xff0c;它能够基于数据库表结构自动生成 MyBatis 持久层的代码&#xff0c;包括实体类、Mapper 接口和 XML 映射文…

C# 操作非持久化内存映射文件

目录 写在前面 代码实现 进程A 进程B 进程C 调用示例 总结 写在前面 多个进程之间&#xff0c;通过操作未映射到磁盘上现有文件的内存映射文件&#xff0c;可以实现数据共享和类似进程间通讯的功能。以下示例展示了使用三个独立进程&#xff0c;先各自将布尔值写入内存…

Vue axios Post请求 403 解决之道

前言&#xff1a; 刚开始请求的时候报 CORS 错误&#xff0c;通过前端项目配置后算是解决了&#xff0c;然后&#xff0c;又开始了新的报错 403 ERR_BAD_REQUEST。但是 GET 请求是正常的。 后端的 Controller 接口代码如下&#xff1a; PostMapping(value "/login2&qu…

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…

Pytorch从零开始实战14

Pytorch从零开始实战——DenseNet SENet算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——DenseNet SENet算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#x…

排列组合算法(升级版)

前言 在上一期博客中我们分享了一般的排列组合算法&#xff08;没看的话点这里哦~&#xff09;&#xff0c;但是缺点很明显&#xff0c;没法进行取模运算&#xff0c;而且计算的范围十分有限&#xff0c;而今天分享的排列组合升级版算法能够轻松解决这些问题&#xff0c;话不多…

Bean 生命周期 和 SpringMVC 执行过程

这里简单记录下 Bean 生命周期的过程&#xff0c;方便自己日后面试用。源码部分还没看懂&#xff0c;这里先贴上结论 源码 结论

PAT 乙级 1028 人口普查

解题思路&#xff1a;此题我想到俩种方法&#xff0c;一种是排序方法&#xff0c;一种是不排序的方法&#xff0c;首先都是看是否是有效年龄&#xff0c;然后一种是排序&#xff0c;另一种是维护最大值和最小值的变量&#xff0c;一定要注意如果有效数字是0那就只输出0就可以了…

【PostgreSQL内核学习(二十)—— 数据库中的遗传算法】

数据库中的遗传算法 概述个体的编码方式及种群初始化geqo 函数 适应值geqo_eval 函数gimme_tree 函数 父体选择策略geqo_selection 函数 杂交算子边重组杂交 ERX ( edge recombination crossover)gimme_edge_table 函数gimme_tour 函数 变异算子geqo_mutation 函数 声明&#x…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…