如何在Azure函数生成的PDF中显示文本

时间:2018-11-07 11:30:53

标签: c# azure .net-core azure-functions wkhtmltopdf

我正在尝试使用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时,它无法按预期工作。

主要问题是在pdf文本中,出现了框(例如,请参见下文)。 enter image description here

此外,响应速度也非常慢。有没有办法改善/纠正这个问题?

其他信息:

  1. 我还使用统一的IOC来解决IConverter。类型注册如下所示:

    var container = new UnityContainer();
    container.RegisterType<IConverter>(
        new ContainerControlledLifetimeManager(),
        new InjectionFactory(c => new SynchronizedConverter(new PdfTools()))
    );
    
  2. 我已经尝试了几个其他的NuGet程序包,例如PdfSharp,MigraDoc,Select.HtmlToPdf.NetCore等。但是所有这些程序包都依赖于System.Drawing.Common,在Azure函数中不可用。 / p>

1 个答案:

答案 0 :(得分:4)

该问题似乎与“消费”模式下Azure功能的限制有关。如果您使用“应用程序模式”,它应该可以工作。 有关成功将Azure功能转换为“应用程序模式”的某些用户,请参见the discussion below this Gist