素材巴巴 > 程序开发 >

.net core 生成html,ASP.NET Core html生成pdf

程序开发 2023-09-09 10:58:35

本文,主要记录在处理.NET Core Web API项目时使用DinkToPDF库轻松生成PDF。

DinkToPdf,是一个跨平台的库,是Webkit HTML to PDF库的包装。它使用WebKit引擎将HTML转换为PDF。它可以在.NET Core项目中将HTML字符串生成PDF文档,或者从现有的HTML页面创建PDF文档。

由于官方的DinkToPdf https://github.com/rdvojmoc/DinkToPdf 最新的更新已经是三年前的了,原来的DinkToPdf需要引入几个dll,这些dll也没有更新,导致目前在linux系统中,还有docker容器环境中无法使用。(github上也有很多issue都是关于这些问题的,好像都没有特别好的处理办法)。

后来发现了一个Haukcode.DinkToPdf这个库,是作者根据DinkToPdf改造的(https://www.nuget.org/packages/Haukcode.DinkToPdf/

),将一些dll整合进去了,也兼容容器环境了。

安装,在.csproj中加上下面这行,然后restore一下。或者直接去NuGet包管理器搜索安装也是一样的。

Install-Package Haukcode.DinkToPdf -Version 1.1.2

在Startup.cs中添加:

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

创建IPDFService

using System;

namespace HtmlToPdf.Services

{

///

/// 与pdf相关

///

public interface IPDFService

{

///

/// 创建PDF

///

/// 传入html字符串

///

byte[] CreatePDF(string htmlContent);

}

}

创建PDFService

using System;

using DinkToPdf;

using DinkToPdf.Contracts;

namespace HtmlToPdf.Services

{

///

/// 与pdf相关

///

public class PDFService : IPDFService

{

private IConverter _converter;

public PDFService(IConverter converter)

{

_converter = converter;

}

///

/// 创建PDF

///

/// 传入html字符串

///

public byte[] CreatePDF(string htmlContent)

{

var globalSettings = new GlobalSettings

{

ColorMode = ColorMode.Color,

Orientation = Orientation.Portrait,

PaperSize = PaperKind.A4,

//Margins = new MarginSettings

//{

// Top = 10,

// Left = 0,

// Right = 0,

//},

DocumentTitle = "PDF Report",

};

var objectSettings = new ObjectSettings

{

PagesCount = true,

HtmlContent = htmlContent,

// Page = "www.baidu.com", //USE THIS PROPERTY TO GENERATE PDF CONTENT FROM AN HTML PAGE 这里是用现有的网页生成PDF

//WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "styles.css") },

WebSettings = { DefaultEncoding = "utf-8" },

//HeaderSettings = { FontName = "Arial", FontSize = 9, Right = "Page [page] of [toPage]", Line = true },

//FooterSettings = { FontName = "Arial", FontSize = 9, Line = true, Center = "Report Footer" }

};

var pdf = new HtmlToPdfDocument()

{

GlobalSettings = globalSettings,

Objects = { objectSettings }

};

var file = _converter.Convert(pdf);

//return File(file, "application/pdf");

return file;

}

}

}

在Startup.cs中依赖注入:

services.AddTransient();

创建TemplateGenerator,生成html字符串

using System;

using System.Text;

namespace HtmlToPdf

{

public static class TemplateGenerator

{

///

/// 获取HTML字符串

///

///

public static string GetPDFHTMLString()

{

StringBuilder sb = new StringBuilder();

sb.Append(@"

这是一个网页!

");

return 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;

public ValuesController(IPDFService pDFService)

{

_PDFService = pDFService;

}

[HttpGet("pdf")]

public FileResult GetPDF()

{

//获取html模板

var htmlContent = TemplateGenerator.GetPDFHTMLString();

//生成PDF

var pdfBytes = _PDFService.CreatePDF(htmlContent);

return File(pdfBytes, "application/pdf");

}

}

}

81ff83d18534

image.png

可以看到html字符串已经生成了pdf文档

本文项目部署的环境是在Docker容器中,采用ASP.NET Core官方的镜像。

这个镜像是精简的,所以没有一些字体,那就这样部署到docker容器中的话网页会乱码。

所以,要手动添加字体。如下,下载字体文件simsun.ttc。

在dockerfile文件中添加:

ADD ./simsun.ttc /usr/share/fonts/simsun.ttc

构建镜像部署即可


标签:

上一篇: js运动(二)—— 右侧悬浮框 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。