如何在 Azure 上使用 .NET 运行 HTML 转 PDF?

This article was translated from English: Does it need improvement?
Translated
View the article in English

可以。IronPDF 可用于在 Azure 上生成、处理和读取 PDF 文档。IronPDF 已在多个 Azure 平台上进行了全面测试,包括 MVC 网站、Azure 函数等。

Docker 上的 Azure 函数

如果您在 Docker 容器中运行 Azure Functions,请参阅 本教程 而不是


教程

设置项目

安装 IronPDF 开始使用

第一步是使用 NuGet 安装 IronPDF:

Install-Package IronPdf

或者,使用 直接下载 link.

选择正确的 Azure 选项

选择正确的托管级别 Azure 层级

Azure 基本 B1 是满足最终用户渲染需求的最低托管级别。如果要创建高吞吐量系统,可能需要升级。

在继续之前
如果未选择应用程序服务计划的计划类型,可能导致 IronPdf 无法呈现 PDF 文档。

选择正确的托管级别 Azure 层级

"从软件包文件运行 "复选框

发布 Azure Functions 应用程序时,请确保 "从软件包文件运行 "未被选中。

.NET 6 配置

微软最近从 .NET 6+ 中移除了图像库,从而破坏了许多传统的 API。因此,有必要对项目进行配置,使其仍允许调用这些传统 API。

  1. 在 Linux 上,设置 Installation.LinuxAndDockerDependenciesAutoConfig=真; 以确保 libgdiplus 安装在机器上

  2. 将以下内容添加到 .NET 6 项目的 .csproj 文件中:......。<GenerateRuntimeConfigurationFiles>真</GenerateRuntimeConfigurationFiles>

  3. 在你的项目中创建一个名为 runtimeconfig.template.json 的文件,并填充以下内容:
{
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
}
{
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
}
If True Then
	  "configProperties":
	  If True Then
		 "System.Drawing.EnableUnixSupport": True
	  End If
End If
VB   C#
  1. 最后,在程序开头添加以下一行:System.AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true);`

在 Azure 上使用 Docker

在 Azure 上获得控制、SVG 字体访问和性能控制能力的一种方法是在 Docker 容器中使用 IronPDF 应用程序和函数。

我们有一个全面的 IronPDF Azure Docker 教程 Linux 和 Windows 实例,推荐阅读。

Azure 函数代码示例

此示例将自动向内置 Azure 日志记录器输出日志条目 (见 ILogger log):

[FunctionName("PrintPdf")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
{
    log.LogInformation("Entered PrintPdf API function...");
    // Apply license key
    IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01";
    // Enable log
    IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom;
    IronPdf.Logging.Logger.CustomLogger = log;

    IronPdf.Logging.Logger.EnableDebugging = false;
    // Configure IronPdf
    Installation.LinuxAndDockerDependenciesAutoConfig = false;
    Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
    try
    {
        log.LogInformation("About to render pdf...");
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        // Render PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.google.com/");
        log.LogInformation("finished rendering pdf...");
        return new FileContentResult(pdf.BinaryData, "application/pdf") { FileDownloadName = "google.pdf" };
    }
    catch (Exception e)
    {
        log.LogError(e, "Error while rendering pdf", e);
    }

    return new OkObjectResult("OK");
}
[FunctionName("PrintPdf")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
{
    log.LogInformation("Entered PrintPdf API function...");
    // Apply license key
    IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01";
    // Enable log
    IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom;
    IronPdf.Logging.Logger.CustomLogger = log;

    IronPdf.Logging.Logger.EnableDebugging = false;
    // Configure IronPdf
    Installation.LinuxAndDockerDependenciesAutoConfig = false;
    Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
    try
    {
        log.LogInformation("About to render pdf...");
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        // Render PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.google.com/");
        log.LogInformation("finished rendering pdf...");
        return new FileContentResult(pdf.BinaryData, "application/pdf") { FileDownloadName = "google.pdf" };
    }
    catch (Exception e)
    {
        log.LogError(e, "Error while rendering pdf", e);
    }

    return new OkObjectResult("OK");
}
<FunctionName("PrintPdf")>
Public Shared Async Function Run(<HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route := Nothing)> ByVal req As HttpRequest, ByVal log As ILogger, ByVal context As ExecutionContext) As Task(Of IActionResult)
	log.LogInformation("Entered PrintPdf API function...")
	' Apply license key
	IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01"
	' Enable log
	IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom
	IronPdf.Logging.Logger.CustomLogger = log

	IronPdf.Logging.Logger.EnableDebugging = False
	' Configure IronPdf
	Installation.LinuxAndDockerDependenciesAutoConfig = False
	Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
	Try
		log.LogInformation("About to render pdf...")
		Dim renderer As New ChromePdfRenderer()
		' Render PDF
		Dim pdf = renderer.RenderUrlAsPdf("https://www.google.com/")
		log.LogInformation("finished rendering pdf...")
		Return New FileContentResult(pdf.BinaryData, "application/pdf") With {.FileDownloadName = "google.pdf"}
	Catch e As Exception
		log.LogError(e, "Error while rendering pdf", e)
	End Try

	Return New OkObjectResult("OK")
End Function
VB   C#

已知问题

共享托管计划不提供 SVG 字体渲染功能

我们发现的一个限制是 Azure 托管平台 不支持服务器在其廉价的共享网络应用层中加载 SVG 字体(如 Google 字体)。这是因为出于安全考虑,这些共享主机平台不允许访问 Windows GDI+ 图形对象。

我们建议使用 Windows 或 Linux Docker 容器 或 Azure 上的 VPS,以解决需要最佳字体渲染的问题。

Azure 免费层托管速度慢

Azure 免费层和共享层以及消费计划不适合 PDF 渲染。我们推荐 Azure B1 托管/高级计划,这也是我们自己使用的计划。对于任何计算机而言,"HTML 到 PDF "的过程都是一项重要的 "工作"--类似于在自己的计算机上打开和渲染网页。 使用的是真正的浏览器引擎,因此我们需要进行相应的配置,并期望渲染时间与功率相近的台式机类似。

创建工程支持请求票单

要创建申请单,请参阅 "创建工程支持申请单"。如何提出IronPDF的工程支持请求'指南