【问题标题】:custom fonts with wkhtmltopdf wrapper nreco on azure web app在 azure web 应用程序上使用 wkhtmltopdf 包装器 nreco 自定义字体
【发布时间】:2017-12-20 11:23:23
【问题描述】:

我正在使用 .net 包装器“NReco.PdfGenerator”在 azure Web 应用程序(以标准计划运行)上的 wkhtmltopdf 将 html 文件转换为 pdf,但不能在我的文档中包含自定义字体。 PDF 生成器不会加载自定义字体,或者只是忽略它。 我尝试了不同的格式来包含字体文件,例如指向 google 字体 css 的链接、从 google 字体导入、相对本地路径、绝对本地路径、通过 localhost 加载字体文件和使用 base64 编码字体的字体:

@@font-face {
            font-family: 'testfont';
            src:  url(data:application/x-font-woff;charset=utf-8;base64,...) format('woff');
            font-weight: normal;
            font-style: normal;
        }

使用:

font-family: 'testfont';

@@ 因为我使用的是剃刀视图。将生成的 HTML 保存到文件时,它看起来很好,并且在浏览器 (chrome) 中打开时工作正常。

生成 PDF:

var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
return htmlToPdf.GeneratePdf(html);

我还从 font-family 声明中删除了备用字体。 我尝试了与 wkhtmltopdf 不同的版本,但没有运气。 生成器可以很好地处理来自本地主机的图像。

在我的 Windows 机器上运行相同的 asp.net 应用程序时,字体可以正常工作。

NReco 文档说“避免使用自定义字体”(在 azure web 应用程序环境中),这是否意味着没有机会让它运行?为什么不支持自定义字体?有什么解决办法吗?

感谢您的帮助。

【问题讨论】:

  • 你试过在本地运行 wkhtmltopdf 吗?我以这种方式注册字体src: url("../fonts/open-sans.ttf") format("truetype");,它对我有用
  • 本地是什么意思?在我的 PC 本地 ASP.net 应用程序运行良好。
  • 您是否在 azure 中将您的应用程序作为 webapp 运行?你也使用 nreco 包装器吗?
  • 在您的 PC 中运行 wkhtmltopdf.exe,也许您认为它是 azure 或 nreco 而不是这样。
  • wkhtmltopdf 本身运行良好,它会生成我的 PDF,但在 azure 中运行时没有自定义字体。您的工具是否使用 nreco 在 azure 中运行并且字体已渲染?

标签: asp.net font-face wkhtmltopdf azure-web-app-service nreco


【解决方案1】:

这是已知问题:Azure 应用托管环境限制了一些 GDI API,因此 wkhtmltopdf 无法加载(和呈现)自定义字体。只能使用默认情况下存在于 Windows 上的标准字体(如 Arial、Times New Roman 等)。您可以就此主题联系 Azure 支持 - 他们可以提供有关 Azure 应用沙盒限制的更多详细信息。

【讨论】:

  • 谢谢。那么为什么这些 GDI API 限制会影响自定义字体而不是默认字体呢? azure web 应用程序环境中是否有可用字体列表?我找不到。
  • @cyptus wkhtmltopdf 无法加载外部字体文件,因为 Azure Apps 沙箱不允许(至少目前如此)并且它回退到已经存在的字体。我想所有通常出现在 Windows Server 上的字体都可以使用。
  • 虽然 azure 应用程序沙盒会阻止外部字体加载,但不能有任何其他可以呈现自定义字体的包装器(如 rotativa 或 sql 报告框架),对吧?
  • 所有基于 WebKit/Qt 的解决方案(wkhtmltopdf、phantomjs)都使用相同的 HTML 渲染引擎,并且限制也相同。我不知道 SQL 报告框架如何生成 PDF,可能他们使用了另一种方法。我希望 Azure 团队将来更改沙盒设置以允许使用自定义字体。
  • 谢谢 - 这似乎是可用字体的有效列表:microsoft.com/typography/fonts/product.aspx?PID=160
【解决方案2】:

为什么不支持自定义字体?有什么解决办法吗?

根据 Azure official document,我们可以知道目前 Azure WebApp 不支持 NReco (uses wkhtmltopdf)。以下是文档中的sn-p。

从 HTML 生成 PDF

有多个库用于将 HTML 转换为 PDF。许多 Windows/.NET 特定版本利用 IE API,因此广泛利用 User32/GDI32。这些 API 在沙盒中大部分被阻止(无论计划如何),因此这些框架在沙盒中不起作用。

有些框架没有广泛利用 User32/GDI32(例如wkhtmltopdf),我们正在努力在 Basic+ 中启用这些,就像启用 SQL 报告一样。

不支持的框架

这里列出了由于上述一项或多项限制而被发现无法使用的框架和场景。可以想象,随着沙盒的发展,将来会支持一些。

PDF 生成器因上述限制而失败:

  • 同步融合
  • 西伯利亚
  • NReco(使用 wkhtmltopdf)
  • Spire.PDF

如果 Nreco 不是唯一的选择。请尝试使用以下方式:

支持以下 PDF 生成器:

  • SQL 报告框架:要求站点在 Basic 或更高版本中运行(并不是说目前这不适用于 Functions 应用程序)

  • EVOPDF:有关供应商解决方案,请参阅 http://www.evopdf.com/azure-html-to-pdf-converter.aspx

  • Telerik 报告:要求网站以 Basic 或更高版本运行。

  • Rotativa / wkhtmltopdf:要求网站以 Basic 或更高版本运行。

【讨论】:

  • 谢谢 - 如何在不支持 nreco(基于 wkhtmltopdf)的情况下支持 rotativa(基于 wkhtmltopdf)?这两个不是“只是”.net 包装器吗?
  • Tom,这绝对是“不准确”的官方文件(2015 年 5 月最后一次编辑——实际上已经过时了);所有基于 wkhtmltopdf 的 HTML 到 PDF 组件的工作方式相同(并且具有相同的自定义字体使用限制)。我不知道为什么 NReco 包装器被放入“不支持”列表中。
  • Rotativa 在 Azure 应用服务的基本计划中也不能使用自定义字体。笼统地说它有效是不正确的。有限制,例如不使用主机上未安装的字体。
【解决方案3】:

要克服 azure Web 应用沙箱限制(自定义字体呈现),您可以使用应用服务中的 Windows 容器来应用自定义字体: https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-windows-containers-custom-fonts

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2013-10-02
    • 2011-04-23
    相关资源
    最近更新 更多