好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便;但重复的编码使得想在wkhtmltopdf基础上进行封装,偶然间发现有小伙伴已经封装的还不错啦,常用的功能都已经实现,源码地址:https://github.com/fpanaccia/Wkhtmltopdf.NetCore。
作者将其打包成Nuget包(Wkhtmltopdf.NetCore),直接引入使用即可;
正文既然用到了.NetCore,肯定就要考虑到跨平台兼容性,对于wkhtmltopdf之前一直是在Windows上使用,还没有在其他平台尝试;这个包封装的行不行,拉出来遛遛就知道啦,接下来就试试:
1. 建个API项目,引入包和兼容对应平台的wkhtmltopdf执行文件;
注: 默认依赖的wkhtmltopdf执行文件需要存放在Rotativa目录下,可以自定义名称,如果自定义,需要再注册服务时指定对应的文件名;这里的wkhtmltopdf已经根据不同平台进行编译打包了,无需安装,这些文件在源码那就有;
2.创建PDFTestController控制器,添加如下接口进行测试;
首先把生成pdf的服务注入进来,后续直接使用就可以啦:
接下来就开始写接口啦,这里只是测试,代码冗余没有考虑,在实际项目中小伙伴可以根据自己需求进行封装;
ExportPDFByHtml 接口,用html直接生成pdf文件,但这里没有保存,以文件流的形式访问,通过浏览器查看文件,可以自行下载;html模板在实际开发过程中可以单独用文件存储;
SavePDFByHtml接口,直接保存文件,文件名可以根据需要进行自定义;
TestMarginAndPageSize接口,设置Margin和PageSize参数,其他参数也可以设置;
ConvertOptions默认封装了以下属性,小伙伴也可以自定义扩展,只要继承IConvertOptions即可,这里就不演示的,因为官方有对应的案例,下伙伴下去搞搞,wkhtmltopdf的参数挺多的,都可以进行封装使用。
ExportByRazorView使用Razor视图的方式进行pdf文件生成,此库已经支持cshtml文件的读取
根据指定视图生成对应的pdf效果,如下:
ExportByRazorViewData数据动态绑定,既然支持视图,那就应该支持Razor语法,一般常用的就是数据绑定了,上面是静态的,接下来来个动态绑定的。
根据指定视图生成对应的pdf效果,如下:
如上基本的使用演示就说那么多,使用还是很简单,小伙伴后续可以根据自己的需要进行相关扩展;当然还有其他功能,比如设置页眉/页脚等,作者提供有对应的案例;这里不说那么多,不然又是长文。
3. 小伙伴用的时候可能会遇到的问题
在开发调试运行项目时,会报找不到wkhtmltopdf文件,那是因为运行时的确找不到对应的文件,将对应Rotativa下的文件设置为始终复制即可:
在Windows下怎么玩都没问题啦,开始发布到Linux(我用的centos 7),我擦,莫名其妙的错。
看见这个错我懵的,一顿搜索猛如虎,还是没找到答案;冷静下来,重新捋捋,原来是自己在犯傻;
两个问题需要解决,1.上传到Linux下的wkhtmltopdf没有给执行权限;2.可能环境缺少对应的依赖库;
设置可执行权限