使用节点服务从 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
。
非常感谢您讨论这个问题,它帮助我理解了我可能犯的其他错误。
我需要在服务器端 (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
。
非常感谢您讨论这个问题,它帮助我理解了我可能犯的其他错误。