我正在尝试使用DinkToPdf通过Azure函数生成PDF。这是我到目前为止所做的。
[FunctionName("GeneratePdf")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log,
ExecutionContext executionContext)
{
string name = await GetName(req);
return CreatePdf(name, executionContext);
}
private static ActionResult CreatePdf(string name, ExecutionContext executionContext)
{
var globalSettings = new GlobalSettings
{
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4,
Margins = new MarginSettings { Top = 10 },
};
var objectSettings = new ObjectSettings
{
PagesCount = true,
WebSettings = { DefaultEncoding = "utf-8" },
HtmlContent = $@"
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
Hello, ${name}
</body>
</html>",
};
var pdf = new HtmlToPdfDocument()
{
GlobalSettings = globalSettings,
Objects = { objectSettings }
};
byte[] pdfBytes = IocContainer.Resolve<IConverter>().Convert(pdf);
return new FileContentResult(pdfBytes, "application/pdf");
}
当我在本地测试该功能时,这工作得很好。但是,当部署到Azure时,它无法按预期工作。
此外,响应速度也非常慢。有没有办法改善/纠正这个问题?
其他信息:
我还使用统一的IOC来解决IConverter
。类型注册如下所示:
var container = new UnityContainer();
container.RegisterType<IConverter>(
new ContainerControlledLifetimeManager(),
new InjectionFactory(c => new SynchronizedConverter(new PdfTools()))
);
我已经尝试了几个其他的NuGet程序包,例如PdfSharp,MigraDoc,Select.HtmlToPdf.NetCore等。但是所有这些程序包都依赖于System.Drawing.Common
,在Azure函数中不可用。 / p>
答案 0 :(得分:4)
该问题似乎与“消费”模式下Azure功能的限制有关。如果您使用“应用程序模式”,它应该可以工作。 有关成功将Azure功能转换为“应用程序模式”的某些用户,请参见the discussion below this Gist。