我需要从服务器端的HTML创建一个pdf文件(dotnet 2),并将其作为电子邮件的附件发送。我创建了一个节点服务(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文件正在生成。但是,一旦我将应用程序部署到服务器上,节点函数就不会被触发。任何有关这个问题的帮助都会很有帮助。谢谢。
由于这是一个家庭项目,我买不起任何高级的HTML-to-PDF转换器。
发布于 2019-09-14 14:05:52
我在客户端使用了R角7,并相应地安装了npm包,其中也包括了html-pdf
包。但是,我没有在保存节点脚本的目录中安装它。我希望这个包在部署后会从vendor.js中取出,这显然不是这样的。我必须在目录中创建另一个package.json文件,并在部署后分别安装,此后一切顺利。
这正是我在部署应用程序时所缺少的--在节点脚本的本地目录中安装我正在使用的包的一个小的手动npm install
。
非常感谢你对这个问题的讨论,它帮助我很好地理解了我可能犯的其他错误。
发布于 2019-09-13 16:25:10
您可能会看到这是您试图用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
https://stackoverflow.com/questions/57925105
复制相似问题