最稳方案是手动设置字体为 Microsoft YaHei 或 Noto Sans CJK SC,勾选“嵌入字体”,CLI 导出需加 --embed-fonts 参数;PowerDesigner 应用 Report 导出并启用扩展属性;dbdiagram.io 需缩放适配+禁用自动布局;Python 脚本中需预处理类型字符串换行并指定 graphviz 引擎。
用 draw.io 导出 ER 图为 PDF 时中文乱码怎么办
默认导出的 pdf 中文显示为方块或空白,根本原因是 draw.io(尤其是桌面版或旧版在线版)未嵌入中文字体,且导出时依赖系统字体渲染,而 linux/macos 默认无思源黑体等常用中文字体路径映射。
- 最稳方案:在
draw.io编辑界面右上角点「文件 → 页面设置 → 字体」,把所有文本样式(包括连接线标签、实体名、属性名)手动设为Microsoft YaHei或Noto Sans CJK SC(后者需提前装到系统) - 导出前务必勾选「文件 → 导出为 → PDF → 嵌入字体」复选框——这个选项默认关闭,不勾就白调字体
- 如果用 CLI 批量导出(如
drawio-cli),必须加参数--embed-fonts,否则即使 UI 里设了也没用
PowerDesigner 导出 ER 到 PDF 后扩展类型(如 JSON、ARRAY)被截断或丢失
PowerDesigner 对自定义数据类型的 PDF 渲染支持极弱,尤其当使用「Extended Attributes」或「User Defined Types」定义了 JSONB、hstore、geometry 等 PostgreSQL/PostGIS 扩展类型时,PDF 只显示基础类型名(如 USERDEFINED),原始语义全丢。
- 导出前进入「Tools → Resources → Data Items」,确认每个扩展类型在「Physical Options」页签里已填写完整
DBMS Specific Type(例如填jsonb而非留空) - 不要用「File → Export → PDF」直出,改用「Report → Generate Report」,模板选
Physical Data Model Report,在「Report Options」里勾选「Show extended attributes」和「Show DBMS-specific types」 - 生成的报告是 HTML,再用
wkhtmltopdf转 PDF:命令形如wkhtmltopdf --encoding utf-8 --zoom 1.2 input.html output.pdf,比原生导出保留字段级元数据更可靠
dbdiagram.io 导出的 PDF 没有外键连线或关系标注
dbdiagram.io 的 PDF 导出本质是网页快照,它只渲染当前视口内可见内容,且关系线(FK 连线)默认不随缩放重绘,导出时常被裁掉或变虚线甚至消失。
- 导出前先点右上角「Zoom to fit」,确保整张图完全可见;然后按
Ctrl + -缩小 1–2 级(比如从 100% 到 80%),让连线有足够像素宽度被 PDF 引擎捕获 - 禁用「Auto-layout」:点「Settings → Disable auto-layout」,手动拖动表位置,让 FK 连线尽量走直线、避开重叠——自动布局生成的贝塞尔曲线在 PDF 渲染中极易断裂
- 若仍不显示,临时改用 Chrome 打印:右键 →「打印 → 目标打印机选“另存为 PDF”」,在「更多设置」里关掉「背景图形」以外的所有选项,反而比原生导出更准
用 Python 脚本批量导出 ER 图 PDF(如基于 sqlacodegen + graphviz)时扩展类型名不换行、溢出边界
用 graphviz 渲染带复杂类型(如 ARRAY<integer></integer>、ENUM('active','pending'))的字段时,节点宽度会爆炸,PDF 中单行挤满整页,后续字段全被压扁或截断。
- 在生成 DOT 文件时,对类型字符串做预处理:用正则把
<code>>替成<>,并用\n插入换行点,例如ARRAY<integer></integer>→ARRAY\n<integer></integer>,graphviz会识别换行符 - 给
graphviz.Digraph实例加全局配置:graph_attr={'rankdir': 'LR', 'nodesep': '20', 'fontsize': '10'},避免纵向堆叠导致横向挤压 - 导出 PDF 时别用
.render()默认引擎,显式指定engine='dot'和format='pdf',某些系统上neato或fdp对长文本排版更差
真正卡住的地方往往不是“怎么导出”,而是“导出时谁在控制字体、换行、嵌入、缩放”——这三个变量任何一个没对齐,PDF 就会漏信息、错排版、丢类型。动手前先确认你用的是哪个工具链的哪一层导出入口,而不是只盯着菜单里的“导出 PDF”按钮。










