当我们需要在ASP.NET Core中要快速构建PDF文档时,我们可以通过以下步骤进行:
步骤一:安装依赖
我们需要安装以下库:
- DinkToPdf:该库可以将HTML转换为PDF。
- DinkToPdf nuget包:用于安装库的nuget包。
- Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation nuget包(可选):可以在运行时编译Razor View,以便将其转换为HTML用于PDF文档生成。
你可以通过在项目中的NuGet包管理器中搜索这些库来进行安装。
步骤二:添加依赖注入
在ASP.NET Core的Startup文件中,我们需要添加以下依赖注入
using DinkToPdf.Contracts;
using DinkToPdf;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
var context = new CustomAssemblyLoadContext();
context.LoadUnmanagedLibrary(Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll"));
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
}
// other configuration
}
CustomAssemblyLoadContext
是为了在非Windows系统上运行。而libwkhtmltox
是为了将HTML转换为PDF使用的底层工具。
SynchronizedConverter和PdfTools负责将HTML转换为PDF。
步骤三:创建生成PDF文档的服务
我们创建了一个名为PdfService.cs的服务,该服务负责将HTML转换为PDF。
using System.Threading.Tasks;
using DinkToPdf.Contracts;
public class PdfService : IPdfService
{
private readonly IConverter _pdfConverter;
public PdfService(IConverter pdfConverter)
{
_pdfConverter = pdfConverter;
}
public async Task<byte[]> CreatePDFAsync(string html)
{
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
Margins = new MarginSettings() { Top = 10 },
Out = "output.pdf"
},
Objects = {
new ObjectSettings() {
PagesCount = true,
HtmlContent = html,
WebSettings = { DefaultEncoding = "utf-8" },
HeaderSettings = { FontName = "Verdana", FontSize = 9 },
FooterSettings = { FontName = "Verdana", FontSize = 9, Line = true, Center = "footer" }
}
}
};
return await Task.Run(() => _pdfConverter.Convert(doc));
}
}
该服务从接收的HTML字符串中创建一个新的HtmlToPdfDocument
。这个对象有许多参数可以调整,例如纸张大小、页面边距、页眉、页脚等。通过传递这个HtmlToPdfDocument
到PDF转换器的Converter
方法,我们就可以将HTML转换为PDF。
步骤四:创建控制器来呈现PDF
我们创建了一个名为PdfController.cs的控制器,该控制器可以将生成的PDF文档呈现给用户。
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
private readonly IPdfService _pdfService;
public PdfController(IPdfService pdfService)
{
_pdfService = pdfService;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var htmlContent = @"<html><head></head><body><h1>Hello, World!</h1></body></html>";
var pdf = await _pdfService.CreatePDFAsync(htmlContent);
return File(pdf, "application/pdf");
}
}
在这个控制器中,我们调用CreatePDFAsync
方法生成PDF并返回FileResult
类型的PDF数据。
示例:
假设我们需要在ASP.NET Core应用程序中动态生成PDF,并将其作为返回值发送到客户端。我们需要首先在Nuget包管理器中安装以下程序包:
- DinkToPdf 1.0.8-beta15
- Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
然后,我们创建一个名为PdfService.cs的服务来生成PDF。这个服务的代码如下:
using System.Threading.Tasks;
using DinkToPdf;
using DinkToPdf.Contracts;
public class PdfService : IPdfService
{
private readonly IConverter _converter;
public PdfService(IConverter converter)
{
_converter = converter;
}
public async Task<byte[]> GeneratePdf(string html)
{
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
Margins = new MarginSettings() { Top = 10 },
},
Objects = {
new ObjectSettings() {
PagesCount = true,
HtmlContent = html,
WebSettings = { DefaultEncoding = "utf-8" },
}
}
};
return await Task.Run(() => _converter.Convert(doc));
}
}
接下来,我们需要创建一个名为PdfController.cs的控制器,该控制器将生成PDF文档并返回给客户端。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace PdfGenerator.Pages
{
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
private readonly ILogger<PdfController> _logger;
private readonly IPdfService _pdfService;
public PdfController(ILogger<PdfController> logger, IPdfService pdfService)
{
_logger = logger;
_pdfService = pdfService;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var html = "<html><body><h1>Hello, World!</h1></body></html>";
var bytes = await _pdfService.GeneratePdf(html);
return File(bytes, "application/pdf");
}
}
}
我们可以通过调用生成PDF的API来测试我们的应用程序。通过在浏览器中输入以下地址,我们就可以看到生成的PDF文档:http://localhost:[port]/api/Pdf
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core中快速构建PDF文档的步骤分享 - Python技术站