跨平台导PDF,结合wkhtmltopdf很顺手
前言
好东西要分享,之前一直在使用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.可能环境缺少对应的依赖库;
设置可执行权限
在Linux环境下,可以通过
ll
命令查看权限,刚开始是没有权限的,只需要执行chmod 777 wkhtmltopdf
命令,执行权限就有了,如下图中红框中的x就是可执行权限;安装缺少的依赖库
可执行权限开启之后,别急着去访问页面,这样可能还是错误。因为可能缺少依赖库,那咋知道缺少呢,我是直接执行wkhtmltopdf,执行成功就没啥,不成功就会报缺少相关依赖,然后直接安装就行啦;执行
./wkhtmltopdf https://www.baidu.com ./test.pdf
试试就知道啦,因为wkhtmltopdf本身是可以单独运行的,并不依赖我们写的程序。当执行成功之后,然后开始访问接口导出功能,如果不出意外,遇到中文就产生乱码啦,那是因为Linux环境下缺少相关的字体文件,将对应的字体文件拷贝到Linux上即可,字体我找好了,下载地址如下:
链接: https://pan.baidu.com/s/1jikC0DUkpEzpXL5ysjEQPA 提取码: tn4j ;
将下载下来的字体解压,然后拷贝到Linux下的 /usr/share/fonts目录下即可
最后这样应该就没啥问题啦,剩下的就交给小伙伴自己摸索搞实践吧;
此文源码地址:https://github.com/zyq025/DotNetCoreStudyDemo
wkhtmltopdf官网地址:https://wkhtmltopdf.org/
总结
使用还是很简单的,常规的需求没啥问题,如果需要功能定制化,小伙伴可以参考源码,自己封装一个(封装思路不难的); 如果小伙伴有比较好的导出库,免费开源的那种,一起分享出来玩玩。
一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~
跨平台导PDF,结合wkhtmltopdf很顺手的更多相关文章
- HTML 转 PDF 之 wkhtmltopdf 工具精讲
术语定义 文档对象 “文档对象”是指PDF文档中的文档对象,共有三种类型的“文档对象”,他们分别是“页面对象”,“封面对象”和“目录对象”. 页面对象 “页面对象”是指以页面的形式在PDF文档中呈现的 ...
- HTML 转 PDF 之 wkhtmltopdf
wkhtmltopdf是一个可以把html转为pdf的插件,有windows.linux等平台的版本,比较简单 官网下载 https://wkhtmltopdf.org/downloads.html ...
- 命令行下的html转pdf工具wkhtmltopdf
基于webkit和qt的html转pdf的命令行工具,非常好使 http://code.google.com/p/wkhtmltopdf/ http://www.cnblogs.com/shanyou ...
- IdentityServer4之持久化很顺手的事
前言 原计划打算在春节期间多分享几篇技术文章的,但到最后一篇也没出,偷懒了吗?算是吧,过程是这样的:每次拿出电脑,在孩姥姥家的院子总有阳光沐浴,看不清屏幕,回屋又有点冷(在强行找理由),于是又带着娃遛 ...
- Java操作wkhtmltopdf实现Html转PDF
做java开发的都知道,java生成pdf大部分都是用itext,itext的确是java开源组件的第一选择.不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出 ...
- php使用wkhtmltopdf导出pdf
参考:史上最强php生成pdf文件,html转pdf文件方法 http://biostall.com/wkhtmltopdf-add-header-footer-to-only-first-last- ...
- 转 Html转pdf的工具——wkhtmltopdf
下载地址:http://wkhtmltopdf.org/downloads.html 安装好以后需要在系统环境变量变量名为”Path”的后添加:;D:\wkhtmltopdf\bin 也就是你安装的目 ...
- php 查询mysql数据批量转为PDF文件二(批量使用wkhtmltopdf html导出PDF)
上节讲到配置wkhtmltopdf,这节讲下如何批量操作 首先讲下wkhtmltopdf如何使用 直接命令行输入: wkhtmltopdf http://www.baidu.com/ baidu.p ...
- wkhtmltopdf cpdf HTML转pdf 及pdf合并
将 html 转为 pdf :wkhtmltopdf wkhtmltopdf 是一个使用 webkit 网页渲染引擎开发的用来将 html 转成 pdf 的工具,可以跟多种脚本语言进行集成来转换文档. ...
随机推荐
- vue 按键修饰符 keyup
按键修饰符 keyup 通过官方文档可查询到特殊的按键修饰符 .enter .tab .delete (捕获"删除"和"退格"键) .esc .space .u ...
- Django使用channels实现Websocket连接
简述: 需求:消息实时推送消息以及通知功能,采用django-channels来实现websocket进行实时通讯.并使用docker.daphne启动通道,保持websocket后台运行 介绍Dja ...
- [OI笔记]每周刷题记录
一些题库: bzoj.uoj.luogu(洛谷).CF.loj.hdu.poj.51nod 下面是一些近期的做题记录 省选爆炸-然后大概就先这样了,要回去读一段时间文化课,如果文化课还不错的话也许还会 ...
- [日常摸鱼]POJ2187 BeautyContest-旋转卡壳
原来这个念 旋转卡qia壳ke- 题意:求平面内给定点集里的最远点对,$n \leq 5e4$ 做法就是旋转卡壳啦,话说这题数据范围应该可以再大挺多的. #include<cstdio> ...
- [UWP] - 用Json格式来发送一个Post请求到WCF服务
测试实体类:(需要在客户端和服务端建了有相同字段名称的实体) public class CompositeType { public CompositeType() { SubCompositeTyp ...
- python初学者-鸡兔同笼简单算法
鸡兔同笼问题.假设共有鸡.兔30只,脚90只.求鸡.兔各有多少只 使用for循环快速解决鸡兔同笼问题 for ji in range(0,31): if 2*ji+(30-ji)*4==90: pri ...
- Spring0-前言序
Spring的简介 一般情况下我们说的Spring是指SpringFramework,而SpringFramework实际上只是Spring家族中的一个分支而已,这在下一章会介绍 Spring实际上也 ...
- Linux嵌入式学习-交叉编译openssl
利用arm-none-linux-gnueabi-gcc交叉编译openssl,生成静态库文件libcrypto.a ,libssl.a 1.从openssl官网下载openssl最新版本,我下载的是 ...
- [leetcode] Add to List 74. Search a 2D Matrix
/** * Created by lvhao on 2017/8/1. * Write an efficient algorithm that searches for a value in an m ...
- JDBC(五)—— 批量插入数据
批量插入数据 @Test public void testInsert() throws Exception { Connection conn = null; PreparedStatement p ...