【问题标题】:What options do we have to generate a PDF from an ASP.NET Core Web Api我们有哪些选项可以从 ASP.NET Core Web Api 生成 PDF
【发布时间】:2020-01-27 15:19:58
【问题描述】:

我需要从 HTML Canvas 生成 PDF,但该过程必须在作为 ASP.NET Core Web Api 的服务器端完成。

【问题讨论】:

  • ASP.NET 中没有任何内置选项/功能可以生成 PDF。你要么必须使用像ItextSharp 这样的服务器端库,要么使用像jsPDF 这样的客户端库,或者像Convert HTML table to PDF using pdfmake 这样的一些教程,或者你选择的任何一个。
  • 有一个很好的库 aspos 可以在服务器端进行转换。然而,它会被支付。

标签: asp.net pdf


【解决方案1】:

在服务器端,您可以将视图的HTML 输出为string,并且可以使用任何从HTMLstring 生成PDF 的库。 将视图呈现到 string 中,请参阅此链接 Return View as String in .NET Core 获得HTML 后,您需要将其传递给库,请参阅此链接将HTML 转换为string Convert HTML to PDF in .NET

1 创建 C# 扩展方法以将视图呈现为字符串

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using System.IO;
using System.Threading.Tasks;

namespace CC.Web.Helpers
{
    public static class ControllerExtensions
    {
        public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                viewName = controller.ControllerContext.ActionDescriptor.ActionName;
            }

            controller.ViewData.Model = model;

            using (var writer = new StringWriter())
            {
                IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
                ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);

                if (viewResult.Success == false)
                {
                    return $"A view with the name {viewName} could not be found";
                }

                ViewContext viewContext = new ViewContext(
                controller.ControllerContext,
                viewResult.View,
                controller.ViewData,
                controller.TempData,
                writer,
                new HtmlHelperOptions()
            );

                await viewResult.View.RenderAsync(viewContext);

                return writer.GetStringBuilder().ToString();
            }
        }
    }
} 

2) 将视图渲染为字符串

viewHtml = await this.RenderViewAsync("Report", model);

3) 使用 HTML 创建 PDF

    Byte[] res = null;
    using (MemoryStream ms = new MemoryStream())
    {
        var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(viewHtml, PdfSharp.PageSize.A4);
        pdf.Save(ms);
        res = ms.ToArray();
    }

【讨论】:

  • 非常感谢您抽出时间并在经过大量研究后提及最佳组合。我还在进行大量研究后发现,您采用了所有步骤的最佳组合并将其组合在一个答案中。再次感谢您的辛勤工作
  • PdfSharp 不支持 .net 内核吗?
  • 步骤 1 和 2 可以通过这个现成的 nuget 包进行简化 github.com/soundaranbu/RazorTemplating
【解决方案2】:
using IronPdf;
IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf();
// Render an HTML document or snippet as a string
Renderer.RenderHtmlAsPdf("<h1>Hello World</h1>").SaveAs("html-string.pdf");
// Advanced: 
// Set a "base url" or file path so that images, javascript and CSS can be loaded  
var PDF = Renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>",@"C:\site\assets\");
PDF.SaveAs("html-with-assets.pdf");

IronPDF for .NET Core

【讨论】:

  • IronPdf 需要付费许可。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 2019-09-16
  • 2018-07-23
  • 1970-01-01
  • 2019-10-30
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多