(转)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"><summary></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"></summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><param name="htmlContent"></span>传入html字符串<span class="hljs-doctag"></param></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><returns></span><span class="hljs-doctag"></returns></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>
</style>
</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