沃梦达 / IT编程 / 前端开发 / 正文

ASP.NET Core中快速构建PDF文档的步骤分享

当我们需要在ASP.NET Core中要快速构建PDF文档时,我们可以通过以下步骤进行:

当我们需要在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文档的步骤分享