使用节点服务从 dotnet Core 2 创建 PDF 文档

Creating PDF document from dotnet Core 2 using node service

我需要在服务器端 (dotnet core 2) 从 HTML 创建一个 pdf 文件并将其作为电子邮件附件发送。我创建了一个节点服务(createPdf.js)如下,并将其保存在解决方案中的本地目录(NodeService)中-

module.exports = function (callback, html, outputFilePath) {
    var pdf = require('html-pdf');
    var options = { format: 'A3', orientation: 'portrait' };

    pdf.create(html, options)
        .toFile(outputFilePath, function (err, res) {
            if (err)
                return callback(null, false);

            callback(null, true);
        });
} 

我按如下方式触发此功能 -

    public static async Task<bool> GeneratePdf(INodeServices nodeService, string html, string outputFilePath)
    {
        string pdfGenerationNodeService = Path.Combine(Directory.GetCurrentDirectory(), "NodeService", "createPdf.js");
        try
        {
            return await nodeService.InvokeAsync<bool>(pdfGenerationNodeService, html, outputFilePath);
        }
        catch (Exception ex)
        {
            throw;
        }
    }

用于从控制器调用此方法 -

public async Task<IActionResult> SendQuotationToHospitalAsync([FromServices]INodeServices nodeService, int id)
{
    ...
    bool isAdminPdfGenerationSuccess = await PdfHelperService.GeneratePdf(nodeService, htmlContent, filePath);
    ...
}

我也在StartUp.cs-

注册了节点服务
services.AddNodeServices();

当我在调试模式下触发函数时,它工作正常并且正在生成 pdf 文件。但是,一旦我在服务器上部署应用程序,节点功能就不会被触发。 有关此问题的任何帮助都会非常有帮助。谢谢

P.S。由于这是一个家庭项目,我买不起任何溢价 HTML-to-PDF converter

您可以查看 this 作为您尝试使用 NodeServices 实现的工作示例。它在 Docker 上运行,因此您可以从 Docker 文件中获得提示,了解您需要在服务器上安装什么才能让它在那里工作。

另一种方法是使用PuppeteerSharp,如下:

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
  Headless = true,
  Args = new string[] { "--no-sandbox" }
});

var page = await browser.NewPageAsync();
await page.SetContentAsync(htmlContent);
await page.PdfAsync(filePath); // page.PdfStreamAsync() to generate only in-memory

我在客户端使用 angular 7,并相应地安装了 npm 包,其中也包括 html-pdf 包。但是,我没有将它安装在我保存节点脚本的目录中。我希望包会在部署后从 vendor.js 中获取,但显然不是这样。我不得不在目录中创建另一个 package.json 文件并在部署后单独安装它,此后一切顺利。

这就是我在部署应用程序时所缺少的 - 在节点脚本的本地目录中安装我正在使用的包的小手册npm install

非常感谢您讨论这个问题,它帮助我理解了我可能犯的其他错误。