(转)Dinktopdf在.net core项目里将Html转成PDF(支持liunx)

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

在 Startup.cs 中添加:

services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));//DinkToPdf 注入

创建 IPDFService

using System;
namespace HtmlToPdf.Services
{
    /// <summary>
    /// 与 pdf 相关
    /// </summary>
    public interface IPDFService
    {
        /// <summary>
        /// 创建 PDF
        /// </summary>
        /// <param name="htmlContent">传入 html 字符串</param>
        /// <returns></returns>
        byte[] CreatePDF(string htmlContent);
    }
}

创建 PDFService

using System;
using DinkToPdf;
using DinkToPdf.Contracts;

namespace HtmlToPdf.Services
{
/// <summary>
/// 与 pdf 相关
/// </summary>
public class PDFService : IPDFService
{
private IConverter _converter;
public PDFService(IConverter converter)
{
_converter = converter;
}

    <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag">&lt;summary&gt;</span></span>
    <span class="hljs-comment"><span class="hljs-doctag">///</span> 创建PDF</span>
    <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag">&lt;/summary&gt;</span></span>
    <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag">&lt;param name="htmlContent"&gt;</span>传入html字符串<span class="hljs-doctag">&lt;/param&gt;</span></span>
    <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag">&lt;returns&gt;</span><span class="hljs-doctag">&lt;/returns&gt;</span></span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-built_in">byte</span>[] <span class="hljs-title">CreatePDF</span>(<span class="hljs-params"><span class="hljs-built_in">string</span> htmlContent</span>)</span>
    {
        <span class="hljs-keyword">var</span> globalSettings = <span class="hljs-keyword">new</span> GlobalSettings
        {
            ColorMode = ColorMode.Color,
            Orientation = Orientation.Portrait,
            PaperSize = PaperKind.A4,
            <span class="hljs-comment">//Margins = new MarginSettings</span>
            <span class="hljs-comment">//{</span>
            <span class="hljs-comment">//    Top = 10,</span>
            <span class="hljs-comment">//    Left = 0,</span>
            <span class="hljs-comment">//    Right = 0,</span>
            <span class="hljs-comment">//},</span>
            DocumentTitle = <span class="hljs-string">"PDF Report"</span>,
        };

        <span class="hljs-keyword">var</span> objectSettings = <span class="hljs-keyword">new</span> ObjectSettings
        {
            PagesCount = <span class="hljs-literal">true</span>,
            HtmlContent = htmlContent,
            <span class="hljs-comment">// Page = "www.baidu.com", //USE THIS PROPERTY TO GENERATE PDF CONTENT FROM AN HTML PAGE  这里是用现有的网页生成PDF</span>
            <span class="hljs-comment">//WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "styles.css") },</span>
            WebSettings = { DefaultEncoding = <span class="hljs-string">"utf-8"</span> },
            <span class="hljs-comment">//HeaderSettings = { FontName = "Arial", FontSize = 9, Right = "Page [page] of [toPage]", Line = true },</span>
            <span class="hljs-comment">//FooterSettings = { FontName = "Arial", FontSize = 9, Line = true, Center = "Report Footer" }</span>
        };

        <span class="hljs-keyword">var</span> pdf = <span class="hljs-keyword">new</span> HtmlToPdfDocument()
        {
            GlobalSettings = globalSettings,
            Objects = { objectSettings }
        };

        <span class="hljs-keyword">var</span> file = _converter.Convert(pdf);

        <span class="hljs-comment">//return File(file, "application/pdf");</span>

        <span class="hljs-keyword">return</span> file;

    }
}

}

在 Startup.cs 中依赖注入:

services.AddTransient<IPDFService, PDFService>();

创建 TemplateGenerator,生成 html 字符串

using System;
using System.Text;

namespace HtmlToPdf
{
public static class TemplateGenerator
{
/// <summary>
/// 获取 HTML 字符串
/// </summary>
/// <returns></returns>
public static string GetPDFHTMLString()
{

        StringBuilder sb = <span class="hljs-keyword">new</span> StringBuilder();

        sb.Append(<span class="hljs-string">@"

<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<style>

&lt;/style&gt;

</head>

<body>
<div>
这是一个网页!
</div>
</body>
</html>
");

        <span class="hljs-keyword">return</span> sb.ToString();
    }
}

}

修改 ValuesController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using HtmlToPdf.Services;
using Microsoft.AspNetCore.Mvc;

namespace HtmlToPdf.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private IPDFService _PDFService;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ValuesController</span>(<span class="hljs-params">IPDFService pDFService</span>)</span>
    {
        _PDFService = pDFService;
    }

    [<span class="hljs-meta">HttpGet(<span class="hljs-string">"pdf"</span>)</span>]
    <span class="hljs-function"><span class="hljs-keyword">public</span> FileResult <span class="hljs-title">GetPDF</span>()</span>
    {
        <span class="hljs-comment">//获取html模板</span>
        <span class="hljs-keyword">var</span> htmlContent = TemplateGenerator.GetPDFHTMLString();

        <span class="hljs-comment">//生成PDF</span>
        <span class="hljs-keyword">var</span> pdfBytes = _PDFService.CreatePDF(htmlContent);

        <span class="hljs-keyword">return</span> File(pdfBytes, <span class="hljs-string">"application/pdf"</span>);
    }
}

}

测试:
浏览器输入 https://localhost:5001/api/values/pdf

遇到的问题#

1. 不能发布到 linux#

这个版本可以在 liunx 使用,net core 3.1 可以。

2. 生成 1 次 pdf,第 2 次 cpu100%#

Synchronized converter
Use this converter in multi threaded applications and web servers. Conversion tasks are saved to blocking collection and executed on a single thread.

var converter = new SynchronizedConverter(new PdfTools());

因为注入的方式错了。IConverter converter 已经注入为单例了,

services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));//DinkToPdf 注入

所以直接在 service 注入使用。
————————————————
ASP.NET Core html 生成 pdf
作者:GongZH 丶
链接:https://www.jianshu.com/p/81ff83d18534
————————————————
如何使用 Dinktopdf 在.net core 项目里将 Html 转成 PDF
作者:omage
链接:https://blog.csdn.net/omage/article/details/114011447