关于 draw.io 矢量图 SVG 导出的研究

draw.io 是一个简单易用的图表 (diagram) 绘制工具 1, 可以用作一个简单的矢量图绘制工具, 画一些简单的图标或者流程图等等都很适合.

虽然好用, 但是在导出 *.drawio 文件为其他格式时, 大多数时候都需要额外注意.

导出设计时会遇到的问题及原因

对于 PNG 导出, 默认的设置下, 导出的图像会很模糊. 幸运的是, 可以在导出时通过将图表的缩放比例调制 250% ~ 300% (甚至更高) 来解决. 2

至于 SVG,事情就变得有点复杂. 在浏览器中查看软件导出的 SVG 文件时, 一切似乎都很好. 但是, 当尝试将这些 SVG 导入 Word 或 Inkscape 等软件时,则可能会看到图片上出现 “Viewer does not support full SVG 1.1 (查看器不支持完整的 SVG 1.1)” 字样 3.

图 1: 在 draw.io 中绘制的图片

图 2: 显示异常的图片

大多数情况下, 这种情况是因为 draw.io 使用了 HTML 代码来标记文本框中的自动换行的长文本 / 复杂格式的文本 / (或者还有其他的图元), 并将这些代码直接嵌入到了 SVG 的 <foreignObject> 标签中.

现代浏览器自然是能够解析这些 HTML 代码的, 因此在其中查看不会出现太多的问题. 然而这些 “外来 (foreign)” 的 HTML 代码并不能被 Inkscape 等专门处理 SVG 的软件理解.

因此, draw.io 的开发人员在 SVG 中加入了一个 <switch> 标签, 使得不支持 <foreignObject> 中内容的查看器在渲染这样的 SVG 时, 会显示上述的提示信息文本.

总之, 并不是这些查看器 “不支持 SVG 1.1”, 而是因为这些 SVG 中 <foreignObject> 部分包含了不能被浏览器 (或者其他能渲染 HTML 的程序) 之外的程序所解析的内容.

另一方面, 尽管浏览器能够查看这些 SVG, 但是对于浏览器来说, 事实上 SVG 代码才是 "外来 (foreign)’ 之物. 4

至于目前 draw.io 对于这长文本 / 复杂格式文本的 SVG 后备方案, draw.io 只是输出了一段修剪过后的文本, 十分没用.

不过, 按照 draw.io 的一位开发人员的说法, 其实 draw.io 这个项目最开始并不是为了画图, 更没有导出 SVG 的选项; 就连现在, 其定位也不是一个矢量图绘制软件. 所以, 对于开发者来说, 上述这些, 并不能算是软件的 BUG, 甚至不用去理会.

解决方案

法 1: 禁用换行与文本格式

目前, 官方博客中给出的解决方法, 就是手动全选图表上的元素, 在 “格式面板 (Format Pannel)” 的 “Text (文本)” 选项卡下, 手动禁用掉 “Word Wrap (自动换行)” 和 “Formatted Text (格式化文本)”. 5

这样处理之后, draw.io 导出的 SVG 就会干干净净的了 (不含 <foreignObject>, 可以被 Word 等软件正常读取).

需要注意的是:

  • 禁用 “自动换行” 后, 之前适应文本框大小自动换行的文本将变为一行, 需要手动键入换行符将长文本分成多行;
  • 禁用 “格式化文本” 后, 一个文本框中将不支持多种格式的文本, 必须以一个文本框为单位整体调整文本的样式.

每次手动禁用这些选项可能会有点麻烦, 可以直接 “禁用 <foreignObject> 的使用”.

  • 如果是在线使用 app.diagrams.net, 可以直接访问 app.diagrams.net/#_CONFIG_UzV3UjUyyk0tSk8F0qrGjqpggeLM3IKcVJ/EpNScYoh4SVFpqqq5CxABAA==, 直接配置对应的设置 6;
  • 或者在软件的 “其他” 选项中选择 “配置 (Configuration)”, 添加键值对 "simpleLabels": true, 结果如下:
    {"simpleLabels": true// Other configurations...
    }
    

法 2: 导出 PDF 后再转换为 SVG

我们知道, PDF 中的数据一般是没有上下文语义的; 可以说, 它只包含各个元素的样式以及对应的位置, 是一种用来存储排版结果的格式, 并不会轻易改变. 7

由于浏览器能够渲染排版这样包含 HTML 的 SVG, 并且浏览器一般具有 (将排版后的页面内容) 导出为 (打印为) PDF 的功能 8. 于是, 可以利用该功能, 将浏览器对该 SVG 的排版结果导出到 PDF 里, 再通过 Inkscape 从 PDF 中还原 SVG.

PDF 中包含的一般是稳定的格式, 从中还原出的 SVG 自然也相对稳定 (可能由于字体因素产生些许失真).

不过, 经过生成 PDF 再复原的过程, 一般会丧失许多 SVG 的语义, 比如文本不再能够被连贯的复制出来; 如果生成 PDF 的过程进行了转曲的操作, 这些文本可能甚至不再能够被选取复制.

最新 draw.io 的 SVG 导出选项中可以修改 “文本设置”, 有一个 “将文本标签 (label) 转换为 SVG” 的选项. 据开发者所说, 就是将该文件上传到他们的服务器, 以进行上述的转换.

小结

综上, 目前有这些可行的解决方案:

  • 对于简单的 SVG 图表 (不包含长文本 / 复杂格式文本), 只需按照上面提到的方法操作即可;
  • 尝试 (使用浏览器) 将 SVG 导出为 PDF, 然后使用 Inkscape 从 PDF 生成 SVG.

其他资料

关于这个事情, 有一些相关的有意思的讨论可以围观:

  • Issue #774 · jgraph/drawio;
  • Inkscape “Viewer does not support full SVG 1.1” - Using Inkscape with Other Programs - Inkscape Forum (还提到了 XSLT)
  • Truly Headless Draw.io Exports - Hacker News (ycombinator.com) (提到了关于 “导出”, “SVG 暗黑模式适配” 等问题)

其他可能有用的文章:

  • Things you need to know about working with SVG in VS Code (freecodecamp.org)

  • How I use draw.io at the command line | Tom Donohue 以及下边的评论:

    • 用代码画图 / 代码形式的图表: Structurizr;
    • 一个基于 Web 的 PlantUML 编辑器: http://www.plantuml.com/plantuml;
  • 处理已压缩的 .drawio 文件 (可以在 ‘properties’ 中删除): Text-editing a draw.io file exported as SVG with embedded drawing - Stack Overflow

  • 4. Multiline SVG Text - SVG Text Layout [Book] (oreilly.com);

  • SVG element reference | MDN 以及 <text> 元素的文档;


  • 解决draw.io生成SVG矢量图导入Word显示有误的问题以及推荐几种SVG绘图方法 - CSDN
  • draw.io 导出 SVG 图片报错

  1. 可以访问 app.diagrams.net 在线使用, 也有很多平台提供 draw.io 的换皮版本. ↩︎

  2. Export a diagram as a higher resolution PNG image : draw.io is becoming diagrams.net ↩︎

  3. 最新版中, 文本已更改为 “Text is not SVG - cannot display (文本不是 SVG - 无法显示)”. ↩︎

  4. 引用自 Inkscape 论坛 中 @Xav 的回答. ↩︎

  5. 参见 Why text in exported SVG images may not display correctly (diagrams.net). ↩︎

  6. 来自 Inkscape 论坛 下的 回复 ↩︎

  7. 可以参考视频 “PDF 里, 到底都是些什么 - 哔哩哔哩”. ↩︎

  8. 通常, 这个选项可以在上下文菜单的 “分享”, “打印” / “另存为 PDF” 中找到. ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】043:图片自动矢量化

本文讲解Globalmapper自动矢量化教程,配套案例数据。 参考教程:ArcGIS实验教程——实验三十三:ArcScan自动矢量化完整案例教程 文章目录 一、加载实验数据二、启动矢量化工具三、矢量化栅格四、矢量化结果五、注意事项一、加载实验数据 打开配套实验数据包中的data043.rar…

C#代码实现矢量画图

要实现C#代码画矢量图&#xff0c;其基本原理是先创建一个容器作为画板&#xff0c;然后创建Line(直线)、PolyLine(多段线)、Rectangle(矩形)或者Ellipse(椭圆)基本绘图对象生成各种矢量图形&#xff0c;最后把这些图形对象添加到画板中即可&#xff0c;一般用Canvas容器作为画…

matplotlib绘图并导出eps矢量图和svg矢量图

matplotlib导出矢量图并解决中文无法正常显示问题 做仿真经常需要输出各种矢量图用于论文插图&#xff0c;下面展示了导出eps矢量图和svg矢量图的方法&#xff1a; import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] # 用来正常显…

知识库AI机器人客服(基于ChatGPT3.5)对接-唯一客服系统文档中心

此功能是利用chatgpt训练企业知识开发个性化客服系统&#xff0c;可以上传自有数据&#xff0c;基于向量数据库与OpenAI Embedding&#xff0c;以及OpenAI chat/completions接口&#xff0c;实现的基于自建知识库的ChatGPT AI客服功能 管理员创建集合 向量数据库集合&#xff0…

Lazada跨境卖家必备的精细化运营工具Ushop BI的智能化选品功能

东南亚跨境电商市场的不断发展壮大&#xff0c;使得东南亚市场成为了许多跨境商家的掘金圣地&#xff0c;而Lazada作为东南亚市场的两大跨境电商平台之一&#xff0c;其发展潜力是不容小觑的&#xff0c;许多商家入驻Lazada平台是希望可以在这里将店铺做大做好&#xff0c;那俗…

跨境电商选品重要吗?

选品很重要&#xff01; 跨境电子商务选择的核心要求&#xff1a;优质商品&#xff0c;价格优势&#xff0c;符合跨境销售特点&#xff0c;满足目标海外市场需求&#xff0c;突出自身特色竞争优势。 跨境电商是如何选择产品的&#xff1f; 这个问题也很流行&#xff0c;应该考虑…

注册kaggle帐号及kaggle绑定手机收不到验证码的问题

由于自己在这上面折腾了不少时间&#xff0c;故写下这篇博客&#xff0c;希望对大家有用。 一、注册kaggle帐号 点击进入kaggle网站 kaggle网站 1.点击sign in 2.如果有雅虎、google、facebook账户的话&#xff0c;是可以直接登录的。如果没有这些账户&#xff0c;就点击Reg…

解决新用户注册Kaggle无法显示验证码的问题

解决新用户注册Kaggle无法显示验证码的问题 老板近期要求做一个比赛&#xff0c;需要注册Kaggle账户&#xff0c;但是在注册界面会无法出现人机验证&#xff0c;在这里记录一下解决的过程&#xff1a; 1.注册无法验证 2.尝试插件解决 为了解决这个问题&#xff0c;我参考了很…

手机验证码接收注册新账户

在写注册的时候想使用手机号进行验证&#xff0c;用来保证用户的安全性操作&#xff0c;因为以前使用的是邮箱验证&#xff0c;太麻烦了。所以在网上找到了一个比较好的第三方提供短信送达服务&#xff0c;有的还需要企业用户认证&#xff0c;这里我选择的是网易云的短信服务。…

我看CHATGPT: 为啥谷歌掉了千亿美金

两个月前&#xff0c;我试着想用 ChatGPT 帮我写篇文章《eBPF 介绍》&#xff0c;结果错误百出&#xff0c;导致我又要从头改一遍&#xff0c;从那天我觉得 ChatGPT 生成的内容完全不靠谱&#xff0c;所以&#xff0c;从那天开始我说我不会再用 ChatGPT 来写文章&#xff08;这…

chat聊天程序

服务端: package cs;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.*; import java.net.ServerSocket; import …

多家游戏交易平台发声,禁止未成年人买号租号

游戏租号绕开防沉迷系统事件迎来下文。9 月7 日&#xff0c;DD3737、交易猫、5173 等游戏交易平台相继发布声明&#xff0c;已采取严格措施禁止任何未成年人利用游戏交易平台买卖和租赁游戏账号。 同时&#xff0c;上述游戏交易平台还呼吁&#xff1a;游戏出版、发行、运营、交…

Vue3 TS setup 引入 markmap 思维导图,通过markdown解析成思维导图,集成到自己项目中

【前言】%&#xff08;&&#xff08;&……&#xff08;&#xff09;* 最近刚好做了个项目&#xff0c;给大家分享一个Vue3 TS setup 如何引入 markmap 思维导图,markmap可以通过markdown解析成思维导图。我们如何将它集成到自己项目中&#xff1f; 【看图】还是先看图…

一文学会:使用ChatGPT做XMind思维导图

先下载工具&#xff1a;XMind工具下载 假设我现在是一个小白&#xff0c;我想入行人工智能&#xff0c;我想让ChatGPT帮我生成一个学习路线&#xff0c;并做成思维导图的形式&#xff0c;那首先&#xff0c;我要告诉ChatGPT我想要的主题是什么 Prompt1:“我是一个大学生&#x…

ChatGPT4:智能化聊天工具,为你的生活带来更高效、便捷和多样化的聊天体验

随着时代的发展&#xff0c;人们的生活越来越快节奏化&#xff0c;工作压力越来越大。因此&#xff0c;他们需要一个智能化、高效率的聊天工具&#xff0c;来更好地完成工作和娱乐。恰巧&#xff0c;ChatGPT4是这样的一款聊天工具&#xff0c;它通过人工智能技术能够与用户进行…

AI_News周刊:第一期

2023.02.06—2023.02.12 关于ChatGPT的前言&#xff1a; 在去年年末&#xff0c;OpenAI的ChatGPT在技术圈已经火了一次&#xff0c;随着上周它的二次出圈&#xff0c;ChatGPT算得上是人工智能领域的一颗明星&#xff0c;它在聊天机器人领域有着不可忽视的影响力。其准确、快速…

九龙证券|突然哑火!最火爆中小盘明显回调,后市咋走?机构最新解读

中证1000和国证2000指数创年内新高后&#xff0c;连续2日回调。 2月17日A股商场震动下行&#xff0c;创业板指数跌幅超2%&#xff0c;近3000只个股跌落&#xff0c;北向资金小幅净流入&#xff0c;商场成交额接近万亿关口&#xff0c;港股也出现显着回调痕迹。 以中小市值公司…

java程序员应聘优秀简历

年 龄&#xff1a;22 姓 名&#xff1a;___ 性 别&#xff1a;男 联系电话&#xff1a;____ 联系邮箱&#xff1a;____ 现住址&#xff1a; 专 业&#xff1a;计算机网络与电子商务 择业目标 Java软件工程师 基于Oracle数据库&#xff0c;MySQL数据库&#xff0c;Web应用的Java…

理性和感性 - 如何对待错误

上次的博客&#xff0c; 我写了一些关于 软件开发中的理性和感性决定 的故事。 不论是感性还是理性&#xff0c;我们的目的就是要把软件交给用户去用&#xff0c; 在软件行业中有这样一句俗话&#xff1a; 当你把产品交给用户的时候&#xff0c;你的学习才刚刚开始。 当然每个团…