使用 ASP.NET 5 导出为 pdf

2023-11-22

我正在开发 MVC 6 应用程序(DNX Core 5.0 框架)。不幸的是,我没有找到任何用于 pdf 导出的库。

任何帮助将不胜感激。


我终于找到了一种从 .NET Core 生成 pdf 的方法(没有任何 .NET 框架依赖项),即在我的 .NET Core 应用程序中使用 Node.js。 以下示例演示如何在干净的 ASP.NET Core Web 应用程序项目(Web API 模板)中实现 HTML 到 PDF 转换器。

安装 NuGet 包Microsoft.AspNetCore.NodeServices

在 Startup.cs 中添加以下行services.AddNodeServices()像这样

public void ConfigureServices(IServiceCollection services)
{
    // ... all your existing configuration is here ...

    // Enable Node Services
    services.AddNodeServices();
}

现在安装所需的 Node.js 包:

从命令行将工作目录更改为 .NET Core 项目的根目录并运行这些命令。

npm init

并按照说明创建 package.json 文件

npm install jsreport-core --save
npm install jsreport-jsrender --save
npm install jsreport-phantom-pdf --save

创建文件pdf.js在包含的项目的根目录中

module.exports = function (callback) {
    var jsreport = require('jsreport-core')();

    jsreport.init().then(function () {
        return jsreport.render({
            template: {
                content: '<h1>Hello {{:foo}}</h1>',
                engine: 'jsrender',
                recipe: 'phantom-pdf'
            },
            data: {
                foo: "world"
            }
        }).then(function (resp) {
            callback(/* error */ null, resp.content.toJSON().data);
        });
    }).catch(function (e) {
        callback(/* error */ e, null);
    })
};

看一看here欲了解更多解释jsreport-core.

现在在 Mvc 控制器中创建一个调用此 Node.js 脚本的操作

[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
    var result = await nodeServices.InvokeAsync<byte[]>("./pdf");

    HttpContext.Response.ContentType = "application/pdf";

    string filename = @"report.pdf";
    HttpContext.Response.Headers.Add("x-filename", filename);
    HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
    HttpContext.Response.Body.Write(result, 0, result.Length);
    return new ContentResult();
}

当然你可以用byte[]从 nodeServices 返回,在本例中,我只是从控制器操作中输出它,以便可以在浏览器中查看它。

您还可以使用 Base64 编码字符串在 Node.js 和 .NET Core 之间交换数据resp.content.toString('base64') in pdf.js并使用var result = await nodeServices.InvokeAsync<byte[]>("./pdf");在操作中,然后解码 Base64 编码的字符串。


Alternatives

大多数 pdf 生成器解决方案仍然依赖于 .NET 4.5/4.6 框架。 上面的两个答案(JsReport 和 RazorPDFCore)都不适用于 .NET Core。

如果您不喜欢使用 Node.js,似乎可以使用一些付费替代方案:

  • NReco.PdfGenerator.LT
  • 适用于 .NET Core 的 EVO HTML 到 PDF 转换器客户端
  • 适用于 .NET Core 的 Winnovative HTML 到 PDF 转换器客户端

不过我还没有尝试过这些。

我希望我们很快就能看到这个领域的一些开源进展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASP.NET 5 导出为 pdf 的相关文章

随机推荐

  • 如何在Python中的散点图上绘制一条线?

    我有两个数据向量 并将它们放入pyplot scatter 现在我想对这些数据绘制线性拟合 我该怎么做 我尝试过使用scikitlearn and np polyfit import numpy as np from numpy polyn
  • 对具有原始数字返回类型的方法的反思

    我目前正在开发一个小型框架来收集 OSGi 系统中的指标 它的核心是注释 Metric 它指示服务的给定方法可以在被请求时提供度量 例如数值 这些方法看起来像 Metric public int getQueueSize or Metric
  • maven没有找到类

    我继承了一个巨大的maven java项目 但无法编译它 mvn compile 它告诉我它找不到一个类 即使它就在本地仓库中 Failed to execute goal org codehaus enunciate maven enun
  • 如何在 Ruby 中实现抽象类

    我知道 Ruby 中没有抽象类的概念 但如果需要实施的话 我该如何实施呢 我尝试过这样的事情 class A def self new raise Doh You are trying to write Java in Ruby end e
  • 从wcf服务返回html

    我有一个网络服务 我需要从中返回一个包含 html 的字符串 此 html 是 Select 控件的标记 用于 jqGrid 搜索过滤器 例如
  • 计算函数返回值的最佳实践

    我经常用 C 语言构建函数来检查一些参数并返回错误代码 当我发现错误时停止值检查的最佳方法是什么 第一个例子 ErrorCode e myCheckFunction some params ErrorCode e error CHECK F
  • 以编程方式更改 R.String 的值

    您可以在 Android 程序中以编程方式更改 R string 的值吗 我需要提取一些 API 信息 例如电池状态 电池百分比 android 操作系统版本 并希望将其保存为 R string 值 我知道怎么读 String helloV
  • 如何通过简化 R 中的两个 SpatialPolygonsDataFrame 对象来创建新的多边形?

    假设我有两组形状文件 它们覆盖同一区域 并且经常但并不总是共享边界 例如美国各县和 PUMA 我想定义一个新的多边形规模 它使用 PUMA 和县作为原子构建块 即两者都不能分割 但我仍然希望有尽可能多的单位 这是一个玩具示例 library
  • 如何通过 ssh 执行 Bash 别名

    这就是我想做的 ssh andy
  • 为什么 -1>strlen(t) 在 C 中为真? [复制]

    这个问题在这里已经有答案了 在 VS2013 中处理这一小段代码 但由于某种原因它没有打印 似乎 1 gt strlen str 任何人都知道我做错了什么 char str abcd if 1
  • “gcc 链接”和“ld 链接”之间有什么关系?

    据说linux的加载器是 usr bin ld 但通常我们使用gcc g 来链接库和可执行文件 我们很少使用 ld 上次我手动使用 ld 是在学习linux汇编时 生成可执行文件的唯一方法是ld一个 o文件直接生成可执行文件 无需任何库 我
  • 如何使用 Javascript 中的“views.py”、Django 模板中的“”中的变量?

    当我使用 Django 模板渲染器渲染页面时 我可以传入一个包含各种值的字典变量 以便在页面中操作它们 myVar 有没有办法在 JavaScript 中访问相同的变量 也许使用DOM 我不知道Django如何使变量可访问 我希望能够使用查
  • Vagrant/VirtualBox/Apache2 奇怪的缓存行为

    我正在使用 Vagrant 来运行 Ubuntu 驱动的 VirtualBox 和 Apache2 除其他外 网络服务器还提供我的 vagrant 目录中的静态文件 这在大多数情况下都很有效 但是 当我更改共享文件夹上的图像并重新加载网站时
  • JVM 的 -XX:+StressLCM、-XX:+StressGCM 选项

    和一些人玩的时候jcstress代码中 我注意到两个对我来说非常新的参数 StressLCM and StressGCM 我要做的第一件事就是在源代码本身中搜索这些内容 虽然我找到了一些东西 但仍然不清楚它们是什么actually做 我真的
  • python3 - super() 在多重继承上的行为

    我知道 super 和多重继承已经在这里讨论过 但关于我在 python3 中的具体问题 我没有找到解决方案 假设我们有 usr bin env python3 class A object def init self super init
  • 如果我们有多个 XML 配置文件,DispatcherServlet 如何工作?

    问题 如果我们有多个 XML 配置文件 DispatcherServlet 如何工作 那么 Spring Application Context 如何加载它们并对其进行操作 设想 就我而言 我们有一个应该是全局的应用程序 即应用程序应该具有
  • 在 asp.net mvc 3 razor 中识别 html 帮助程序时出现问题

    这就是我的 Html 助手的样子 namespace WebApp WebUI public static class HtmlExtensions public static MvcHtmlString GenerateCaptcha t
  • Ruby:为什么只要覆盖“#eql?”就需要覆盖“#hash”?

    In 这个演示文稿说话者创建了一个值类别 在实现它时 他覆盖了 eql 并说在 Java 开发中 习惯用法是每当你重写 eql 你必须覆盖 hash class Weight def hash pounds hash end def eql
  • 何时使用map()函数以及何时使用summarise_at()/mutate_at()

    任何人都可以提供有关何时使用的建议map 所有map 函数 以及何时使用summarise at mutate at 例如 如果我们对向量列进行一些修改 那么我们不需要考虑map 如果我们有一个 df 有一个列中有一个列表 那么我们需要使用
  • 使用 ASP.NET 5 导出为 pdf

    我正在开发 MVC 6 应用程序 DNX Core 5 0 框架 不幸的是 我没有找到任何用于 pdf 导出的库 任何帮助将不胜感激 我终于找到了一种从 NET Core 生成 pdf 的方法 没有任何 NET 框架依赖项 即在我的 NET