一、Wkhtmltopdf官网
下面介绍的组件都是基于wkhtmltopdf工具的,可以直接看官网了解下wkhtmltopdf。这里强调下,要下载和操作系统适配的wkhtmltopdf版本,不然会报错的,具体下面说。
二、Windows环境
在Windows环境下,将html转为pdf的组件是比较多的,有收费的,也有免费的。这里推荐两款到现在还免费的:
- Wkhtmltopdf.NetCore
- OpenHtmlToPdf
1、Wkhtmltopdf.NetCore
(1)开源否
没有开源代码
(2)原理
Wkhtmltopdf.NetCore是基于wkhtmltopdf工具实现的
(3)示例
- 构建Aspnet5.0环境的API项目
- nuget引入包:Wkhtmltopdf.NetCore
- startup.cs的ConfigureServices方法中添加:
services.AddWkhtmltopdf();
- 接口Controller中注入服务:
- html to pdf 接口逻辑如下:
[AllowAnonymous] [HttpGet] public async Task<ContentResult> CreatePdf() { StringBuilder sb = new StringBuilder(); sb.Append($"<!DOCTYPE html>"); sb.Append($"<html>"); sb.Append($"<head>"); sb.Append($"<meta charset='UTF-8'>"); sb.Append($"<title>侵权文档</title>"); sb.Append($"<link href='https://hellowebfonts.oss-cn-beijing.aliyuncs.com/698F3099-E62F-4C3B-B30A-04FB735069FE/202202/css/E58B07BD9289F4C7.css' rel='stylesheet' type='text/css'>"); sb.Append($"</head>"); sb.Append($"<body>"); sb.Append($"<div class='cssE58B07BD9289F4C7' style='font-size:20px; '>中华人民共和国 </div>"); sb.Append($"</body>"); sb.Append($"<html>"); byte[] pdfBytes = _generatePdf.GetPDF(sb.ToString()); string url = await _ossCrmBusiness.PutObjectFromBufferAsync(pdfBytes, "webfont.pdf", out string errorMessage); return ApiResponseHelper.GetSuccess(url); }
- 最后这是比较重要也是容易出现各种错误的步骤:项目中添加适应各平台的wkhtmltopdf工具
右键wkhtmltopdf,属性改为较新则复制。
到此结束。中间遇到的错误,下面总结。
2、OpenHtmlToPdf
(1)开源否
(2)原理
OpenHtmlToPdf是基于wkhtmltopdf工具实现的,但只支持wkhtmltopdf.exe,即只能在Windows服务器中使用。但是毕竟是开源代码,改造下也能适用于Linux平台下,简单的改造是非常简单的,就是将wkhtmltopdf.exe替换成不同平台环境下的wkhtmltopdf。其实上边的Wkhtmltopdf.NetCore就是基于OpenHtmlToPdf改造的。OpenHtmlToPdf非常简单方便,如果是Windows服务器,推荐使用这个。
(3)示例
请参考之前的博文
三、Linux环境
免费的这里只推荐Wkhtmltopdf.NetCore
原理和示例,上边都讲了,这里强调的是注意使用适配操作系统的wkhtmltopdf版本
四、错误总结
因为我是部署到Linux系统上,所以采用的是Wkhtmltopdf.NetCore,这里强调下,我的wkhtmltopdf工具是跟随代码一起部署的,并不是在Linux中单独安装wkhtmltopdf。
麻蛋,看看中间出现的问题:
1、问题1:Permission denied
具体堆栈信息:
2022-04-21 18:45:47.609 +08:00 [ERR ] Message:Permission denied。堆栈详情: at System.Diagnostics.Process.ForkAndExecProcess(String filename, String[] argv, String[] envp, String cwd, Boolean redirectStdin, Boolean redirectStdout, Boolean redirectStderr, Boolean setCredentials, UInt32 userId, UInt32 groupId, UInt32[] groups, Int32& stdinFd, Int32& stdoutFd, Int32& stderrFd, Boolean usesTerminal, Boolean throwOnNoExec) at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() at System.Diagnostics.Process.Start(ProcessStartInfo startInfo) at OpenHtmlToPdf.HtmlToPdfConverterProcess.Convert(ConversionSource conversionSource) at OpenHtmlToPdf.HtmlToPdfConverterProcess.ConvertToPdf(String html, IDictionary`2 globalSettings, IDictionary`2 objectSettings) at OpenHtmlToPdf.Pdf.DocumentBuilder.ReadContentUsingTemporaryFile(String temporaryFilename) at OpenHtmlToPdf.Pdf.DocumentBuilder.Content()
原因是:Rotativa/Linux/wkhtmltopdf文件没有开启写权限,如下图(下图是开了权限后的,哈哈,开权限前忘了截图了)
解决方法:开权限命令如下:
chmod -R 777 wkhtmltopdf
2、Could find 'xxxx.pdf'
具体的堆栈信息忘了截图了,这个问题是解决了权限问题后出现的。
原因很简单:你的wkhtmltopdf和Linux系统版本不匹配。
解决:从官网下载匹配的wkhtmltopdf,根据Linux系统信息下载匹配的即可。
3、其他
当然中间还有其他乱七八糟的问题,这些问题都是上边两个情况导致的。这里就不说了。