3步搞定jsPDF中文显示:从乱码到完美输出的完整指南

3步搞定 jsPDF 中文显示:从乱码到完美输出的完整指南

jsPDF 默认只支持 14 种标准 PDF 字体(Helvetica、Times 等),完全不支持中文字符,导致中文显示为方框或乱码。
核心解决办法:引入支持中文的自定义字体(TTF → 转换 → 加载)。

2025-2026 年最推荐、最稳定的方式是使用思源黑体 / 思源宋体 / Noto Sans CJK 等免费开源字体,并通过官方推荐的转换工具处理。

步骤 1:准备中文字体文件(.ttf)

选择体积适中、支持简体中文的字体(推荐以下任一):

  • 思源黑体(Source Han Sans):现代感强,推荐
    • 下载地址:https://github.com/adobe-fonts/source-han-sans (选择 OTC 或 TTF 版本,建议 SC 简体中文子集)
  • 思源宋体(Source Han Serif):更正式的场景
  • Noto Sans CJK SC:Google 出品,覆盖全面
    • https://fonts.google.com/noto/specimen/Noto+Sans+SC
  • 更小的子集字体(推荐生产环境):使用工具裁剪只保留常用汉字,文件可从几 MB 降到几百 KB

小技巧:字体文件越小,PDF 生成越快、文件体积越小。优先找“简体中文子集”版本。

步骤 2:将 TTF 转换为 jsPDF 可用的 JS 格式

jsPDF 官方提供了字体转换工具(fontconverter),将 TTF 转为 base64 + 字体定义的 JS 文件。

操作方式(最简单两种,任选其一):

方式 A:在线转换(推荐新手)

  1. 打开 jsPDF 官方在线转换器(或 fork 版本):
    • https://rawgit.com/MrRio/jsPDF/master/fontconverter/fontconverter.html
    • 或 https://peckconsulting.s3.amazonaws.com/fontconverter/fontconverter.html
  2. 拖入或选择你的 .ttf 文件(例如:SourceHanSansCN-Normal.ttf)
  3. 自动填充:
    • Font name:自定义(如 ‘SourceHanSansCN’)
    • Font style:normal(或 bold/italic 根据实际情况)
  4. 点击 Convert → 下载生成的 JS 文件(例如:SourceHanSansCN-normal.js)

方式 B:本地转换(项目多字体时推荐)

  1. 打开 jsPDF/fontconverter/fontconverter.html(浏览器直接打开)
  2. 同上操作,生成 JS 文件

克隆 jsPDF 仓库:

git clone https://github.com/parallax/jsPDF.git 

生成的文件内容大致是

(function(jsPDFAPI){var font ='AAEAAA...';// base64 编码的字体数据(很长) jsPDFAPI.addFileToVFS('SourceHanSansCN-Normal.ttf', font); jsPDFAPI.addFont('SourceHanSansCN-Normal.ttf','SourceHanSansCN','normal');})(jsPDF.API);

步骤 3:在代码中引入并使用中文字体

完整示例代码(Vue/React/纯 JS 通用)

<!-- 1. 引入 jsPDF --><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script><!-- 2. 引入你转换后的字体文件(推荐放 public 或 static 目录) --><scriptsrc="./fonts/SourceHanSansCN-normal.js"></script><script>// 3. 生成 PDFfunctiongeneratePDF(){const{ jsPDF }= window.jspdf;const doc =newjsPDF();// 设置中文字体(必须在 text 之前调用) doc.setFont('SourceHanSansCN','normal');// 字体名要和 addFont 时一致// 可选:设置字体大小 doc.setFontSize(16);// 输出中文(现在不会乱码了) doc.text('你好,世界!这是一个支持中文的 jsPDF 示例。',20,30);// 支持混合中英文 doc.text('Hello, 这是一段中英混合文本,完美显示~',20,50);// 如果有粗体需求(需单独转换 bold 版本)// doc.setFont('SourceHanSansCN', 'bold'); doc.save('中文PDF示例.pdf');}// 调用// generatePDF();</script>

常见问题 & 解决方案速查表

问题原因解决办法
仍然方框/乱码没调用 setFont必须在 text 前 doc.setFont(‘你的字体名’)
字体名找不到(warning)addFont 的名称不匹配确认 addFont 的第2个参数(字体家族名)
PDF 文件超大完整 TTF 文件太大使用字体子集工具裁剪(只保留常用汉字)
转换后文件报错jsPDF 版本不兼容建议用 2.5.x 版本 + 对应转换工具
多人协作 / CDN 加载字体 JS 文件太大上传到 OSS/CDN,动态 import 或 xhr 加载
AutoTable 中文也乱码AutoTable 需要单独设置字体table.styles.font = ‘你的字体名’

推荐字体组合(生产级)

  • 正常文本:SourceHanSansCN-Normal
  • 粗体:SourceHanSansCN-Bold(需单独转换)
  • 标题:SourceHanSerifCN-Bold(宋体风格)

一句话总结
下载 TTF → 用 fontconverter 转成 JS → 引入 + setFont → 中文完美显示
整个过程最长不超过 10 分钟,就能彻底告别中文乱码。

需要我提供某个具体字体的转换后代码片段?
或者想看结合 html2canvas + jsPDF 导出页面的完整中文版示例?
直接告诉我~

Read more

【JAVA--springboot 代理】

加载配置文件 * 首先需要创建一个Spring Boot项目,并添加以下依赖 * 创建主应用程序类 * 创建代理控制器类 * 在application.properties或application.yml中配置 * 添加CORS配置类 * 说明事项 * 测试如下: * 启动脚本 * 使用Bruno工具发送请求,正确返回通过,如下图: 首先需要创建一个Spring Boot项目,并添加以下依赖 * Spring Boot Starter Web * Spring Boot DevTools (可选,用于开发时自动重启) * Lombok (可选,用于简化代码) 创建主应用程序类 packagecom.sky;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;im

By Ne0inhk
《飞算Java AI:从安装到项目生成·一天助你成为Java高手》

《飞算Java AI:从安装到项目生成·一天助你成为Java高手》

前引:在当今快速发展的技术环境中,人工智能(AI)与编程语言的结合为开发者提供了前所未有的便利。飞算Java AI作为一款智能化编程工具,能够显著提升Java开发效率,减少重复性工作,并帮助开发者更专注于创新与业务逻辑的实现!本教程旨在为Java开发者提供一份全面的飞算Java AI使用指南,涵盖从环境配置到核心功能应用的全流程操作。通过智能化代码生成、自动错误修复、智能调试等能力,飞算Java AI能够协助开发者快速构建高质量的应用,同时降低学习和维护成本! 无论你是初学者还是经验丰富的工程师,本教程将通过清晰的示例和实用技巧,帮助你快速掌握飞算Java AI的核心功能! 目录 【一】飞算Java AI介绍 (1)智能代码生成 (2)代码补全与优化 (3)缺陷检测与修复 (4)性能调优辅助 【二】飞算Java AI安装:IntelliJ IDEA安装与配置 【三】工程项目生成 (1)数字顺序调整 (2)简单的数字计算 【四】特点优越体现 (1)接口展示

By Ne0inhk
JAVA 泛型与通配符:从原理到实战应用

JAVA 泛型与通配符:从原理到实战应用

JAVA 泛型与通配符:从原理到实战应用 1.1 本章学习目标与重点 💡 掌握泛型的核心概念与设计初衷,理解泛型的编译期检查机制。 💡 熟练使用泛型类、泛型接口和泛型方法,解决数据类型安全问题。 💡 理解通配符(?)、上界通配符(? extends T)和下界通配符(? super T)的使用场景。 ⚠️ 本章重点是 泛型的擦除机制 和 通配符的灵活运用,这是提升代码通用性和安全性的关键。 1.2 泛型的核心概念与设计初衷 1.2.1 为什么需要泛型 在没有泛型的 JDK 5 之前,集合类只能存储 Object 类型的对象。获取元素时需要强制类型转换,这会带来两个严重问题: 1. 类型不安全:可以向集合中添加任意类型的对象,运行时可能抛出 ClassCastException。 2. 代码臃肿:频繁的强制类型转换会让代码可读性和维护性变差。 💡 泛型的出现就是为了解决这些问题,它的核心思想是

By Ne0inhk
JavaScript 性能优化实战技术:从代码到运行时的全维度优化

JavaScript 性能优化实战技术:从代码到运行时的全维度优化

在 JavaScript 开发中,性能优化并非“锦上添花”,而是决定应用体验上限的核心环节。无论是前端页面的加载速度、交互流畅度,还是 Node.js 服务的并发能力,都离不开针对性的性能调优。很多开发者容易陷入“重功能、轻性能”的误区,直到出现页面卡顿、接口响应缓慢、内存溢出等问题才着手优化。本文将从代码编写、运行时调度、资源加载、工具辅助四个核心维度,拆解可落地的性能优化实战技巧,帮你实现从“能用”到“好用”的跨越。 一、代码层优化:从源头减少性能损耗 代码是性能的基石,不良的编码习惯会直接导致运行时的低效消耗。这一维度的优化核心的是“减少不必要的计算、降低资源占用”,覆盖变量声明、循环逻辑、函数调用等高频场景。 1. 变量与数据结构优化 合理选择变量类型和数据结构,能大幅减少内存占用和查找耗时,尤其在高频操作场景中效果显著。 * 优先使用原始值而非包装对象:String、Number 等包装对象会占用更多内存,

By Ne0inhk