Как показать текст в PDF, созданный функцией Azure - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать PDF-файл с помощью функции Azure, используя DinkToPdf . Это то, что я сделал до сих пор.

[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. Я также использую единство МОК для решения 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.

1 Ответ

0 голосов
/ 07 ноября 2018

Похоже, что проблема связана с ограничениями функции Azure в режиме «Потребление». Если вы используете «Режим приложения», он должен работать. См. обсуждение ниже этой статьи для некоторых пользователей, которым удалось преобразовать свою функцию Azure в «Режим приложения».

...