lipg
背景
红字信息表需要导出pdf,另外税务组很多应用都会存在pdf的导出场景,但是目前没有一个比较完美的解决方案。
要求
导出的pdf不能是图片,pdf中的文字可以进行复制。
方案调研
经过在网上找寻以及公司内部其他部门的使用方式,主流方案总结如下:
  1. 基于模板引擎
    1. 前端实现,html转canvas再转pdf(缺点:pdf中的文字不能复制,而且文字失真)。
    2. 后端实现,freemarker模板引擎+itextpdf(缺点:很多html中的css不兼容,导致样式严重错乱,如果想要更正样式需要更改itexpdf源码)。
    1. 手工绘制

          这种前后端也都可以实现,但是缺点很明显:1.实现起来比较复杂,很容易出现意想不到的bug;2.扩展比较困难,如果这个绘制方法不足够通用,一旦更改pdf展示模板,可能需要更改大量代码。

    1. wkhtmptopdf

          wkhtmltopdf基于WebKit渲染引擎将HTML内容转换为HTML页面,之后再转换成PDF,所以其转换后的PDF文件的显示效果可以和HTML页面基本保持一致,

          是一个相当完美的解决方案,美中不足的是他需要你安装插件,并不能像前两种解决方案那样以jar包的形式嵌入到项目中。
     
    结论
      采用3,一次性安装插件到服务器,后期维护讫来非常方便,html模板随意变更,效率也不错。
    插件安装方式
    下载
      官网https://wkhtmltopdf.org/downloads.html,根据不同的系统下载不同的版本如下图:
      

     

     

    安装
    windows
      windows安装非常简单,直接双击wkhtmltopdf.exe安装到指定目录即可。
    linux
      linux安装比较麻烦,以我们的服务器centos7为例,(预发布和生产机器中的插件安装需要运维操作,可以参考此步骤)具体如下:
    1. 下载wkhtmltopdf文件wkhtmltox-0.12.6-1.centos7.x86_64.rpm。
    2. 将文件导入到需要安装的服务器。
    3. 使用命令安装:rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm。
    4. 安装过程会遇到安装依赖不存在的错误。
      1. yum search XXX(XXX为缺少的依赖)
      2. 安装搜索到的依赖,命令:yum install XXX (安装选择x86_64的)
      1. 由于此时导出的pdf存在很多方块,继续执行:yum install urw-fonts libXext openssl-devel
      2. 此时测试发现还存在很多空白展示不正确,需要将windows中的msyh.ttc、msyhbd.ttc、msyhl.ttc复制到linux服务器/usr/share/fonts/msyh,如果没有则mkdir创建目录
      yum install -y fontconfig mkfontscale
      cd /usr/share/fonts/msyh
      mkfontscale
      mkfontdir
      fc-cache -fv
      source /etc/profile
      执行:
      fc-list :lang=zh
      可以看到已经安装的中文字体。
      压测
      由于目前只在186.3开发环境上安装了插件,并且写了个测试方法,压测在186.3环境进行。
      压测参数:200线程并发,0等待,单次循环

       

       

       

       

      压测结果比较理想:

       

       

       

       

       
      总结
      通过使用wkhtmltopdf完美解决了导出pdf。
       
      相关文件见百度云:https://pan.baidu.com/s/17lbXpXf_-rY_IlIK3DtmxQ  提取码:hwfg
       
      参考文献:https://www.cnblogs.com/xionggeclub/p/6144241.html
                        https://blog.csdn.net/weixin_33964094/article/details/92186359

      分类:

      技术点:

      相关文章:

      • 2021-11-13
      • 2021-05-17
      • 2021-09-20
      • 2021-08-06
      • 2022-12-23
      • 2021-10-11
      • 2022-02-10
      • 2022-02-09
      猜你喜欢
      • 2021-11-08
      • 2021-09-11
      • 2021-12-04
      • 2021-12-05
      • 2022-12-23
      相关资源
      相似解决方案