Azure函数执行HTML转PDF时遇权限拒绝错误求助
解决Azure函数中NReco HtmlToPdfConverter权限拒绝问题
问题根源
NReco.PdfGenerator默认会尝试将wkhtmltopdf相关库解压到程序运行的系统目录(如你遇到的C:\Program Files (x86)\SiteExtensions\Functions\3.20.0\32bit\),但Azure函数运行在沙箱环境中,系统目录是只读的,因此触发了UnauthorizedAccessException。本地调试正常是因为本地项目目录有完全读写权限。
解决方案
通过指定NReco转换器的临时文件夹到Azure函数允许读写的路径,或者手动指定wkhtmltopdf二进制文件的位置,即可解决权限问题。
方案1:指定可读写的临时目录
Azure函数允许读写的路径包括:
%TEMP%:系统临时目录D:\home\temp:函数应用的专属临时目录
修改代码如下:
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter(); // 设置临时文件夹到函数应用可读写的路径 htmlToPdf.TempFolder = Path.Combine(Environment.GetEnvironmentVariable("HOME"), "temp"); var pdfBytes = htmlToPdf.GeneratePdf(req.BodyHtml); return new FileContentResult(pdfBytes, "application/pdf") { FileDownloadName = "test.pdf" };
方案2:手动部署wkhtmltopdf二进制文件
如果需要更可控的wkhtmltopdf版本,可以将二进制文件打包到函数项目中:
- 在函数项目中创建
wkhtmltopdf文件夹,放入对应平台的wkhtmltopdf.exe及依赖文件 - 设置这些文件的复制到输出目录属性为“始终复制”
- 在代码中指定二进制文件路径:
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter(); // 指向项目中部署的wkhtmltopdf文件 htmlToPdf.WkHtmlPath = Path.Combine(Environment.CurrentDirectory, "wkhtmltopdf", "wkhtmltopdf.exe"); var pdfBytes = htmlToPdf.GeneratePdf(req.BodyHtml); return new FileContentResult(pdfBytes, "application/pdf") { FileDownloadName = "test.pdf" };
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

