如何使用Dinktopdf在.net core项目里将Html转成PDF
Dinktopdf : .Net Core对 wkhtmltopdf 库的封装, 使用Webkit引擎将html转换成pdf.
源码地址: https://github.com/rdvojmoc/DinkToPdf
使用比较简单,直接把github里的示例代码放到你的.net core项目里。
注意:要记得把libwkhtmltox库放到项目的根目录里,并在visual studio里设置“如果较新则复制“
dll是window, so是linux, dylib应该是mac os
如果从github下载慢,你也可以从码云网站下载
https://gitee.com/ofri/DinkToPdf
注: linux或docker容器需要安装 libgdiplus 否则会提示找不到libwkhtmltox
apt-get update
apt-get install libgdiplus
问题1: 生成的PDF里中文都显示成方框了
解决办法:
(1) 网页里要加上
<meta charset="UTF-8" />
(2) 在DockerFile里加上字体安装脚本,如下
apt-get install fonts-wqy-microhei ttf-wqy-microhei fonts-wqy-zenhei ttf-wqy-zenhei
参考 https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2886
问题2: 生成的PDF里某些中文显示成方框
解决办法
笔者碰到过一个奇怪的问题,所有的中文都可以,但有几个字就是显示成方框,在网页上浏览也有点奇怪,那几个字看上去小一点。
后来查了下,判断可能是输入法问题,输入的中文实际编码不是UTF-8, 可以把显示成方框的文字删掉,重新编辑输入,确保在浏览器上看上去和其他字体一样。
问题3: 如果是用javascript生成的页面,打印出来看不到
解决办法
有两种可能得原因:
第一种: 因为wkhtmltopdf用的是QT webkit, 所以可能在你的浏览器上显示正常,但用QT webkit显示有错误,有个简单的判断方法,下载一个QT web browser http://www.qtweb.net/
用这个浏览器去显示你的网页,然后启动网页检查器看看有没有javascript的脚本错误,找到了,则修复javascript代码,使得兼容QT webkit
第二种 : 你的javascript脚本执行时间较慢,在wkhtmltopdf打印前还没有渲染完毕, 这里可以通过设置wkhtmltopdf的一个参数
--javascript-delay <msec> Wait some milliseconds for javascript
finish (default 200)
参见 https://wkhtmltopdf.org/usage/wkhtmltopdf.txt
这个参数的意思就是等浏览器内核加载页面完后一秒才触发打印
那在DinkToPdf的C#代码里可以通过如下代码传入该参数
代码示例(延迟1秒后打印)
var objectSettings = new ObjectSettings()
{
Page = url
};
objectSettings.LoadSettings = new LoadSettings
{
JSDelay = 1000
}
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
ImageDPI = imgDPI
},
Objects = {
objectSettings
}
};
var pdf = _converter.Convert(doc);