跨平台导PDF,结合wkhtmltopdf很顺手

前言

好东西要分享,以前一直在使用wkhtmltopdf进行pdf文件的生成,经常使用的方式就是先安装wkhtmltopdf,而后在程序中用命令的方式将对应的html生成pdf文件,简单并且方便;但重复的编码使得想在wkhtmltopdf基础上进行封装,偶然间发现有小伙伴已经封装的还不错啦,经常使用的功能都已经实现,源码地址:https://github.com/fpanaccia/Wkhtmltopdf.NetCore。html

做者将其打包成Nuget包(Wkhtmltopdf.NetCore),直接引入使用便可;git

正文

既然用到了.NetCore,确定就要考虑到跨平台兼容性,对于wkhtmltopdf以前一直是在Windows上使用,尚未在其余平台尝试;这个包封装的行不行,拉出来遛遛就知道啦,接下来就试试:github

1. 建个API项目,引入包和兼容对应平台的wkhtmltopdf执行文件centos

image-20210120162314648

注: 默认依赖的wkhtmltopdf执行文件须要存放在Rotativa目录下,能够自定义名称,若是自定义,须要再注册服务时指定对应的文件名;这里的wkhtmltopdf已经根据不一样平台进行编译打包了,无需安装,这些文件在源码那就有;浏览器

2.建立PDFTestController控制器,添加以下接口进行测试测试

首先把生成pdf的服务注入进来,后续直接使用就能够啦:字体

image-20210120162846169

接下来就开始写接口啦,这里只是测试,代码冗余没有考虑,在实际项目中小伙伴能够根据本身需求进行封装;编码

  • ExportPDFByHtml 接口,用html直接生成pdf文件,但这里没有保存,以文件流的形式访问,经过浏览器查看文件,能够自行下载;html模板在实际开发过程当中能够单独用文件存储;调试

    image-20210120163444523

  • SavePDFByHtml接口,直接保存文件,文件名能够根据须要进行自定义;code

    image-20210120163838699

  • TestMarginAndPageSize接口,设置Margin和PageSize参数,其余参数也能够设置;

    image-20210120164237413

    ConvertOptions默认封装了如下属性,小伙伴也能够自定义扩展,只要继承IConvertOptions便可,这里就不演示的,由于官方有对应的案例,下伙伴下去搞搞,wkhtmltopdf的参数挺多的,均可以进行封装使用。

    image-20210120170024098

  • ExportByRazorView使用Razor视图的方式进行pdf文件生成,此库已经支持cshtml文件的读取

    image-20210120164613249

    根据指定视图生成对应的pdf效果,以下:

    image-20210120164735123

  • ExportByRazorViewData数据动态绑定,既然支持视图,那就应该支持Razor语法,通常经常使用的就是数据绑定了,上面是静态的,接下来来个动态绑定的。

    image-20210120165238787

    根据指定视图生成对应的pdf效果,以下:

    image-20210120165449173

    如上基本的使用演示就说那么多,使用仍是很简单,小伙伴后续能够根据本身的须要进行相关扩展;固然还有其余功能,好比设置页眉/页脚等,做者提供有对应的案例;这里不说那么多,否则又是长文。

3. 小伙伴用的时候可能会遇到的问题

  • 在开发调试运行项目时,会报找不到wkhtmltopdf文件,那是由于运行时的确找不到对应的文件,将对应Rotativa下的文件设置为始终复制便可:

    image-20210120170946016

  • 在Windows下怎么玩都没问题啦,开始发布到Linux(我用的centos 7),我擦,莫名其妙的错。

    image-20210120171410682

    看见这个错我懵的,一顿搜索猛如虎,仍是没找到答案;冷静下来,从新捋捋,原来是本身在犯傻;

    两个问题须要解决,1.上传到Linux下的wkhtmltopdf没有给执行权限;2.可能环境缺乏对应的依赖库;

    设置可执行权限

    在Linux环境下,能够经过ll命令查看权限,刚开始是没有权限的,只须要执行chmod 777 wkhtmltopdf 命令,执行权限就有了,以下图中红框中的x就是可执行权限;

    image-20210120171951473

    安装缺乏的依赖库

    可执行权限开启以后,别急着去访问页面,这样可能仍是错误。由于可能缺乏依赖库,那咋知道缺乏呢,我是直接执行wkhtmltopdf,执行成功就没啥,不成功就会报缺乏相关依赖,而后直接安装就行啦;执行./wkhtmltopdf https://www.baidu.com ./test.pdf试试就知道啦,由于wkhtmltopdf自己是能够单独运行的,并不依赖咱们写的程序。

  • 当执行成功以后,而后开始访问接口导出功能,若是不出意外,遇到中文就产生乱码啦,那是由于Linux环境下缺乏相关的字体文件,将对应的字体文件拷贝到Linux上便可,字体我找好了,下载地址以下:

    连接: https://pan.baidu.com/s/1jikC0DUkpEzpXL5ysjEQPA 提取码: tn4j

    将下载下来的字体解压,而后拷贝到Linux下的 /usr/share/fonts目录下便可

image-20210120173348468

最后这样应该就没啥问题啦,剩下的就交给小伙伴本身摸索搞实践吧;

​此文源码地址:https://github.com/zyq025/DotNetCoreStudyDemo

​wkhtmltopdf官网地址​:https://wkhtmltopdf.org/

总结

使用仍是很简单的,常规的需求没啥问题,若是须要功能定制化,小伙伴能够参考源码,本身封装一个(封装思路不难的); 若是小伙伴有比较好的导出库,免费开源的那种,一块儿分享出来玩玩。

一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一块儿学~~~

相关文章
相关标签/搜索