我正在尝试使用“Pdf 创建库”在 flutter 应用程序中生成 pdf。当用其他语言生成 pdf 时,它会出现异常

Bli*_*Man 4 pdf android dart flutter

这是用于生成其他语言字体的 pdf 的代码:

\n\n
final Uint8List fontData = File('fonts/shivaji05.ttf').readAsBytesSync();\nfinal ttf = Font.ttf(fontData.buffer.asByteData());\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我在文本中使用定义字体的方式:

\n\n
Text('\xe0\xa4\xb8\xe0\xa4\xbe\xe0\xa4\x88 \xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa4\xbe', textScaleFactor: 2, style: new TextStyle(font: ttf)),\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误日志

\n\n
E/flutter (26251): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: 'package:pdf/src/font.dart': Failed assertion: line 145 pos 14: 'false': \nE/flutter (26251): ---------------------------------------------\nE/flutter (26251): Can not decode the string to Latin1.\nE/flutter (26251): This font does not support Unicode characters.\nE/flutter (26251): If you want to use strings other than Latin strings, use a TrueType (TTF) font instead.</i>\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

当我尝试使用 \xe2\x80\x9c Pdf 创建库\xe2\x80\x9d 在 flutter 应用程序中生成 pdf 时,我遇到了类似的错误。生成 pdf 时,在我的源文本中具有正确的单引号“ \xe2\x80\x99 ”“’”。

\n\n

有错误的代码

\n\n
final String soutceString = \'My source text with " \xe2\x80\x99 "\';\n\nfinal Document pdf = Document(deflate: zlib.encode);\n\npdf.addPage(\n    MultiPage(\n       build: (Context context) => <Widget>[\n            Paragraph(text: soutceString),\n       ]\n    )\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误日志

\n\n
flutter: \'package:pdf/src/font.dart\': Failed assertion: line 145 pos 14: \'false\':\n---------------------------------------------\nCan not decode the string to Latin1.\nThis font does not support Unicode characters.\nIf you want to use strings other than Latin strings, use a TrueType (TTF) font instead. \n
Run Code Online (Sandbox Code Playgroud)\n\n

当我发现错误的符号时,我只是替换它。

\n\n

具有快速修复功能的代码

\n\n
\nfinal String sourceString = \'My source text with " \xe2\x80\x99 "\';\n\nfinal Document pdf = Document(deflate: zlib.encode);\n\nsourceString.replaceAll(\'\xe2\x80\x99\', \'`\'),\n\npdf.addPage(MultiPage(\n   build: (Context context) => <Widget>[\n            Paragraph(text: sourceString)\n        ]\n    )\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我担心将来会出现新的错误符号。我将 arial.ttf 字体添加到资产中(arial.ttf 包含我的符号)并使用它。添加资产

\n\n

最适合我的情况

\n\n
import \'package:flutter/services.dart\' show rootBundle;\n\n\n\nfinal String sourceString = \'My source text with " \xe2\x80\x99 "\';\n\nfinal Document pdf = Document(deflate: zlib.encode);\n\npdf.addPage(MultiPage(\n     theme: Theme.withFont(\n        base: Font.ttf(await rootBundle.load("assets/arial.ttf")),\n        bold: Font.ttf(await rootBundle.load("assets/arial.ttf")),\n        italic: Font.ttf(await rootBundle.load("assets/arial.ttf")),\n        boldItalic: Font.ttf(await rootBundle.load("assets/arial.ttf")),\n      ),\n   build: (Context context) => <Widget>[\n            Paragraph(text: sourceString)\n          ]\n    )\n);\n\n
Run Code Online (Sandbox Code Playgroud)\n

  • API 更改为 Theme.withFont 重命名为 ThemeData.with... (4认同)
  • 这个解决方案确实有效。您可以阅读[flutter中的自定义字体教程](https://flutter.dev/docs/cookbook/design/fonts)在您的项目中插入arial字体 (2认同)