除了少数仍在 Linux 上画流程图的老人,很多人第一次听到 Dia 多半是因为“搜索某本书配图工具时顺藤摸瓜摸到的”。我断断续续用了这个开源软件快十年,中间换过 Visio、试过 draw.io、也玩过一阵子 PlantUML,最后在需要快速画一张能放进文档里的架构图时,还是会老老实实打开 Dia。它没有 AI 自动生成、没有炫酷的云联动,甚至连官网都朴素得像上个世纪的遗物,但就是这种“朴素”,让它在某些场景下比那些大红大紫的工具都好用。
先说明白一件事:最近热词里出现“dia ai”,很多人以为这是一款 AI 画图工具,实际上 Dia(全称 Dia Diagram Editor)是一款老牌的开源图表绘制软件,主打流程图、网络拓扑图、UML 图、电路图这一类结构化图形,与 AI 生成图片完全是两码事。理解了这一点,再来看这份使用说明,你才知道它到底能帮你做什么。
1. 先说清楚:Dia 到底是个什么工具,现在还值得花时间学吗
Dia 诞生于上世纪九十年代末,最初是 GNOME 桌面环境下用来替代商业 Visio 的流程图软件。它的核心模型很简单:左边是成体系的图形对象库,中间是无限大小的画布,对象之间用连接线建立关联。这个模型看上去不起眼,却让它在“画结构图”这件事上做到了一种极致的专注。
和当代流行的图表工具相比,Dia 的取舍非常明显:
| 对比项 | Dia | Visio | draw.io | PlantUML / Mermaid |
|---|---|---|---|---|
| 价格 | 免费开源 | 商业订阅 | 免费/在线 | 免费 |
| 离线使用 | 完全支持 | 支持 | 需本地部署 | 需本地环境 |
| 图形对象库 | 丰富且可自定义 | 最丰富 | 丰富 | 代码生成 |
| 批量自动化 | 命令行导出 | 较弱 | 有 API | 天然支持 |
| 文件格式 | 纯 XML,可版本管理 | 私有格式 | XML/PNG/SVG | 纯文本 |
| 最长板 | 稳定、可嵌入文档流程 | 通用、生态大 | 协同方便 | 适合代码驱动的工作流 |
我自己把 Dia 留下来,主要是因为三个场景绕不开。第一个是离线环境,内网开发机上画图配图,不能指望浏览器在线服务;第二个是批量文档生成,把几十张 .dia 图通过命令行统一导出成 SVG/PNG,然后接进自动化文档管线;第三个是长周期项目里画“不需要太漂亮但必须改得动”的架构图,Dia 的纯 XML 文件直接用文本编辑器改文本、颜色,放到 Git 里还能看清楚每一次改动,这在多人协作时太关键了。
但也要泼一盆冷水:如果你追求的是设计感极强的视觉稿,或者需要多人实时在线协同,Dia 并不合适。它的界面和交互方式停留在“工具软件”的思维里,不会自动帮你排版,也没有云同步。不过正因如此,它的学习路径反而很短——核心就是搞清楚对象、连接线、图层、属性这四个概念,你就可以画出八十分的结构图。
所以,这篇说明的适用对象很明确:需要在 Linux 或 Windows 上稳定画图、想把手绘图表纳入文档流水线、或者对图形文件的“可读性”有执念的人。接下来我按自己的实际操作顺序,从安装讲到导出,把关键步骤和坑都摊开说。
2. 安装与界面初体验:从下载到第一张图的几张关键菜单
安装 Dia 不算复杂,不同平台的差异才值得注意。
Linux 用户最简单,Ubuntu/Debian 直接执行:
sudo apt install diaFedora 系的命令是sudo dnf install dia,Arch 系则是sudo pacman -S dia。装完以后终端输入dia就能启动。Windows 用户去官网下载区找 Windows 安装包,或者图省事用包管理器:
choco install diamacOS 上现在没有官方维护的 dmg 包了,建议直接走 Homebrew:
brew install --cask dia我最初在 Windows 上装 Dia 时踩过一个大坑:开启系统缩放(比如 125% 或 150%)后,整个界面糊成一团,菜单文字虚得没法看。后来发现是 GTK 程序的老毛病,右键 exe 属性里,进入“兼容性”选项卡,勾选“替代高 DPI 缩放行为”,并把缩放执行方式设为“应用程序”,重启软件基本能解决。Linux 下如果遇到菜单文字渲染异常,一般是主题缺图标或者字体没装全,建议把fonts-noto-cjk、fonts-wqy-microhei这类中文字体包装上,后面画中文图会省很多事。
第一次启动 Dia,你会看到一个“不太现代”但信息量很足的界面。左侧主工具箱是你最重要的区域,顶部有一个对象分类下拉框,默认叫“Main Toolbox”,下面按类别陈列图形对象;工具箱下方一般会有图层对话框,用来管理图层。中央大块空白是画布。顶部菜单栏里,File、Edit、View、Layers、Objects、Select、Tools、Diagrams几乎涵盖了所有操作。
想验证基本流程,试一下:从左侧工具箱选一个“Rectangle”对象,在画布上按住鼠标拖拽,就出现一个矩形。双击矩形,可以直接编辑里面的文字;右键选择“Properties”,则打开属性对话框,在这里可以调填充色、边框线宽、线型、文本对齐方式等。这时你已经会画第一张图了——至少一个带文字的框。
我记得第一次用的时候,费了半天劲才搞明白“对象工具箱顶部的下拉框”不是摆设,它决定你当前能拖出来的图形类别。如果我想画一个 UML 类图,得先把下拉框切成“UML”,再去找“Class”对象。很多人画图时找不到某个图标,多半就是这个下拉框没切对。
3. 画图前的三块制度地基:画布、网格、图层的正确用法
很多人用 Dia 画图觉得“控制不住”,不是手笨,而是跳过了三个基础设置:画布尺寸、网格吸附、图层体系。
Dia 的画布不像白板那样无限大,它默认按纸张尺寸显示,导出图片时也以画布边界为准。所以开始画之前,先打开菜单File -> Page Setup,把纸张设成合适的大小;如果不想按 A4 来,把自定义尺寸拉开。要注意的是,File -> Diagrams Properties控制的是网格间距、背景色这些画布自身的属性,和纸张尺寸是两回事。我通常把网格间距设成 0.1,背景用纯白,导出后视觉干净。
网格吸附是画图不歪的关键。在View菜单里勾选“Show Grid”显示网格,再确认“Snap to Grid”(吸附到网格)处于打开状态。开启吸附后,拖拽对象和连接线时,边缘会自动贴在网格交点上,这在画对齐要求高的框图时极其有用。但如果你画的是自由排布的 mind map,吸附反而碍事,可以随时关掉。
图层体系是 Dia 被很多人忽略、却最值钱的功能。想象一下,你要画一张网络拓扑图:底层有子网划分的虚线区域,中间是服务器图标,上层是标注文字。如果不分层,后续只要挪动一个服务器图标,就很可能把底层的虚线区域碰得乱七八糟。正确做法是把底层区域放到“Layer Base”图层,把服务器图标放到“Layer Server”图层,把文字标注放到另一个图层。viaLayers菜单可以新增图层、重命名、调整顺序,每个图层都能单独设置隐藏或锁定。
锁定的作用我在实际中体会最深:底层画完后立即锁定,后面不管怎么拖动上层对象,都不会碰坏它。隐藏图层则适合在画大图时临时收起不关心的部分,让编辑区清爽很多。尤其是画几百个节点的网络拓扑时,不开图层你会崩溃的。
分组也是规范操作的一部分。选中多个对象,按Ctrl+G把它们锁成一个整体,拖动时保持相对位置。取消分组的快捷键是Ctrl+Shift+G,双击组内的一个对象也可以临时进入组内编辑。分组和图层配合,基本可以应对绝大多数复杂图表的组织需求。
4. 工具箱与形状库:别只会用矩形和椭圆
Dia 左侧的工具箱本身自带了很多对象,但这只是冰山一角。工具顶部的分类下拉框对应的是“sheet”,也就是形状库的集合。常用几类我列一下:基本形状(Basic)、流程图(Flowchart)、UML、网络(Network)、电路(Circuit)、ER 图(ER)、组织结构图(Misc)等。
切换到“Network”,你能看到交换机、路由器、防火墙、服务器等图标;切到“UML”,类、接口、构造型、生命线、消息箭头都在里面。设计得相当克制,但也够用。
如果内置形状库不满足需求,可以自己加形状文件。Dia 的形状文件本质上是 XML 定义,描述了图形的几何元素和连接点位置。标准做法是先在 Dia 里画好一个复合图形,然后把这个图形导出或手动整理为 shape 文件,放到用户的~/.dia/shapes/目录,接着在~/.dia/sheets/下建一个表文件,让 Dia 知道这个目录里有哪些形状。修改之后重启 Dia,新形状就会出现在下拉框中。
当然,凡是涉及 XML 手动编辑的事情,学习曲线都不算平缓。如果你只是偶尔需要一两个特殊形状,我更推荐一个土办法:把画好的复合图形存成一个独立的.dia文件,当作“零件库”,需要的时候打开这个文件,把目标对象复制到当前画布。Dia 对复制粘贴跨文档支持得不错,这也是我在没有现成素材时最常用的补位套路。
还有一个小技巧:从工具箱拖出来一个对象后,如果觉得默认尺寸不对,不要直接拉缩放到变形。按住Shift键拖拽角上的控制手柄,可以等比缩放。对于圆形、服务器图标这类有明确视觉比例的图形,这个动作能帮你省掉很多修图的麻烦。
5. 连接线用好了,流程图才算入门:路由、粘点和箭头调教
画框图难的不在“画框”,而在“连线”。Dia 提供了三种连接线:直线、折线(polyline)、贝塞尔曲线。区别不在外观,而在路由算法。直线最简单,两个端点之间拉根直线,对象移动时直线始终连着。折线适合流程框之间绕行,它会在中途生成直角拐点。贝塞尔曲线适合那些希望线条平滑柔和的图,比如时序图里的简单曲线,不过控制点调整需要一点手感。
最关键的一个机制是“连接点粘附”。拖出连接线后,把线的端点拖到对象边缘附近,当端点吸附到对象的连接点(通常有高亮提示)时松开,这条线就和对象“粘住了”。粘住以后,不管你怎么拖动对象,线头都会跟着对象走,路径自动重算。
很多人画的图一拖动就乱,问题往往出在“线头画在了空白处”:看起来线端点和矩形挨得很近,实际没有吸附,对象一动线就脱开。判断方法很简单,选中对象移动一下,如果线头跟着动,说明粘住了;如果线头留在原地,说明只是视觉上碰巧接近,需要重新拉一次。
选中一条连接线,右键进入属性,可以看到一整套线型设置:线宽、颜色、箭头类型、虚线样式等。Dia 的箭头类型特别全,有实心三角、空心三角、V 型、圆点、斜线等十几种。画数据流图时,我习惯把数据方向的箭头设为实心三角;画依赖关系时用空心三角;画无向关联直接用一根直线不加箭头。统一这些符号语义,图才具备可读性。
折线还有一个实用技巧:双击折线中部,可以插入一个新的拐点;拖动拐点可以自由改变路径。如果拐点导致路径交叉,右键选择“重算路由”或者直接拖动它,让线绕开其他对象。这个操作我几乎每张图都要用,特别是拓扑图里线一多,没有拐点调整能力根本没法看。
连接点本身也可以自定义。选中一个对象后,对象边缘通常会有几个默认的控制点;在 Dia 的较新版本里,你可以在编辑状态下给对象补充连接点位置,让它支持更多的连接方向。这对网络设备这种需要接很多线的对象非常有用。我画交换机一类的设备时,通常把它接线方向控制在上下左右四个主连接点,从不把线接在面板斜角处,导出后视觉效果会规范很多。
6. 十三分钟画一张可发布的系统架构图:全流程实录
只讲概念不给实战等于白说。我以最常见的 Web 系统架构图为例,带你完整走一遍。
目标图:客户端 -> 负载均衡 -> 应用服务器(两个) -> 数据库和缓存,底层画一条子网隔离的虚线区域。
第一步,新建文件。启动 Dia,自动会新建一张未命名图。先按第三节说的,执行File -> Page Setup,把纸张改成横向 A4,或者更宽松的自定义尺寸。再打开File -> Diagrams Properties把网格间距设为 0.1,背景设为白色,这一步别偷懒。
第二步,切到“Network”分类,在画布左侧放一个“Client”对象;没有现成客户端图标的话,用 Basic 分类里的矩形代替也可以。再切到“Basic”,拉一个负载均衡的矩形。应用服务器我通常用 Network 里的服务器图标,如果嫌图标太小,就用 Basic 的矩形自己画,反正后面要加文字。数据库我习惯用“Database”对象,注意“Database”在 Basic 分类里就有,是一个圆柱体形状。缓存则是一个矩形加一个带折角的标记,或者直接用 Basic 的“Note”对象替代。
第三步,把底层的“子网区域”画出来。选 Basic 里的“Large Package”或者“Ellipse”,拉一个大框把所有后端组件罩住,填充色设成浅灰,边框设成虚线。这个框在语义上表示“内网隔离区域”。画完后马上把它拖到一个单独的图层,比如新建“Background”图层放进去,并把该图层锁定。这样不会影响后续调整。
第四步,连线。这里有两个方向选择:客户端到负载均衡用直线,负载均衡到两台应用服务器建议用折线,因为两台服务器并排,折线可以精确控制接入方向。每根线的端点一定要吸附到对象边缘的高亮连接点上。负载均衡到数据库和缓存的连接,用实心三角箭头,表示调用关系。线宽建议统一用 1.0 或 1.2,颜色用深灰或黑色。
第五步,标注文本。双击每个对象输入名称,比如“Nginx 负载均衡”“API 应用节点 1”。字体我习惯在属性对话框里统一改为“Noto Sans CJK SC”或“WenQuanYi Micro Hei”,字号 12 或 14,对象内部文本居中。这里的坑是 Dia 默认字体在中文环境经常不显示中文,手动切一下中文字体立刻就好。
第六步,对齐和美化。用“Select”菜单里的“Select All”选中所有对象,用工具栏上的对齐按钮(如水平居中对齐、垂直居中对齐)统一位置。对象之间留白要均匀,不要一个贴一个。如果需要精细调间距,可以把网格吸附暂时关掉,用方向键微调。
第七步,导出。菜单File -> Export,文件类型选 PNG,导出对话框里把分辨率从默认的 72 dpi 调到 150 甚至 300 dpi,不然放到文档里会发虚。如果只是为了网页展示,SVG 是更好的选择,后续缩放不失真。导出前我看一眼状态栏里的图元数量,如果线没有按预期粘在对象上,这时候最好回去重新连,别等导出完才发现一堆断头线。
整套流程第一次走通常要 20 分钟,熟练后基本控制在十分钟以内。这张图虽然谈不上惊艳,但放进技术方案文档里,结构清晰、改动方便,比很多花哨的在线工具导出来的东西都实用。
7. 导出和自动化:让 Dia 变成文档生产线的一环
手工点导出一次两次可以,图一多就必须走命令行。Dia 的命令行导出能力是我最喜欢它的地方。
最基本的一条命令:
dia --export=output.svg --filter=svg input.dia把svg换成png、pdf、eps、dxf等格式名,就能得到对应输出。老版本有些用-e参数,最新版仍然兼容-e和--filter组合,但我的建议是:脚本里明确写--export=和--filter=两个完整参数,避免不同发行版包装版本行为不一致。
批量导出一组.dia文件的场景,Linux/macOS 下我一般这么写:
for f in *.dia; do dia --export="${f%.dia}.png" --filter=png "$f" doneWindows 下用 cmd 写则长这样:
for %f in (*.dia) do dia --export="%~nf.png" --filter=png "%f"这套批量导出放进文档构建脚本里后,同事更新架构图时只需要重新生成一遍,不用再手动导图。我把这一步接进了自己的周报生成脚本,每周五自动把项目里所有.dia图导出为 PNG 和 SVG,一劳永逸。
导出格式的选择有讲究。PNG 适合嵌入 Word 或在线文档;SVG 适合网页和后续二次编辑;PDF/EPS 适合 LaTeX 论文或排版系统。Dia 的 PDF 导出会保留矢量信息,文字也能选中,这在打印场景下很稳。要提醒一句:如果图里用了特殊字体,导出的 PDF/SVG 在别的机器上可能因为缺字体而显示移位,最稳妥的做法是系统里统一安装同一款中文字体,或者导出前把文字转成路径。Dia 没有一键转路径的功能,所以只能靠字体统一来规避。
和 LaTeX 配合时,我通常直接导出 PDF 或 EPS,然后在文档里用\includegraphics引用。Dia 生成的 PDF 自带 PDF 裁剪框,部分裁剪框会有白边,这个问题可以在导出前把画布背景设成白色,并把画布尺寸尽量贴合图形内容,实际上Page Setup里可以手动设置边距,调到最小。如果你发现导入 PDF 后边缘有多余白边,不是调不掉的,回 Dia 调整一下页面边距,重新导出即可。
命令行还有一个不好发现的用途:通过--filter=svg导出后,再用rsvg-convert之类的工具把 SVG 转成任意目标格式。这样相当于绕开了 Dia 自带过滤器的一些兼容性问题。比如 Windows 上老版本 PNG 过滤器对透明背景的处理不佳,我遇到过导出 PNG 黑底的情况,改成“先导出 SVG,再转 PNG”就彻底解决了。
8. 几年用下来,我踩过的坑和我给你的避险建议
Dia 虽然稳定,但也不是没脾气。下面这些坑,我基本都踩过一遍,写出来帮你省点时间。
第一个坑:.dia文件是 XML 文本,这既是优点也是风险。很多编辑器默认能直接打开它,你确实可以手动替换颜色值、批量改字号。但一旦你把某个节点的属性写错,比如少写一个结束标签,Dia 打开时会报错,甚至直接拒绝打开。所以我强烈建议:手动编辑.dia文件之前先复制一份备份;编辑之后用文本编辑器的 XML 格式化工具过一遍,确认结构正确再打开。
第二个坑:版本兼容性。Dia 0.97.x 系列用了很多年,但 Linux 各发行版打包的版本有细微差别。曾经有同事用新版本保存的.dia文件,在我这台老版本上打开后丢失了部分箭头样式。后来我们规定团队内统一用 0.97.3,这个问题再没出现过。跨版本协作时,最好先确认彼此版本一致,或者用 SVG 作为交换格式。
第三个坑:字体。前面反复提过,中文显示离不开中文字体,但“显示正常”和“导出正常”是两回事。有时候屏幕上中文正常,导出 PNG 后变成方框。原因是 GTK 渲染和 PNG 过滤器的字体查找路径不一致。我的对策是:打开Edit -> Preferences,把默认字体设置为系统自带的中文字体,并在画图过程中少用“艺术字”式的旋转角度。如果某张图在导出后仍有文字丢失,直接把对应文本对象的字体改回标准字体,重新导出。
第四个坑:大图性能。Dia 对超大画布(比如几百个节点)的处理不算流畅。这种情况下,及时启用图层隐藏,把暂时不关注的节点所在图层隐藏掉,能明显提升拖动响应速度。另外,网格吸附在地图级别的画布上会产生“跳变”,如果对象排列突然失控,优先检查是否因为网格间距太小加上吸附开启,导致移动时幅度过大。
第五个坑:习惯性崩溃。Dia 整体很稳,但在快速连续操作时偶尔会崩,尤其是大图上频繁缩放、拖动、删除。我养成了一个习惯:重要的图每隔几分钟按一次Ctrl+S,同时开启系统的文件版本保留。因为.dia是文本格式,备份也不会占很多空间。
最后给一个我自己的经验:画图前先花两分钟规划图层面和语义符号。哪些对象放底层、哪些放上层,箭头分别代表什么含义,统一成一套规则。很多人用 Dia 觉得乱,不是因为软件难用,而是没有像写代码一样把图表结构“模块化”。一旦你想清楚了图层、连接点、分组这三个核心,Dia 其实是一个比大多数在线画图工具都可靠的生产力工具。
如果你打算长期用它,我建议你把那一两个经常用的自定义子网框、服务器节点、颜色模板存成独立的.dia零件文件,放到~/.dia/parts/,下一次画图直接复制进来。这个习惯,比到处找形状库实用得多。