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()

相关推荐
聪明蛋子哟5 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
今天AI了吗5 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
卷无止境5 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
TELL5216 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
Csvn6 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
大鹏说大话8 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo8 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python
2501_944676169 小时前
揭秘!WORDTIP公司靠不靠谱?小白必看
大数据·人工智能·python
Minner-Scrapy10 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
CODER030410 小时前
Anaconda和Mamba创建环境管理包常用命令合集
python·深度学习·conda·虚拟环境·mamba·常用命令大全