You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中使用iTextG 5.5.9生成PDF如何正确显示中文?

解决iTextG 5.5.9生成PDF时中文字符不显示的问题

嘿,这个问题我熟!iTextG默认用的Times-Roman字体根本不包含中文字形,所以中文会直接“消失”,得手动引入支持中文的字体文件才行,具体操作步骤给你列出来:

  • 第一步:准备中文字体文件
    找一个支持中文的字体文件,比如Windows系统里的simhei.ttf(黑体)、simsun.ttc(宋体),或者开源的Noto Sans SC字体。把这个字体文件放到Android项目的assets目录下——如果你的项目里没有assets文件夹,直接在main目录下新建一个就行。

  • 第二步:修改代码加载中文字体
    替换你原来用FontFactory.getFont加载Times-Roman的代码,改成从assets目录加载中文字体:

    // 加载assets里的黑体字体,参数分别是字体文件名、编码方式、嵌入字体、字号、样式
    Font fontbold = FontFactory.getFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 11, Font.BOLD);
    Font fontTimes = FontFactory.getFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 11);
    

    这里重点说下参数:

    • BaseFont.IDENTITY_H:指定使用Unicode编码,确保能正确识别中文字符
    • BaseFont.EMBEDDED:把字体嵌入PDF文件里,这样不管打开PDF的设备有没有这个字体,中文都能正常显示
  • 如果用的是字体集合文件(比如.ttc格式)
    simsun.ttc这种包含多个字体的文件,需要额外指定字体索引,比如宋体在simsun.ttc里的索引是0:

    Font fontChinese = FontFactory.getFont("simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 11);
    
  • 几个避坑提示

    1. 别用系统路径加载字体,Android里优先用assets目录,避免权限问题
    2. 尽量选体积小的字体文件,不然生成的PDF会变大很多
    3. 要是还是有问题,加个try-catch看看是不是字体加载失败了:
      try {
          Font fontbold = FontFactory.getFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 11, Font.BOLD);
      } catch (Exception e) {
          e.printStackTrace();
      }
      

内容的提问来源于stack exchange,提问作者Vaibhav More

火山引擎 最新活动