1

我需要从服务器端(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 文件。但是,一旦我在服务器上部署应用程序,节点功能就不会被触发。有关该问题的任何帮助都将非常有帮助。谢谢。

PS 因为它是一个家庭项目,我买不起任何高级 HTML 到 PDF 转换器

4

2 回答 2

0

您可以将其视为您尝试使用 NodeServices 实现的工作示例。它在 Docker 上运行,因此您可以从 Dockerfile 中获得有关您需要在服务器上安装什么才能使其在该服务器上工作的提示。

另一种方法是使用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
于 2019-09-13T16:25:10.350 回答
0

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

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

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

于 2019-09-14T14:05:52.830 回答