如何在 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 Functions等等。

Azure Functions 在 Docker 上

如果您在 Docker 容器中运行 Azure Functions,请参考此 Azure Docker Linux 教程instead.


教程

设置项目

安装 IronPDF 以开始使用

首先是通过 NuGet 安装 IronPDF:

Install-Package IronPdf

或者,使用IronPDF Azure 直接下载包link.

选择正确的 Azure 选项

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

Azure Basic B1 是满足我们最终用户渲染需求的最低托管级别。 如果您正在创建一个高吞吐量的系统,可能需要对其进行升级。

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

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

"从包文件运行"复选框

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

取消选中从软件包文件运行选项

针对 .NET 6 的配置

Microsoft最近从.NET 6+中删除了成像库,破坏了许多遗留API。因此,有必要配置您的项目以便仍然允许这些遗留API调用。

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

  2. 将以下内容添加到您的 .NET 6 项目的.csproj 文件中:`

  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);`

使用 Docker 在 Azure 上

使用 IronPDF 应用程序和函数可以通过 Docker 容器来实现控制权,SVG 字体访问和在 Azure 上控制性能的一种方法。

我们拥有全面的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 托管平台概述不支持在其较便宜的共享Web应用层中加载SVG字体(例如Google Fonts)的服务器。 因为出于安全原因,这些共享主机平台不允许访问 Windows GDI+ 图形对象。

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

Azure 免费层托管速度慢

Azure 免费和共享层,以及消费计划,不适合用于 PDF 渲染。 我们推荐使用Azure B1托管/高级计划,这也是我们自己使用的方案。 将HTML转为PDF的过程对任何计算机来说都是一项重要的'工作' - 类似于在自己的机器上打开和渲染网页。使用了真正的浏览器引擎,因此我们需要相应地做好准备,并期望与具有相似性能的桌面机器有相似的渲染时间。

创建工程支持请求工单

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