Android遇见PDF(初识iText)

最近项目中需要将生成的棋盘打印成PDF格式(一个crossword数独游戏),于是研究了一下Android中pdf的创建

原生PDF库

首先说这个原生自带的pdf库,Android6.0之后就支持创建pdf,但是经过对比,原生的这个在打印的灵活性远远不能满足项目需求,首先他有很多优点,比如可以将页面上面现有的view打印出来,还可以将canvas中自己绘画的一些内容打印出来,最重要的就是本身轻量级的优点。并且最低支持api为19。由于项目需要做到以字符串形式输入,并且灵活打印等,所以就放弃了原生sdk不得不找开源的库。

iText开源库

itext是java的一个库,经过对比发现这个使用的最多,而且功能相当丰富。可以做到对Android的支持。他有两个版本,iText5和iText7。

  • 首先说iText5,是一个开源的,并且功能相当丰富,支持多种纸张大小,可以自由定位内容位置,支持多种交互、注释、超链接、多种图片格式,甚至可以读取pdf内容,解析等。缺点是:没有提供中文字库字库太少(亚洲的字都不支持),中文无法显示到pdf。这个需要自己适配,可以添加ttf字库比如windows自带字体库或者下载其他,但由于字体库很多具有版权,Android项目中最好使用开源的一些字库(这个适配方法还在搞,以后更新)
  • iText7则是iText5的商业版本,对一些高级功能进行限制,它的最低 api版本居然是Android 8.0 有点搞不懂,而且貌似收费,于是放弃。

    使用iText5打印基本使用

    获取:gradle中添加如下字段
    1
    2
    //pdf
    implementation 'com.itextpdf:itextg:5.5.10'

适配中文支持

官方也是给了接口,比如说在Android项目中是可以手动适配字体库的,可以使用微软的字体,windows上面的ttf字体库。在做产品的同时需要考虑到很多因素比如版权的问题,所以尽量做到适配还需要使用Android的字体库。
在官网上面扒拉了很多,发现iText5提供了亚洲字体包,所以就采用官方的字体包来适配。

集成iTExt 5字体包

1
2
//iText亚洲字体兼容包
implementation group: 'com.itextpdf', name: 'itext-asian', version: '5.2.0'