Flutter Web中PDF包无法正常渲染泰米尔语等非英文字符求助
解决Flutter Web中PDF包渲染泰米尔语等非英文字符异常的问题
针对你使用pdf: ^3.8.1和printing: ^5.9.1时泰米尔语无法正常渲染的问题,可通过以下步骤修复:
关键问题分析
- 你已加载支持泰米尔语的字体,但未将主题配置正确应用到
Document实例 - 泰米尔语属于复杂文字脚本,需要启用字形整形(shaping)才能正确渲染连写字符
修复步骤及代码示例
1. 确保字体文件有效
确认HindMadurai-Regular.ttf文件完整且确实支持泰米尔语,可通过系统字体预览工具验证字符显示。
2. 正确配置PDF主题并启用字形整形
修改代码,将自定义字体主题应用到Document,并在文本样式中开启useShaping:
Future<Uint8List> createSecondPdf( List<AttendeeListViewModel> attendeeListViewModelList) async { // 预加载字体,避免重复加载 final fontData = await rootBundle.load("assets/HindMadurai-Regular.ttf"); final tamilFont = Font.ttf(fontData); // 创建包含泰米尔语字体的主题 final pdfTheme = ThemeData.withFont( base: tamilFont, bold: tamilFont, italic: tamilFont, boldItalic: tamilFont, ); // 将主题应用到Document final pdf = Document(theme: pdfTheme); pdf.addPage( MultiPage( build: ((context) { return [ Table.fromTextArray( headers: ['Sl.No', 'Name', 'Data'], cellAlignments: {0: Alignment.center}, // 明确设置字体并启用字形整形 cellStyle: TextStyle( font: tamilFont, useShaping: true, // 关键:启用复杂脚本字形整形 ), columnWidths: { 0: const FlexColumnWidth(0.6), 1: const FlexColumnWidth(4.0), 2: const FlexColumnWidth(2.0), }, data: <List<String>>[ <String>[ 'Hello', attendeeListViewModelList[2] .attendeeDataModel ?.pNameAndProfession ?? '', 'ஜெயப்பாண்டி' ] ], ), ]; }), ), ); return pdf.save(); }
3. 额外检查项
- 确认
pubspec.yaml中已正确声明字体资源:flutter: assets: - assets/HindMadurai-Regular.ttf - 若仍有问题,尝试更换其他泰米尔语字体(如
Noto Sans Tamil)测试,排除字体本身的兼容性问题 - 确保Flutter Web的资源加载路径正确,可通过
rootBundle.load的返回值验证字体是否成功加载
内容的提问来源于stack exchange,提问作者James Mark
相关产品推荐
相关产品推荐

