Flutter中使用PdfGoogleFonts显示中文字符的问题
在Flutter PDF中显示中文字体的解决方案
关于PdfGoogleFonts的中文字体支持
目前PdfGoogleFonts类默认只打包了体积较小的字体子集,官方文档提到的NotoSansTC等中文字体并未包含在内——主要原因是中文字体文件体积过大,无法默认集成到pub包中。
解决办法
方法一:手动引入本地中文字体文件(推荐)
这是最稳定可靠的方案,步骤如下:
- 下载所需的中文字体文件(比如Noto Sans SC、思源黑体等),将其放在项目的
assets/fonts目录下(若目录不存在则新建)。 - 在
pubspec.yaml中配置字体资源:
flutter: assets: - assets/fonts/NotoSansSC-Regular.ttf
- 在生成PDF时,通过
Font.ttf()加载本地字体并使用:
import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; import 'package:flutter/services.dart' show rootBundle; final pdf = pw.Document(); final font = await pw.Font.ttf( rootBundle.load('assets/fonts/NotoSansSC-Regular.ttf'), ); pdf.addPage( pw.Page( build: (context) => pw.Center( child: pw.Text( '这是测试的中文字符', style: pw.TextStyle(font: font, fontSize: 20), ), ), ), );
方法二:通过Google Fonts网络加载中文字体
如果不想引入本地文件,可以尝试使用Font.fromGoogleFonts()方法直接从网络拉取字体,但注意这会依赖网络环境,且首次加载速度较慢:
final font = await pw.Font.fromGoogleFonts( 'Noto Sans SC', fontWeight: pw.FontWeight.normal, );
需注意,部分中文字体在Google Fonts中的名称需准确匹配:简体中文用Noto Sans SC,繁体中文用Noto Sans TC。
注意事项
- 确保字体文件路径和
pubspec.yaml中的配置一致,避免加载失败。 - 若使用网络加载,需处理网络异常,防止PDF生成失败。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

