PlantUML ASCII Art 输出asciiart包的文本渲染原理与实战指南【免费下载链接】plantumlGenerate diagrams from textual description项目地址: https://gitcode.com/gh_mirrors/pl/plantumlPlantUML 不仅能输出 PNG/SVG 等图形格式还能将时序图等 UML 图渲染为纯文本形式的 ASCII Art。本文以仓库中src/main/java/net/sourceforge/plantuml/asciiart/readme.md为核心结合其下 28 个 Java 源码文件讲解 ASCII Art 输出在 PlantUML 中的实现架构、两种输出格式txt与utxt、字符画布与形状绘制的底层原理并通过命令行与 Ant 构建示例给出可直接复用的实战方案。一、什么是 PlantUML 的 ASCII Art 输出asciiart包在仓库中位于 src/main/java/net/sourceforge/plantuml/asciiart其文档定义非常明确本包提供了用于将图表导出为 ASCII Art 输出格式的类。也就是说PlantUML 可以把文本描述.puml源码经过语法解析、语义建模之后不经过图形渲染管线而是直接落在一张“字符画布”上最终产出一个可以直接在终端、纯文本文件、邮件或文档中展示的 ASCII 图。对于时序图Sequence Diagram这种结构规整的图种ASCII 输出的可读性尤其好适合在无图形界面的 CI 日志、代码注释或命令行工具中嵌入。在 FileFormat.java 中可以看到ASCII 输出对应两种官方文件格式枚举枚举值扩展名MIME 类型说明ATXTtxttext/plain纯 ASCII 字符输出UTXTutxttext/plain;charsetUTF-8使用 Unicode 制表符UTF-8的增强输出两者的核心差异在于线条与图形的绘制字符txt使用-、|、,、.等传统 ASCII 字符而utxt使用─、│、┌、┐等 Unicode 框线字符视觉上更接近真正的图形渲染结果。二、ASCII 渲染的调用链从导出到字符画布当用户请求txt或utxt格式时PlantUML 并不会走普通的图形导出路径而是走一条专门的文本导出分支。在 UgDiagram.java 的exportDiagram中可以看到else if (fileFormat FileFormat.ATXT || fileFormat FileFormat.UTXT) specialResult exportTxt(os, index, fileFormat);UgDiagram是所有“可图形化”图表的抽象基类时序图等均继承自它因此 ASCII 导出被统一收口在这一处随后分发给asciiart包完成具体渲染。完整的调用链可以概括为.puml 源码 → 语法解析/建模 → UgDiagram.exportDiagram() → exportTxt() → TextSkin皮肤工厂→ ComponentText*组件渲染 → UmlCharArea字符画布→ 文本行输出其中两个关键入口在命令行与 Ant 任务中分别可见命令行入口 Pipe.java通过管道模式读取.puml时将输出格式设置为ATXT/UTXTAnt 任务入口 PlantUmlTask.javaplantumlAnt 任务同样支持将format属性设为txt或utxt。这证明 ASCII Art 输出是 PlantUML 一条一等公民的输出通道而非临时拼凑的调试功能。三、实战一命令行生成 ASCII 图使用 PlantUML 的命令行工具生成 ASCII 图非常简单。假设存在一份时序图源码sequence.pumlstartuml Alice - Bob: Authentication Request Bob -- Alice: Authentication Response Alice - Bob: Another authentication Request Alice -- Bob: another authentication Response enduml执行以下命令即可得到纯 ASCII 版本与 Unicode 版本java -jar plantuml.jar -ttxt sequence.puml # 生成 sequence.txt纯 ASCII java -jar plantuml.jar -tutxt sequence.puml # 生成 sequence.utxtUnicode 框线两种输出示意如下纯 ASCII 风格,-. ,-. - - Alice |\ Bob |\ |/ |/ / \ / \ | | | Authentication Request | |--------------------------| | | | Authentication Response | |--------------------------| | | | Another authentication R | |--------------------------| | | | another authentication R | |--------------------------| | |utxt版本则会把参与者头部的小人换成带框线的 Unicode 小人、把箭头横线换成─等字符整体更接近图形化渲染的观感。在需要把图直接贴进 Markdown、邮件或终端文档的场景下utxt通常更合适在需要最大兼容性如老式终端、纯 ASCII 协议时则选txt。四、实战二在 Ant 构建任务中输出 ASCII如果项目使用 Ant 构建可以在build.xml中通过 PlantUmlTask 批量把目录下的.puml文件导出为文本图target nameascii-diagrams taskdef nameplantuml classnamenet.sourceforge.plantuml.ant.PlantUmlTask classpathplantuml.jar/ plantuml dir./src/diagrams formattxt output./build/ascii/ /target将format属性改为utxt即可输出 Unicode 版本。这适合在构建流程中同步生成可直接嵌入 README 或变更日志的文本图。五、源码剖析字符画布BasicCharArea与UmlCharAreaASCII 渲染的底层是一张二维字符网格。两个核心接口定义了这一抽象BasicCharArea.java最基础的字符画布提供drawChar(char c, int x, int y)在指定坐标绘制单个字符fillRect(char c, int x, int y, int width, int height)用字符填充矩形区域drawStringLR(String s, int x, int y)从左到右绘制字符串drawStringTB(String s, int x, int y)从上到下纵向绘制字符串drawHLine/drawVLine绘制水平/垂直线支持在遇到特定字符时替换为转角字符getLine(int)/getLines()/print(PrintStream)输出成文本行。UmlCharArea.java在基础画布之上提供 UML 语义化的绘制原语drawBoxSimple/drawBoxSimpleUnicode绘制简单方框两种字符风格drawNoteSimple/drawNoteSimpleUnicode绘制便签Note右上角带折角drawShape(AsciiShape, x, y)绘制预定义的参与者形状drawStringsLRSimple/drawStringsLRUnicode多行文本绘制对MessageNumber等特殊对象做归一化处理。以drawBoxSimple为例UmlCharAreaImpl.java 的实现先画四条边再在四个角补上,、.、、四个转角字符而drawBoxSimpleUnicode则使用─│┌┐└┘框线字符。两者在视觉上差异明显这正是txt与utxt格式区别的落点之一。六、形状系统AsciiShape枚举参与者、数据库、边界boundary等符号在 ASCII 输出中由 AsciiShape.java 枚举统一管理枚举值宽 × 高用途STICKMAN3 × 5参与者纯 ASCII 小人STICKMAN_UNICODE3 × 6参与者Unicode 小人utxt使用BOUNDARY8 × 3边界图标DATABASE10 × 6数据库图标每种形状的绘制都以硬编码的多行字符串输出。例如STICKMAN由 5 行组成,-. - /|\ | / \而STICKMAN_UNICODE则是 6 行 Unicode 版本源码中以\u250c、\u2500、\u2510等转义形式存储┌─┐ ║│ └┬┘ ┌┼┐ │ ┌┴┐DATABASE形状则绘制成经典的圆柱体轮廓,.-^^-._ |-.____.-| | | | | | | -.____.-这些形状的宽高元数据width、height会被布局代码用来计算参与者列宽确保形状与其名称文本在画布上正确对齐。七、皮肤工厂TextSkin如何把 UML 组件翻译成字符TextSkin.java 继承自RosePlantUML 的默认皮肤重写了createComponent系列工厂方法把抽象的 UML 组件类型逐一映射到asciiart包内的字符组件实现组件类型对应实现类参与者ACTOR_HEAD/ACTOR_TAILComponentTextActor按UTXT与否选择STICKMAN_UNICODE或STICKMAN边界BOUNDARY_HEAD/BOUNDARY_TAILComponentTextShapeBOUNDARY形状数据库DATABASE_HEAD/DATABASE_TAILComponentTextShapeDATABASE形状普通参与者头部/尾部ComponentTextParticipant普通箭头ComponentTextArrow受maxAsciiMessageLength限制自身箭头self arrowComponentTextSelfArrow消息横线ComponentTextLine激活条activationComponentTextActiveLine分隔线 / 延迟 / 销毁 / 引用ComponentTextDivider/ComponentTextDelay/ComponentTextDestroy/ComponentTextReference分组groupingComponentTextGroupingHeader/ComponentTextGroupingBody/ComponentTextGroupingElse/ComponentTextGroupingTail便签 NoteComponentTextNote分页ComponentTextNewpage工厂方法中可以看到许多“按格式二选一”的分支例如 TextSkin.javaif (type ComponentType.ACTOR_HEAD || type ComponentType.ACTOR_TAIL) return new ComponentTextActor(type, stringsToDisplay, fileFormat, fileFormat FileFormat.UTXT ? AsciiShape.STICKMAN_UNICODE : AsciiShape.STICKMAN);这说明同一个组件在两种文本格式下拥有各自独立的字符绘制策略格式切换不会影响布局逻辑只影响落笔的字符集。在箭头渲染上ComponentTextArrow.java 同样区分格式UTXT时消息线使用─等框线字符ATXT时回退为-。此外它还受ISkinParam.maxAsciiMessageLength()见 SkinParam.java约束超过该阈值时会对消息文本做截断处理避免单行过长破坏画布布局。八、宽度计算Wcwidth与TextStringBounderASCII 画布是“等宽字符网格”因此文本测量不能依赖真实字体的像素尺寸而必须按“字符占据几个单元格”来计算。这正是 Wcwidth.java 的职责空字符U0000宽度为 0控制字符返回 -1组合字符Mn/Me/Cf 等类别内部通过一张约 150 个区间的COMBINING表做二分查找宽度为 0东亚宽字符CJK、全角符号、谚文音节等如0x1100-0x115F、0x2E80-0xA4CF、0xFF00-0xFF60宽度为 2其余字符宽度为 1。该类注释明确指出其实现源自经典的wcwidth.cIEEE Std 1002.1-2001 Unicode 列宽标准并由贡献者 Yasuhiro Matsumoto 提供。这意味着即使消息文本中包含中文、日文等双宽字符TextStringBounder.java 也能依据Wcwidth.length(text)准确估算文本占用的单元格数量从而让中文参与者的列宽计算与整体对齐保持正确。TextStringBounder实现了 PlantUML 的StringBounder接口专门服务于文本布局阶段——它不依赖java.awt.FontMetrics而是纯粹以字符网格为单位返回XDimension2D尺寸这是 ASCII 渲染与图形渲染在度量体系上的根本区别。九、包内其他辅助组件除上述核心类外asciiart包还包含若干支撑组件BasicCharAreaImpl.javaBasicCharArea的默认实现内部以ListString或等价结构维护字符网格并实现越界裁剪TranslatedCharArea.java带坐标偏移translate的装饰器画布用于在父画布的子区域渲染组件AbstractComponentText.java所有ComponentText*组件的公共基类提供画布获取、宽度计算等通用逻辑package-info.java包级文档与注解。从整体结构看asciiart包采用“皮肤工厂 组件渲染器 字符画布 宽度度量”的分层设计TextSkin决定组件类型到渲染类的映射ComponentText*决定每种组件的字符绘制细节UmlCharArea/BasicCharArea提供绘图原语Wcwidth/TextStringBounder提供布局度量——四层各司其职共同支撑起txt与utxt两种文本输出格式。十、适用场景与限制综合文档与源码ASCII Art 输出的适用场景包括CI/CD 日志与构建产物无需安装字体与图形库即可生成可读的时序图文本直接沉淀到构建日志文档内嵌utxt输出的 Unicode 版本可直接粘贴进 Markdown、Javadoc、邮件等纯文本媒介终端工具链通过 Pipe.java 的管道模式把.puml文本流直接转换为 ASCII 输出便于在 Shell 脚本中串联处理可访问性与可检索性文本形式的图可被搜索引擎、diff 工具与版本控制系统直接索引和对比。需要说明的限制可由源码确认目前asciiart包的TextSkin工厂主要针对时序图语义组件参与者、箭头、激活、分组、便签等实现了字符渲染且createComponent中对未支持的类型会抛出UnsupportedOperationException见 TextSkin.java。因此 ASCII 输出的完整语义覆盖以时序图为重点其他图种能否获得良好文本渲染取决于其组件类型是否被该工厂支持。十一、继续深入阅读若希望进一步研究 ASCII 输出的实现细节建议从以下仓库路径入手包入口与文档src/main/java/net/sourceforge/plantuml/asciiart/readme.md字符画布接口与实现BasicCharArea.java、UmlCharAreaImpl.java形状与皮肤工厂AsciiShape.java、TextSkin.java宽度度量Wcwidth.java、TextStringBounder.java格式定义与导出入口FileFormat.java、UgDiagram.java命令行与 Ant 集成Pipe.java、PlantUmlTask.java通过这些文件你可以完整追踪从.puml文本到终端可见字符图的每一步转换并在此基础上扩展属于自己的 ASCII 组件或形状。【免费下载链接】plantumlGenerate diagrams from textual description项目地址: https://gitcode.com/gh_mirrors/pl/plantuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
5步搞定2013年流行歌曲数据清洗:附完整示例避坑指南 5步搞定2013年流行歌曲数据清洗:附完整示例避坑指南 报错一堆看不懂 StackTrace?别慌,这通常是环境依赖或数据格式没对齐。我直接甩给你一套 完整示例 ,专治各种“歌名匹配不上”的顽疾。 项目目标与痛点拆解… · 2026/9/23 2:18:52
电子连接器温升仿真:ICEPAK与Q3D耦合分析及接触电阻处理 简介:这份PDF文档面向电子连接器设计、热管理与仿真分析方向的工程师及高校研究人员,聚焦连接器通电流后的温升预测难题。针对连接器塑胶本体多孔、端子与铁壳表面特征复杂、传统有限元稳态导热法依赖经验换热系数的局限,文档提出将表面换热系… · 2026/9/23 2:18:52
用C语言实现Ping程序:ICMP原理与原始套接字实战 简介:面向C语言网络编程学习者,提供一份用C语言实现Ping命令功能的精简示例,以解决ICMP协议报文构造、原始套接字使用及往返时间计算等核心问题,可作为计算机网络课程设计、网络实验或底层协议入门的参考,适合学生、运… · 2026/9/23 2:18:52
管理者高效汇报的7大场景与5大陷阱 1. 从执行者到管理者的思维转变刚晋升为经理的前三个月,是我职业生涯中最痛苦的适应期。记得第一次参加部门周会时,我花了20分钟详细汇报了自己写的代码和调试过程,却发现总监的眼神越来越飘忽。会后,我的直属上司拍了拍我肩膀&am… · 2026/9/23 3:54:44
OpenCV+Mediapipe手势识别毕设源码:关键点提取与音乐触发实战 简介:这是一套面向计算机相关专业学生与项目实战学习者的手势识别系统源码,基于Python与OpenCV实现,适合用作毕业设计、课程大作业或技能练习的参考方案。项目经导师指导并通过评审,难度适中,源码均经本地编译调试&… · 2026/9/23 3:54:44
3招搞定刘伯温四不像图,避坑高频面试题 3招搞定刘伯温四不像图,避坑高频面试题 复制来的代码跑不通,报错信息满屏飞,新手最容易在这里卡死。 别慌,这种“刘伯温四不像图”式的逻辑陷阱,也是 高频面试题 里的常客。 今天不整虚的,直接拆解底层逻辑,教你怎么把死代码变活。… · 2026/9/23 3:54:44
SAP Concur国产替代深度评测:8款差旅费控平台选型指南 做费控选型这件事,我前前后后参与过好几次。最早一批国内企业用户接触到SAP Concur,多半是因为外企总部统一要求,或者企业有海外上市、审计背景。Concur本身确实是全球差旅费用管理的标杆,流程严谨、功能成熟,这一点没… · 2026/9/23 3:54:37
计算机组成原理入门:从数据通路到控制器详解 简介:面向计算机组成原理零基础读者的入门PDF,从冯诺依曼体系结构切入,系统讲解运算器、控制器、存储器、输入输出设备五大部件,进而展开CPU内部结构、存储系统的层次划分、程序执行全流程,以及数据表示、总线系统与发… · 2026/9/23 3:54:31
htc刷机避坑指南:环境配置卡壳?这份保姆级教程救你 htc刷机避坑指南:环境配置卡壳?这份保姆级教程救你 还在为配置ADB环境就卡半天而抓狂?很多HTC老用户想折腾系统,结果在开发者选项里转悠半小时,连接上电脑却提示“未识别的设备”,或者刷入包后直接变砖。这种“配置环境就卡半天”的挫败感,是… · 2026/9/23 3:54:31
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29