draw.io 图像导出的几个问题
起因
今天同门遇到了一些 draw.io 图像导出的问题,我和他一起分析定位了原因。
draw.io 论文画图三宗罪
截至 2025/4/13:
- 导出 pdf 兼容性不好,得用旧版或者 ghostscript 转换。
- 把 px 和 pt 混为一谈。
- px 的单位支持小数,导出时四舍五入,导致和预览时效果不一致。
我确实也承认 draw.io 方便,但有些地方还是很痛苦的。其他备选项:PowerPoint、Visio。
draw.io 导出 pdf 过大
使用脚本对图像压缩
实际上是一个 draw.io 文件中有大量的图片,每张图片体积过大,一个 draw.io 文件总体积达到 50M 以上。先导出之后再用 pdf 压缩工具图像会糊得厉害,但如果对每张图片分别压缩,再导出即可在保持图像高质量的同时显著降低 draw.io(以及之后导出的 pdf)的 文件体积。
脚本见 Compressing images in a draw.io file without modifying other attributes accidentally。这个脚本由 Gemini 生成,仅供参考,需求不同或 draw.io 版本不同可能需要修改代码。
效果:在给定的 draw.io 文件上做测试,50,178 KB 降低到了 2,388 KB。导出为 pdf 之后,文件体积还是涨到了 4MB,不过这也显著优于之前的导出结果。
新问题:图像压缩之后 pdf 无法插入 latex
收到另外一个同学反馈说这样虽然可以导出来 pdf,但是在 xelatex 中无法插入,会编译错误。换成 pdflatex 可以成功插入。有的 pdf 导出后则是 xelatex 和 pdflatex 均无法正常插入,并且编译器会报错 TeX capacity exceeded, sorry [PDF object stream buffer=5000000]
,尽管 pdf 文件小于 5M(我试的时候是 3.6M)。
这个是 draw.io 自己导出 pdf 的问题,有以下方法:
- 👍导出 pdf 之后先用 ghostscript 转换一次,保持版本不变也可以,降低版本也可以。
- 🤔使用网页版本,但可能只对某些文件有效。
- 👍使用 24.2.5 版本客户端导出。
使用 ghostscript 对 pdf 做转换
在 Windows 上,从 draw.io 导出的 pdf 文件版本为 1.7,pdflatex 可能最多只支持 1.5 的版本(日志里面有类似信息),猜测有兼容性问题(实际上不是,只是 draw.io 导出的 pdf 有问题罢了)。我在 Windows 上安装 ghostscript 之后将版本从 1.7 转换成 1.3 之后就能成功插入了。后来我发现其实不需要换旧版,只是 draw.io 导出的文件有问题,ghostscript 设置 pdf 版本为 v1.7,即相同版本,也可以使得 pdflatex 和 xelatex 能正常识别!
安装和使用 ghostscript 的步骤如下:
- 安装 ghostscript 先去官网找对应版本,见 Ghostscript : Releases。在 Windows 上面安装之后命令叫
gswin64c.exe
,找不到gs
这个名称不要怕,不同平台的名称不同而已。 - 转换版本:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -o out.pdf in.pdf
。转换好之后有的文件体积从 760KB 提升到了 1.3MB,还有的文件体积从 3.6MB 降低到了 1.6MB,说明版本不同存储方式不同。
注意,Overleaf 会将生成的 pdf 命名为 output.pdf,如果工程根目录存在 output.pdf 这个文件,将会编译失败,所以 -o
选项的输出文件我选择了 out.pdf 而不是 output.pdf。
尝试更换 draw.io 的版本
另外一个同学似乎没有遇到这种问题,我怀疑过是 macOS 上导出来的版本不是 v1.7,但让另外一个同学协助我,看起来因为用的都是 pdf-lib,导出的都是 v1.7,不同平台的客户端、网页都没有区别。后来原同学说用 24.2.5 版本客户端导出的才能正常工作,经验证这个版本导出的 pdf 的确能工作。
又试了一下,今天(2025/4/13)可用的网页版的导出对于有些文件而言是能正常工作的(有些则不能),但是客户端不行。感觉是网页版和客户端的版本并不同步。
draw.io 导出的图像位置无法对齐
尽管 draw.io 工具页面内预览时,图像是规整的,但是导出 pdf 或者 svg 之后图像会错位。根据我 2023(或 2024) 年的经验,第一个想到的是 draw.io 中的 pt 单位不对,可能实际上表示的是 px。Word 文档 14pt 对应 draw.io 16pt,见 The font size is incorrect · Issue #1448 · jgraph/drawio-desktop。
在 draw.io 中长度是可以输入小数的,尽管表示的是 px,这应该就是问题的关键。我们验证了在导出时,draw.io 会对图片的位置数值四舍五入,导致导出和预览效果不一致。将所有的图片的高宽、起始位置(xywh)都改成整数,重新调整下图像,就能做到导出和预览效果一致了。