Как показать текст в PDF, созданный функцией Azure

2

Я пытаюсь создать 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 появляются поля (см., Например, ниже). Изображение 174551

Более того, ответ также мучительно медленный. Есть ли способ улучшить/исправить это?

Дополнительная информация:

  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.

  • 2
    Первое, что приходит на ум, когда я вижу рендер, это то, что в среде Azure либо отсутствует шрифт, либо кодировка воспроизводится неправильно.
  • 0
    @rickvdbosch Я тоже так думал, а затем добавил часть WebSettings = { DefaultEncoding = "utf-8" } , но это тоже не помогло :(
Показать ещё 4 комментария
Теги:
azure
.net-core
azure-functions
wkhtmltopdf

1 ответ

4
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню