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文档的步骤分享 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS javascript 结合实现悬浮固定菜单效果

    实现悬浮固定菜单效果需要使用CSS和JavaScript结合来操作DOM元素和改变页面样式。以下是该功能的完整攻略: 1. HTML 结构 在 HTML 中,需要定义一个包含导航栏的容器。导航栏可以放在一个无序列表(UL)中,其中每个列表项(LI)代表一个菜单项。为了实现固定悬浮的效果,需要设置导航栏容器的 position 属性为 fixed。 示例代码:…

    css 2023年6月10日
    00
  • excel表格如何制作导航栏效果 制作导航栏切换效果的方法

    关于“excel表格如何制作导航栏效果 制作导航栏切换效果的方法”的完整攻略,我将为您提供以下的详细说明: 制作导航栏效果 首先,打开需要添加导航栏的excel表格,在第一行创建一个导航栏区域,例如B1:F1。 在导航栏区域中输入需要添加的导航链接名称,例如“首页”、“联系我们”等等。 选中导航栏区域,使用鼠标右键或者点击“开始”选项卡中的“格式为表格”按钮…

    css 2023年6月11日
    00
  • CSS Gird布局教程指南

    当谈到网页布局技术时,CSS Grid应该是最流行的之一。下面是一个CSS Grid布局教程指南,让您了解如何使用CSS Grid来构建现代、响应式的网站布局。 什么是CSS Grid? CSS Grid是一个网页布局技术,它允许您创建复杂的网格结构,以更好地控制您的网页上的元素排列。使用CSS Grid,您可以轻松地创建响应式布局,以满足不同屏幕尺寸的需求…

    css 2023年6月10日
    00
  • css样式的动态添加及显示和隐藏等零碎用法

    针对”css样式的动态添加及显示和隐藏等零碎用法”的问题,我来分享一些详细的攻略: 动态添加CSS样式 在网页中,我们可以通过JavaScript来动态添加CSS样式,这样可以让网页更加灵活美观,以下是使用JavaScript动态添加CSS样式的步骤: 1.创建一个新的style标签,将其插入到head标签中,代码如下: var style = docume…

    css 2023年6月9日
    00
  • 详解八种方法实现CSS页面底部固定

    我很乐意为您讲解“详解八种方法实现CSS页面底部固定”的完整攻略。 详解八种方法实现CSS页面底部固定 在开发网页时,经常会遇到需要将底部固定在页面底部的需求。下面介绍八种CSS方法可以实现底部固定的效果。 方法1:使用绝对定位 这是最简单的一种方法,只需设置底部的样式为绝对定位,距离底部为0即可。 footer{ position: absolute; b…

    css 2023年6月9日
    00
  • css控制文字自动换行的实现方法

    关于CSS控制文字自动换行的实现方法,我可以为您提供以下攻略: 1. CSS属性word-wrap word-wrap属性用于控制超长单词的换行方式。当该属性的取值为normal时,浏览器默认采用断字法,即单词不会被自动切断。而当取值为break-word时,浏览器会在单词内部进行换行。代码示例如下: p { word-wrap: break-word; }…

    css 2023年6月10日
    00
  • CSS网页布局入门教程13:下拉及多级弹出式菜单

    让我为您讲解“CSS网页布局入门教程13:下拉及多级弹出式菜单”的完整攻略。 1. 下拉式菜单 下拉式菜单常见于网页导航栏中,能够使页面看起来更美观、更易用。 HTML 结构 下拉式菜单的 HTML 结构需要包含一个触发下拉的按钮和一个下拉菜单。 <div class="dropdown"> <button class=…

    css 2023年6月10日
    00
  • ExtJS自定义主题(theme)样式详解

    下面我来为你详细讲解“ExtJS自定义主题(theme)样式详解”的完整攻略。 一、什么是ExtJS主题(theme)? 在 ExtJS 中,主题 (theme) 可以定义应用程序的整体外观,例如字体、颜色、样式等元素。主题有自己的文件及文件夹,其中包含了 CSS, images以及其他资源。 通过使用主题,我们可以快速地创建一个自定义的漂亮应用程序。 二、…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部