Wkhtmltopdf.NetCore使用總結(jié)
序言
環(huán)境要求:在centos7的docker上,.NETCORE 3.1
目標(biāo):將HTML轉(zhuǎn)為PDF導(dǎo)出
相關(guān)測(cè)試:
Select.HtmlToPdf.NetCore,兼容性很好,使用也挺簡(jiǎn)單的,但是只支持windows系統(tǒng);
DinkToPdf、Haukcode.WkHtmlToPdfDotNet等類庫(kù)在centos要支持各種類庫(kù),最后放棄了;
還有個(gè)itextsharp沒有測(cè)試,有文章表示它對(duì)css的支持比較弱。
Haukcode.WkHtmlToPdfDotNet簡(jiǎn)介
地址:https://github.com/HakanL/WkHtmlToPdf-DotNet
它使用P/invoke方式將wkhtmltopdf打包為linux的libwkhtmltox.so庫(kù)來調(diào)用;
相關(guān)技術(shù)文章:http://www.rzrgm.cn/kelelipeng/p/10654315.html
HTML頁面編寫
樣式注意要點(diǎn):要有實(shí)際內(nèi)容,轉(zhuǎn)為PDF才會(huì)展示;
陷阱1:寬度百分比無效;
陷阱2:同行DIV要使用display:inline-block;
陷阱3:div內(nèi)容要垂直居中,通過高度控制,在內(nèi)部添加2個(gè)div,第二個(gè)為空內(nèi)容(?);
類庫(kù)使用
github:https://github.com/fpanaccia/Wkhtmltopdf.NetCore
示例:https://github.com/fpanaccia/Wkhtmltopdf.NetCore.Example
引用類庫(kù)
在nuget添加Wkhtmltopdf.NetCore,在Startup.cs添加引用
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddWkhtmltopdf();
}
然后,將示例的文件夾Rotativa文件夾拷貝到WEB項(xiàng)目,包含不同操作系統(tǒng)的wkhtmltopdf
dockerfile配置
將windows下的字體拷到到wwwroot/fonts下的微軟雅黑和宋體拷到docker里面,并授權(quán)wkhtmltopdf;
donetcore3是自己封裝的鏡像,已添加libgdiplus;
FROM donetcore3:v1
WORKDIR /app
COPY . .
COPY ./wwwroot/fonts/simsun.ttc /usr/share/fonts/ty/simsun.ttf
COPY ./wwwroot/fonts/msyh.ttc /usr/share/fonts/ty/msyh.ttf
COPY ./wwwroot/fonts/msyhl.ttc /usr/share/fonts/ty/msyhl.ttf
COPY ./wwwroot/fonts/msyhbd.ttc /usr/share/fonts/ty/msyhbd.ttf
EXPOSE 80/tcp
ENV ASPNETCORE_ENVIRONMENT Production
#測(cè)試多語言 啟用下面參數(shù) 指示docker默認(rèn)環(huán)境的語言為utf8
ENV LC_ALL zh-Hans.UTF-8
ENV LANG zh-Hans.UTF-8
ENV LANGUAGE zh-Hans.UTF-8
RUN chmod 755 /app/Rotativa/Linux/wkhtmltopdf
ENTRYPOINT ["dotnet", "Monitor.Web.dll"]
使用
按A4橫向生成PDF
[HttpGet]
[Route("GetPage")]
public IActionResult GetPage()
{
var options = new ConvertOptions
{
//HeaderHtml = "http://localhost/header.html",
HeaderSpacing = 0,
FooterSpacing = 0,
IsGrayScale = true,
PageSize = Wkhtmltopdf.NetCore.Options.Size.A4,
PageMargins = new Wkhtmltopdf.NetCore.Options.Margins() { Bottom = 0, Left = 0, Right = 0, Top = 0 },
PageOrientation = Wkhtmltopdf.NetCore.Options.Orientation.Landscape
};
_generatePdf.SetConvertOptions(options);
string htmlCode = "";
using (WebClient client = new WebClient())
{
#if DEBUG
htmlCode = client.DownloadString("http://localhost:5020/print/DyColdStoragePrint");
#else
htmlCode = client.DownloadString("http://127.0.0.1/print/DyColdStoragePrint");
#endif
}
var pdf = _generatePdf.GetPDF(htmlCode);
var path = Path.Combine("wwwroot", DateTime.UtcNow.Ticks.ToString() + ".pdf");
using (var stream = new FileStream(path, FileMode.Create))
{
stream.Write(pdf, 0, pdf.Length);
}
return Content(path);
}

浙公網(wǎng)安備 33010602011771號(hào)