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

.net core 使用节点服务从dotnet Core 2创建PDF文档,.net-core,html-pdf,nodeservices,.net Core,Html Pdf,Nodeservices,我需要从服务器端(dotnet core 2)的HTML创建一个pdf文件,并将其作为电子邮件附件发送。我创建了一个节点服务(createPdf.js),如下所示,并将其保存在解决方案中的本地目录(NodeService)中- module.exports = function (callback, html, outputFilePath) { var pdf = require('html-pdf'); var options = { format: 'A3', orient

我需要从服务器端(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;
        }
    }
当我在调试模式下触发函数时,它工作正常,并且生成pdf文件。但是,一旦我将应用程序部署到服务器上,就不会触发节点功能。 关于这个问题的任何帮助都将非常有用。谢谢

另外,由于这是一个家庭项目,我负担不起任何高级HTML到PDF转换器

您可以看看您试图通过NodeService实现的工作示例。它在Docker上运行,因此您可以从Docker文件中得到一个提示,提示您需要在服务器上安装什么才能使它在那里工作

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

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
您可以将其作为一个工作示例来了解您试图通过NodeService实现的目标。它在Docker上运行,因此您可以从Docker文件中得到一个提示,提示您需要在服务器上安装什么才能使它在那里工作

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

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包,其中还包括
HTMLPDF
包。但是,我没有将它安装在保存节点脚本的目录中。我希望在部署后从vendor.js获取包,但事实显然并非如此。我不得不在目录中创建另一个package.json文件,并在部署后单独安装,此后一切顺利

这就是我在部署应用程序时所缺少的—在节点脚本的本地目录中安装我正在使用的软件包时需要的一点手动
npm install


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

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

这就是我在部署应用程序时所缺少的—在节点脚本的本地目录中安装我正在使用的软件包时需要的一点手动
npm install


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

您的问题可能不是这两个方法,而是调用节点方法的代码。使用调用函数的位置编辑帖子我已更新查询SendQuotationToHospitalAsync被触发?是,它被触发。我认为问题不在于在服务器端调用方法,而nodeService等参数的his值与您的开发环境类似?!您的问题可能不是这两个方法,而是调用节点方法的代码。使用调用函数的位置编辑帖子我已更新查询SendQuotationToHospitalAsync被触发?是,它被触发。我认为问题不在于在服务器端调用方法,而nodeService等参数的his值与您的开发环境类似?!我通过安装PuppeterSharp尝试了第二种方法,但找不到BrowserFetcher。您需要在
csproj
中安装
,并添加使用指令,如
使用PuppeterSharp
。我通过安装PuppeterSharp尝试了第二种方法,但找不到BrowserFetcher。您需要在
csproj
中安装
,并添加使用指令,如
使用PuppeterSharp
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