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



我需要从服务器端(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);
...
}

我还在启动中注册了节点服务.cs-

services.AddNodeServices();

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

附言由于这是一个家庭项目,我买不起任何高级 HTML 到 PDF 转换器

你可以把它看作是一个工作的例子,说明你试图用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

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

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

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

最新更新