当前位置: 首页 > news >正文

jsPDF中文显示速通指南:4步搞定中文字体注册与自动换行

jsPDF中文显示速通指南:4步搞定中文字体注册与自动换行

【免费下载链接】jsPDFClient-side JavaScript PDF generation for everyone.项目地址: https://gitcode.com/gh_mirrors/js/jsPDF

控制台没有任何报错,下载下来的 PDF 却是一排排方框——这是 jsPDF中文显示 最常见的翻车现场。下面按“转字体 → 注册字体 → 排版换行 → 压缩产物”的动线,把中文字体完整接进文档。

jsPDF 默认只内置 Helvetica、Times-Roman 等 14 款 PDF 标准字体,字符集止步于 ASCII。中文码点在这些字体里没有字形,写入后只能渲染成方框,这就是乱码的根因。解法只有一个方向:注册一款自带中文字形的 TTF 字体。

第一步 拿到字体:用 fontconverter 转出注册脚本

  • 打开仓库自带的转换器 fontconverter/fontconverter.html
  • 填写字体名(如simhei)与样式(normal / bold)
  • 选中本地 .ttf 文件,点 Create
  • 浏览器会下载一个 .js 文件:TTF 被编码成 base64 字符串,并附带注册代码
  • 把生成的 .js 引入项目,jsPDF 初始化后字体即自动生效

不想走转换器的话,也可以用fetch把 .ttf 读成二进制字符串,手动走下面三步。

第二步 注册字体:addFileToVFS → addFont → setFont

// 字体写入虚拟文件系统,注册为 simhei 并切换过去

doc.addFileToVFS('simhei.ttf', base64Data); doc.addFont('simhei.ttf', 'simhei', 'normal'); doc.setFont('simhei');

addFont的第一个参数要和addFileToVFS的文件名一致;setFont传的是字体名(第二个参数),别传成文件名。

第三步 排版:maxWidth 一行解决自动换行

// 指定最大宽度自动折行,行高系数放大到 1.4

doc.setFontSize(14); doc.text('你好,这是一段中文排版示例,超宽时自动折行。', 10, 30, { maxWidth: 180, lineHeightFactor: 1.4 });
  • 不传maxWidth(或传 0)时不会折行
  • 默认行高系数是 1.15,中文场景建议 1.3~1.5

长文本先过一遍 splitTextToSize

// 按宽度切分成多行,再整体写入

const lines = doc.splitTextToSize(longText, 180); doc.text(lines, 10, 50);

跨页场景下,用返回的行数检查 y 坐标,避免文字被切到下一页之外。

第四步 压缩产物:把文件体积压下去

// 生成时开启压缩

const doc = new jsPDF({ unit: 'mm', format: 'a4', compression: true });

字体是体积大头。全文档只用到几十个汉字时,先用字体子集工具裁掉未用字符,再配合compression,效果最明显。

📋 避坑速查表

现象原因一句话处理
中文渲染成方框标准字体无中文字形注册中文 TTF 并 setFont 切换
已注册仍乱码TTF 本身缺中文字形换支持中文的字体(思源黑体等)
行距挤成一团行高系数默认 1.15 偏小text 里传lineHeightFactor: 1.4
文字溢到下一页未做换页判断splitTextToSize 拿到行数后检查 y
文件几十 MB整字库全量嵌入字体子集化 +compression: true
addFont 报错文件名两处不一致addFileToVFS 与 addFont 用同一文件名

📚 延伸阅读

text全部选项与addFont签名见 README.md;非拉丁字体接法可参考 examples/japanese.js 与 examples/russian.js;完整 API 文档在 docs/ 目录。

【免费下载链接】jsPDFClient-side JavaScript PDF generation for everyone.项目地址: https://gitcode.com/gh_mirrors/js/jsPDF

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4192327.html

相关文章:

  • tts-server-android:把网络 TTS 音色搬进安卓的朗读与转发方案
  • NBTExplorer 完整上手指南:6 种 Minecraft 数据格式一次搞懂
  • FreeToken:大模型本地推理加速算法解析与实践指南
  • M401a S905L3 刷入 Armbian 完整步骤:把旧电视盒变成 7×24 小时家用 Linux 服务器
  • Lumi源码解析:从WSGI协议到请求分发,看懂迷你框架的核心实现原理
  • SMU Debug Tool 实践指南:Ryzen 逐核调优与底层寄存器读写的完整路径
  • 深入Combo Breaker核心数据结构:区间树与红黑树的工程化实现
  • 3个场景搞定小说创作:提示词库从入门到出活
  • FreeToken技术解析:无损加速本地大模型推理,突破注意力机制内存墙
  • 数学建模论文写作指南:从摘要到附录的高分策略
  • ipydatagrid API速查手册:DataGrid、选择器与渲染器属性完整清单(附示例代码)
  • 如何用手柄玩魔兽世界:WoWmapper 完整配置教程
  • 城通网盘直连解析:用 ctfileGet 拿到一次性下载地址
  • 数据中心AI部署实战:从8MW电力规划到B300服务器容量计算与全链路开发
  • C++模板型别推导:从auto到完美转发的核心机制解析
  • PowerToys FancyZones 窗口管理完全指南:5 分钟掌握免费多屏布局吸附
  • C++模板编程深度解析:从泛型基础到元编程实战
  • NSFC LaTeX模板:格式对齐后还有三条参与路径
  • C++类模板局部特化与默认实参:从通用到定制的进阶指南
  • 美赛B题“扑灭野火”建模全解析:从元胞自动机到遗传算法的动态优化实战
  • 动态多智能体路径规划:从算法原理到工程实践
  • 揭秘laravel-blade-javascript责任链模式:6个Transformer协作转换任意值到JavaScript
  • 10分钟导入600+设备红外代码:Flipper Zero红外遥控完整实操
  • AI原生SDLC实战:基于Agent的智能软件交付循环构建指南
  • 动态多智能体路径规划与任务调度在机器人蜂窝仓储系统中的工程实践
  • YDF高级特征指南:时序、多维、预训练嵌入特征喂给决策树的简单方法
  • ComfyUI脸部修复实战:MiniMax H3与T8节点应用指南
  • C++可变参数模板:从语法到实战的范式革命
  • faiss_tips:如何把FAISS向量搜索搬上GPU,3行代码让检索速度起飞
  • 完整指南:KeqingNiuza 原神祈愿记录分析与五星保底预测的实战拆解