当前位置: 首页 > news >正文

xmind导入导出支持图片功能源码改造

xmind导入导出支持图片功能
在开发用例管理平台的过程中,需要使用xmind来管理用例。所以也涉及到xmind用例的导入导出功能,
在开始的时候,xmind文件中没有图片,所以使用xmind,xmindparser包就可以完成改任务。现在新增需求,
要求支持xmind文件中图片的导入导出。原有的包,并不支持图片的操作,所以需要对这两个包进行一些改造。
1.环境 python3.8
2.xmind版本,xmind8,xmindzen
3.需要的python包 xmind包,xmindparser包

xmindparser包改造
针对xmind8版本,需要改动xreader.py文件的image_of方法
原方法:
def image_of(node):
    img = node.find('img')

    if img is not None:
        return '[Image]'
因为项目需要图片的内容信息,还有图片的大小,所以将图片的附件、高、宽,拼接一起返回
改造后方法:
def image_of(node):
    img = node.find('img')
    if img is not None:
        src_attribute = img.get('{http://www.w3.org/1999/xhtml}src')
        height_attribute = img.get('{http://www.w3.org/2000/svg}height')
        width_attribute = img.get('{http://www.w3.org/2000/svg}width')
        return str(src_attribute) + ':' + str(height_attribute) + ':' + str(width_attribute)
    return None

针对xmindzen版本,需要改动zenreader.py文件的image_of方法
def image_of(node):
    img = node.get('image', None)
    if img is not None:
        src_attribute = img.get('src')
        height_attribute = img.get('height')
        width_attribute = img.get('width')
        return str(src_attribute) + ':' + str(height_attribute) + ':' + str(width_attribute)
    return None

使用改造后方法,下载xmind的图片
xmind_file = /data/xmind/test.xmind
xmind_content_dict = xmind_to_dict(xmind_file)
zFile = ZipFile(xmind_file, 'r')
image_data = zFile.read('attachments/xxxxxxxx')# 这就是改造后image_of方法中的src_attribute字段
file_name = '/data/image/image.jpg'
with open(file_name, 'wb') as f:
    f.write(image_data)
即可将文件保存到file_name

xmind库改造
const.py新增内容如下
# 图片
IMAGE = 'xhtml:img'
IMAGE_SRC = 'xhtml:src'
IMAGE_HEIGHT = 'svg:height'
IMAGE_WIDTH = 'svg:width'

markerref.py新增内容如下
class ImageElement(WorkbookMixinElement):
    TAG_NAME = const.IMAGE

    def __init__(self, node=None, ownerWorkbook=None):
        super(ImageElement, self).__init__(node, ownerWorkbook)

    def getXhtmlSrc(self):
        '''取消前缀,只留图片名称,后续直接在attachments文件夹下找该图片'''
        return self.getAttribute(const.IMAGE_SRC).replace('xap:attachments/', '')

    def getImageHeight(self):
        return self.getAttribute(const.IMAGE_HEIGHT)

    def getImageWidth(self):
        return self.getAttribute(const.IMAGE_WIDTH)

    def setXhtmlSrc(self, src):
        return self.setAttribute(const.IMAGE_SRC, f"xap:attachments/{src}")

    def setImageHeight(self, height):
        return self.setAttribute(const.IMAGE_HEIGHT, height)

    def setImageWidth(self, width):
        return self.setAttribute(const.IMAGE_WIDTH, width)

topic.py文件新增如下内容
TopicElement类下的
getData函数的data字段新增'image': self.getImage()
TopicElement类下新增三个函数
def getImage(self):
    image = self._get_image()
    if image:
        image = ImageElement(image, self.getOwnerWorkbook())
        return {
            'src': image.getXhtmlSrc(),
            'height': image.getImageHeight(),
            'width': image.getImageWidth()
        }

def setImage(self, src, height, width):
    image = self._get_image()
    if not image:
        image = ImageElement(None, self.getOwnerWorkbook())
        self.appendChild(image)
    else:
        image = ImageElement(image, self.getOwnerWorkbook())
    image.setXhtmlSrc(src)
    image.setImageHeight(height)
    image.setImageWidth(width)
def _get_image(self):
    return self.getFirstChildNodeByTagName(const.IMAGE)

改造后xmind增加图片附件的流程

MANIFEST_TEMPLATE = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<manifest xmlns="urn:xmind:xmap:xmlns:manifest:1.0" password-hint="">
<file-entry full-path="attachments/" media-type=""/>
{}
<file-entry full-path="content.xml" media-type="text/xml"/>
<file-entry full-path="META-INF/" media-type=""/>
<file-entry full-path="META-INF/manifest.xml" media-type="text/xml"/>
<file-entry full-path="comments.xml" media-type="text/xml"/>
<file-entry full-path="styles.xml" media-type="text/xml"/>
</manifest>
"""
image_name = '图片名称.png'
image_data = b'文件byte数据'
height = 300
width = 300

xmind_file_path = f"{str(uuid.uuid4())}.xmind"
workbook = xmind.load(path)
# get the first sheet(a new workbook has a blank sheet by default)
sheet = workbook.getPrimarySheet()
sheet.setTitle(tree['data']['text'])  # 设置画布名称
root_topic = sheet.getRootTopic()
root_topic.setTitle(tree['data']['text'])  # 设置主题名称
sub_topic = root_topic.addSubTopic() # 新增child主题
sub_topic.setImage(img_name, height, width) # 设置图片
xmind.save(workbook, path=xmind_file_path) # 先保存

for img_name, img_data in image_dict.items():
    azip.writestr(f'attachments/{img_name}', data=img_data)  # 将图片写入attachments中
    manifest_img += f'<file-entry full-path="attachments/{img_name}" media-type="image/{img_name.split(".")[-1]}"/>'
azip.writestr(f'META-INF/manifest.xml', data=MANIFEST_TEMPLATE.format(manifest_img))  # 写入META-INF/manifest.xml文件
azip.close()

相关文章:

xmind导入导出支持图片功能源码改造

xmind导入导出支持图片功能 在开发用例管理平台的过程中&#xff0c;需要使用xmind来管理用例。所以也涉及到xmind用例的导入导出功能&#xff0c; 在开始的时候&#xff0c;xmind文件中没有图片&#xff0c;所以使用xmind,xmindparser包就可以完成改任务。现在新增需求&#x…...

Web应用防火墙用在哪些场景?

WAF是Web Application Firewall的缩写&#xff0c;翻译为“Web应用防火墙”是一种网络安全设备或服务&#xff0c;用于保护Web应用程序免受各种网络攻击和漏洞的影响。 WAF特别设计用于识别和阻止特定于Web应用程序的攻击&#xff0c;例如SQL注入、跨站脚本(XSS)、跨站请求伪造…...

MySQL高可用(MHA高可用)

什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...

k8s_如何配置 containerd 使用镜像加速拉取docker.io上的镜像

在 Kubernetes 使用 containerd 作为容器运行时,可以通过配置 containerd 来使用镜像网站(镜像仓库)拉取镜像。这可以通过修改 containerd 的配置文件来实现。以下是详细步骤: 步骤 1:安装 containerd (如果已安装,这一步略过) 如果尚未安装 containerd,可以使用以下命…...

centos7安装宝塔面板

一、进入root模式 sudo su二、安装宝塔面板 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec...

Spring 事务管理:全面解析

Spring 框架是一款广受欢迎的 Java 开发框架&#xff0c;其强大的功能之一便是事务管理。事务管理在确保数据一致性和完整性方面至关重要。在这篇文章中&#xff0c;我们将深入探讨 Spring 事务管理&#xff0c;包括声明式事务管理、编程式事务管理&#xff0c;以及事务传播和隔…...

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…...

昇思25天学习打卡营第11天|LSTM+CRF序列标注

序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 和人理解语言一样&#xff0c…...

CSS 核心知识点 - grid

思维导图 参考网址: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_grid_layout 一、什么是 grid&#xff1f; CSS Grid布局是在CSS3规范中引入的一种新的布局方式&#xff0c;旨在解决传统布局方法&#xff08;如浮动、定位、表格布局&#xff09;存在的许多问题。C…...

pyecharts可视化案例大全(1~10)

pyecharts可视化案例大全 一、堆叠柱状图二、关闭坐标轴显示三、自定义坐标轴标签文本四、更改坐标轴数据类型五、双Y轴【直方图&折线图】六、直方图——双Y轴七、折线图——双X轴八、图例选择设置单选九、缩略轴——inside组件十、缩略轴——slider组件一、堆叠柱状图 不…...

SpringBoot 启动流程一

SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…...

打印机删除副本以后无法安装打印机驱动

根据知乎文章解决打印机驱动副本存在多个&#xff0c;打印机驱动无法删除&#xff0c;或者驱动包无法删除等问题。的方法删除打印机副本以后发现无论如何也装不上驱动了。 要么驱动安装成功&#xff0c;但是设备仍然是指定状态。 后面发现是删错文件夹了&#xff0c;教程里让删…...

Vue3中为Ant Design Vue中Modal.confirm自定义内容

在一次业务开发时代码时&#xff0c;碰到了一种既想要Modal.confirm样式&#xff0c;又想要定制其content内容的情况。 大部分情况下&#xff0c;使用Modal.method()这种方式时&#xff0c;可能content内容固定都是字符串&#xff0c;那如果想要做更高级的交互怎么办&#xff…...

智能猫砂盆到底哪家好用?自费实测聚宠、糯雪、CEWEY真实反馈!

快到夏天了&#xff0c;是不是还有人因为没挑选到喜欢的智能猫砂盆而苦恼着&#xff1f;太便宜怕不好用&#xff0c;太贵怕质量比不上价格。来来去去拖到现在还没决定&#xff0c;我作为养了四年猫的资深铲屎官&#xff0c;今天就来给大家传授经验&#xff0c;关于我是怎么从好…...

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章&#xff0c;那么闲话少叙&#xff0c;我们直接进入正题 在讲二叉树的一些之前知识点之前&#xff0c;我先给大家送个小礼物哈 手搓二叉树 typedef int BTDataType ; typedef struct BinaryTreeNode { BTDataType _data …...

代码随想三刷动态规划篇8

代码随想三刷动态规划篇8 122. 买卖股票的最佳时机 II题目代码 123. 买卖股票的最佳时机 III题目代码 188. 买卖股票的最佳时机 IV题目代码 309. 买卖股票的最佳时机含冷冻期题目代码 122. 买卖股票的最佳时机 II 题目 链接 代码 class Solution {public int maxProfit(int…...

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…...

离线安装docker社区版

提示&#xff1a;以下所有命令都在Ubuntu-24.04-live-server-amd64系统中运行 文章目录 前言一、离线包制作二、在目标系统上离线安装Docker CE总结 前言 安全原因&#xff0c;内部机器不能联网&#xff0c;要给新机器安装 docker-ce 只能使用离线安装方法。如果使用本文的下载…...

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…...

【TB作品】矩阵键盘电话拨号,ATMEGA16单片机,Proteus仿真 atmega16矩阵键盘电话拨号

atmega16矩阵键盘电话拨号 c代码和仿真图&#xff1a; 使用ATmega16实现矩阵键盘电话拨号功能 项目背景 在电子设计和嵌入式系统开发中&#xff0c;矩阵键盘是常见的人机交互方式。它可以实现较多按键的输入&#xff0c;同时节省单片机的I/O资源。结合LCD显示和蜂鸣器&am…...

将 Claude Code 的 API 请求无缝迁移至 Taotoken 平台

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 将 Claude Code 的 API 请求无缝迁移至 Taotoken 平台 如果你正在使用 Claude Code 作为编程助手&#xff0c;并且希望将其后端 AP…...

毕业论文难写?2026年AI写作辅助平台排行榜权威发布,轻松定稿不是梦!

写论文效率低、熬夜赶稿、查重不过关&#xff1f;别慌&#xff01;2026 年最新 AI 论文写作工具合集来了&#xff0c;覆盖选题、大纲、初稿、润色、降重、格式、文献引用全流程&#xff0c;帮你精准匹配最适合的学术助手&#xff0c;彻底告别论文内耗&#xff01;&#x1f3c6;…...

JMeter临界部分控制器正确用法与避坑指南

1. 为什么“临界部分控制器”是压测中真正卡住团队的隐形瓶颈很多人第一次在JMeter里看到临界部分控制器&#xff08;Critical Section Controller&#xff09;&#xff0c;第一反应是&#xff1a;“这不就是个带锁的逻辑块&#xff1f;加个锁而已&#xff0c;能有多复杂&#…...

Seraphine:英雄联盟玩家的5大核心功能终极助手,一键提升游戏体验

Seraphine&#xff1a;英雄联盟玩家的5大核心功能终极助手&#xff0c;一键提升游戏体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款专为《英雄联盟》玩家设计的智能游戏辅助工具&#xf…...

三步搞定视频PPT提取:从视频中智能导出幻灯片的终极指南

三步搞定视频PPT提取&#xff1a;从视频中智能导出幻灯片的终极指南 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾经面对一段重要的教学视频或会议录像&#xff0c;却苦于…...

大语言模型在嵌入式系统开发中的应用与挑战

1. 嵌入式系统开发与大语言模型的碰撞 在智能家居、工业自动化和物联网设备蓬勃发展的今天&#xff0c;嵌入式系统作为连接数字世界与物理世界的桥梁&#xff0c;其开发复杂度正呈指数级增长。传统嵌入式开发要求工程师同时具备三大核心能力&#xff1a;理解电子元件特性与电路…...

Windows用户必看!终极免费的PDF处理工具Poppler快速安装指南

Windows用户必看&#xff01;终极免费的PDF处理工具Poppler快速安装指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上处理P…...

如何在Blender中实现专业级MMD模型动画制作:5步完整解决方案

如何在Blender中实现专业级MMD模型动画制作&#xff1a;5步完整解决方案 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …...

基于机器学习与RIS的毫米波用户角度定位:四波束探测实现低开销波束管理

1. 项目概述&#xff1a;当RIS遇见机器学习&#xff0c;如何用四个波束“锁定”用户&#xff1f; 在毫米波频段玩无线通信&#xff0c;就像在一条狭窄却充满障碍物的高速公路上开跑车。速度是快了&#xff0c;但一个不小心&#xff0c;信号就被墙、人甚至一片树叶给“堵”得严严…...

信创环境运维实录:在离线ARM麒麟V10服务器上,我是这样搞定telnet客户端的

信创环境下的离线运维实战&#xff1a;ARM架构麒麟V10服务器telnet客户端部署全解析在信创产业快速推进的背景下&#xff0c;越来越多的企业和机构开始采用国产化服务器操作系统。麒麟V10作为国产操作系统的代表之一&#xff0c;凭借其安全可靠的特性&#xff0c;在政府、金融、…...