• 各操作系统平台下实现Html to Pdf


    一、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、其他

    当然中间还有其他乱七八糟的问题,这些问题都是上边两个情况导致的。这里就不说了。

  • 相关阅读:
    函数的扩展
    数组的扩展
    event(1)
    面试
    iframes
    浏览器CSS兼容
    BFC
    简单的一个轮播效果
    asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(二)
    我的web框架设计
  • 原文地址:https://www.cnblogs.com/qtiger/p/16180556.html
Copyright © 2020-2023  润新知