跳過到頁腳內容
使用IRONPDF

如何使用Azure和IronPDF將HTML轉換為PDF

介紹

在雲端環境中將 HTML 內容轉換為 PDF 文件可能比想像中更具挑戰性。 如果您曾經嘗試將 PDF 生成器部署到 Azure Functions,那麼您無疑會遇到與 GDI+ 或沙盒限制相關的神秘錯誤,我知道我遇到過! 好消息是什麼? 使用IronPDF和適當的設置,任何 HTML 內容都可以轉換為像素級完美的 PDF 檔案。

本文將向您展示如何使用 IronPDF 在 Azure Functions 中部署可用於生產的 HTML 到 PDF 轉換器。 在探索 Azure 的特定環境限制的過程中,您將學習如何處理從簡單的 HTML 字串到包含大量 JavaScript 的網頁等各種內容。 無論你是製作簡單的發票還是複雜的報告,都無關緊要。 讀完本文,您將掌握使用 IronPDF 和 Azure 將 HTML 轉換為 PDF 的技巧。

!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101 01000101111101010011010101000100000101010010010101000100010101000100010111110101011101001000110 1010101000100100001011111010100000101001001001111010001000101010101010000110101010100101010101011 10101010001010010010010010010000010100110001011111010000100100110001001111101000011010010111111010000110100101110--

為什麼在 Azure 中將 HTML 轉換為 PDF 具有挑戰性?

在開始將 HTML 轉換為 PDF 之前,讓我們花點時間了解為什麼在 Azure 中執行此任務可能具有挑戰性。 Azure 的無伺服器和應用程式服務運行在安全沙箱中,限制了傳統 PDF 程式庫所依賴的某些操作。 其中一些限制包括:

  • GDI+ 存取受限: Azure 的低階服務中會阻止 Windows 圖形裝置介面 (GDI+) 呼叫。 *字體渲染限制:*自訂字體和 SVG 字體可能會受到限制。 記憶體限制:** HTML 轉 PDF 需要大量資源。 *進程隔離:執行用於渲染的瀏覽器引擎需要特殊權限。

Azure 的隨選付費方案和免費/共用層級對這些限制的執行最為嚴格。 因此,要成功將 HTML 轉換為 PDF,至少需要 Azure 基本 B1 層或進階訂閱。 這些權限和資源為 IronPDF 的 Chrome 渲染引擎正常運作提供了必要的權限和資源。 有關 Azure 託管層及其在 PDF 渲染方面的效能的更多信息,請參閱IronPDF 的 Azure 部署指南

Azure 部署選項

部署方面,您有三種選擇(Windows、Linux 或容器)。 雖然 Azure 函數應用程式容器是建議的方法,但您也可以輕鬆使用這些選項中的任何一個來部署您的應用程式。

今天,我們將重點介紹容器化方案,它提供了一個隔離的環境,配置過程極其簡便,並且與 IronPDF 的渲染引擎具有更高的兼容性。對於 Azure 政府雲端或 Azure 中國等專用環境,同樣的原則也適用。 但是,您需要相應地調整部署端點。

為什麼 IronPDF 在 Azure 中能夠出色地完成 HTML 轉 PDF 任務?

IronPDF 是一個強大的 .NET 函式庫,由於使用了 Chrome 渲染引擎,它在 Azure 中以強大的 HTML 轉 PDF 轉換功能而脫穎而出。它不僅僅是一個基本的 HTML 解析器; 它採用的是與Google瀏覽器相同的技術。 這樣可以確保您的 PDF 文件在現代瀏覽器中顯示的效果與在現代瀏覽器中完全一致。

Chrome渲染引擎的優勢

Chrome 引擎為 HTML 轉 PDF 帶來了多項關鍵優勢,包括:

*完全支援 CSS3: IronPDF 的渲染引擎對現代 CSS 樣式提供了強大的支援。

  • JavaScript 執行:完全支援動態 JavaScript 渲染。
  • Web 字體渲染: Google 字體和自訂字體顯示正確(透過正確的層級選擇)。 *現代 Web 標準:支援 HTML5 元素、SVG 圖形和 Canvas 元素

這意味著您可以將任何現代網頁(包括 Bootstrap 樣式、JavaScript 框架或複雜的視覺效果)轉換為 PDF 格式,而無需擔心相容性問題。 IronPDF 可以輕鬆處理在 Azure 受限環境中執行無頭 Chrome 執行個體的繁重工作。 如果您想了解更多關於IronPDF 的 Chrome 渲染功能以及它如何實現像素級完美 PDF 渲染的資訊

如何設定 Microsoft Azure 環境以將 HTML 轉換為 PDF?

讓我們一起來看看如何使用 IronPDF 設定一個針對 HTML 到 PDF 轉換進行最佳化的 Azure 函數應用程式。

先決條件

在開始之前,請確保您已準備好:

  • 一個有效的 Azure 訂閱
  • Visual Studio 2022 或 Visual Studio Code
  • .NET 6.0 SDK 或更高版本(可從微軟下載
  • Azure Functions 核心工具(安裝指南

有關 Azure Functions 中 PDF 產生的完整設定說明,請參閱IronPDF 的 Azure Functions 教學

建立 Azure 函數應用

  1. 在 Web 介面中導覽至 Azure 門戶,然後按一下"建立資源"。
  2. 搜尋"函數應用程式",然後點擊"建立"。
  3. 配置基本功能:

    1.選擇主機方案:選擇最符合您需求的主機方案。 2.訂閱:選擇您的 Azure 訂閱 3.資源組:建立新資源組或選擇現有資源組 4.功能應用程式名稱:選擇獨一無二的名稱 5.發布:選擇"容器" 6.地區:選擇您偏好的地點

  4. 配置主機方案:

    1. 在 Azure 應用程式服務計劃下,按一下"建立新計劃"。 2.定價級別:選擇至少 B1(基礎)或更高級別
  5. 請注意:免費、分享和按需付費方案不適用於 PDF 渲染。
  6. 審核並建立您的函數應用

在您的專案中安裝 IronPDF

首先,您需要在 Visual Studio 中建立一個新的 Azure Functions 專案(或載入一個現有專案),然後新增 IronPDF 套件:

Install-Package IronPdf  #For Windows Deployment
Install-Package IronPdf.Linux  #For Docker Container deployment (recommended)

有關詳細的安裝說明,包括 NuGet 套件配置和特定於平台的注意事項(例如在您的桌面應用程式中),請造訪IronPDF 安裝指南

基本配置設定

配置函數套用的 .cs 文件,以獲得最佳的 HTML 到 PDF 轉換效果:

using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
public class HtmlToPdfFunction
{
    private readonly ILogger _logger;
    public HtmlToPdfFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<HtmlToPdfFunction>();
        // Configure IronPDF for Azure
        ConfigureIronPdf();
    }
    private void ConfigureIronPdf()
    {
        // Set your license key (get a trial key from https://ironpdf.com/licensing/)
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        // Essential Azure configurations
        IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
        IronPdf.Installation.CustomDeploymentDirectory = "/tmp";
        // Optional: Enable logging for troubleshooting
        IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
    }
}
using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
public class HtmlToPdfFunction
{
    private readonly ILogger _logger;
    public HtmlToPdfFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<HtmlToPdfFunction>();
        // Configure IronPDF for Azure
        ConfigureIronPdf();
    }
    private void ConfigureIronPdf()
    {
        // Set your license key (get a trial key from https://ironpdf.com/licensing/)
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        // Essential Azure configurations
        IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
        IronPdf.Installation.CustomDeploymentDirectory = "/tmp";
        // Optional: Enable logging for troubleshooting
        IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

如何將HTML字串轉換為PDF?

我們先從最常見的場景開始:將 HTML 字串直接轉換為 PDF。 這種方法適用於動態產生的內容,例如發票、報表或確認電子郵件。

基本 HTML 字串轉換

[Function("ConvertHtmlToPdf")]
public async Task<HttpResponseData> ConvertHtmlToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    _logger.LogInformation("Starting HTML to PDF conversion");
    try
    {
        // Simple HTML invoice example
        string htmlContent = @"
            <!DOCTYPE html>
            <html>
            <head>
                <meta charset='UTF-8'>
                <style>
                    body { font-family: Arial, sans-serif; margin: 40px; }
                    .header { color: #333; border-bottom: 2px solid #0066cc; }
                    .invoice-details { margin: 20px 0; }
                    table { width: 100%; border-collapse: collapse; }
                    th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
                    .total { font-weight: bold; font-size: 1.2em; }
                </style>
            </head>
            <body>
                <div class='header'>
                    <h1>Invoice #12345</h1>
                    <p>Date: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
                </div>
                <div class='invoice-details'>
                    <table>
                        <tr>
                            <th>Item</th>
                            <th>Quantity</th>
                            <th>Price</th>
                        </tr>
                        <tr>
                            <td>Professional Services</td>
                            <td>10 hours</td>
                            <td>$1,000.00</td>
                        </tr>
                        <tr>
                            <td colspan='2' class='total'>Total</td>
                            <td class='total'>$1,000.00</td>
                        </tr>
                    </table>
                </div>
            </body>
            </html>";
        // Create Chrome renderer
        var renderer = new ChromePdfRenderer();
        // Configure rendering options
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;
        // Convert HTML to PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Return PDF as response
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition", "attachment; filename=invoice.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        _logger.LogInformation("PDF generated successfully");
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error generating PDF");
        var errorResponse = req.CreateResponse(HttpStatusCode.InternalServerError);
        await errorResponse.WriteStringAsync($"Error: {ex.Message}");
        return errorResponse;
    }
}
[Function("ConvertHtmlToPdf")]
public async Task<HttpResponseData> ConvertHtmlToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    _logger.LogInformation("Starting HTML to PDF conversion");
    try
    {
        // Simple HTML invoice example
        string htmlContent = @"
            <!DOCTYPE html>
            <html>
            <head>
                <meta charset='UTF-8'>
                <style>
                    body { font-family: Arial, sans-serif; margin: 40px; }
                    .header { color: #333; border-bottom: 2px solid #0066cc; }
                    .invoice-details { margin: 20px 0; }
                    table { width: 100%; border-collapse: collapse; }
                    th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
                    .total { font-weight: bold; font-size: 1.2em; }
                </style>
            </head>
            <body>
                <div class='header'>
                    <h1>Invoice #12345</h1>
                    <p>Date: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
                </div>
                <div class='invoice-details'>
                    <table>
                        <tr>
                            <th>Item</th>
                            <th>Quantity</th>
                            <th>Price</th>
                        </tr>
                        <tr>
                            <td>Professional Services</td>
                            <td>10 hours</td>
                            <td>$1,000.00</td>
                        </tr>
                        <tr>
                            <td colspan='2' class='total'>Total</td>
                            <td class='total'>$1,000.00</td>
                        </tr>
                    </table>
                </div>
            </body>
            </html>";
        // Create Chrome renderer
        var renderer = new ChromePdfRenderer();
        // Configure rendering options
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;
        // Convert HTML to PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Return PDF as response
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition", "attachment; filename=invoice.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        _logger.LogInformation("PDF generated successfully");
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error generating PDF");
        var errorResponse = req.CreateResponse(HttpStatusCode.InternalServerError);
        await errorResponse.WriteStringAsync($"Error: {ex.Message}");
        return errorResponse;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這將獲取給定的 HTML 字串,並將其渲染成高品質的 PDF 文檔,同時應用我們使用 RenderingOptions 類別設定的自訂渲染選項。

PDF 輸出。

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 3 - 基本 HTML 字串輸出 PDF

將 URL 轉換為 PDF

對於現有的網頁或複雜的應用程序,您可以直接轉換 URL。

[Function("ConvertUrlToPdf")]
public async Task<HttpResponseData> ConvertUrlToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var requestBody = await req.ReadAsStringAsync();
    var urlRequest = JsonSerializer.Deserialize<UrlRequest>(requestBody);
    try
    {
        var renderer = new ChromePdfRenderer();
        // Configure for web page rendering
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
        // Enable JavaScript execution (important for dynamic content)
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS to execute
        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf(urlRequest.Url);
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error converting URL to PDF");
        throw;
    }
}
public class UrlRequest
{
    public string Url { get; set; }
}
[Function("ConvertUrlToPdf")]
public async Task<HttpResponseData> ConvertUrlToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var requestBody = await req.ReadAsStringAsync();
    var urlRequest = JsonSerializer.Deserialize<UrlRequest>(requestBody);
    try
    {
        var renderer = new ChromePdfRenderer();
        // Configure for web page rendering
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
        // Enable JavaScript execution (important for dynamic content)
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS to execute
        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf(urlRequest.Url);
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error converting URL to PDF");
        throw;
    }
}
public class UrlRequest
{
    public string Url { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

URL 輸出

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 4 - PDF 輸出 URL

如何使用 JavaScript 處理複雜的 HTML 內容

現代Web應用程式嚴重依賴JavaScript來渲染內容。 無論是圖表、動態表單還是單頁應用程序,IronPDF 的渲染引擎都能輕鬆應付。

處理大量使用 JavaScript 的內容

在這個範例中,我們將使用包含 JavaScript 內容的 HTML 檔案將其轉換為 PDF 檔案。

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 5 - 複雜的 HTML 文件

[Function("ConvertComplexHtmlToPdf")]
public async Task<HttpResponseData> ConvertComplexHtmlToPdf(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
FunctionContext executionContext)
{
    try
    {
        // Load complex HTML from file
        // [USER TO PROVIDE: complex-dashboard.html with charts and JavaScript]
        string complexHtml = File.ReadAllText("Templates/complex-dashboard.html");
        var renderer = new ChromePdfRenderer();
        // JavaScript-specific configurations
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.WaitFor.JavaScript(3000); // Wait 3 seconds for JS
        // Optional: Set the CSS media type for print or screen styles
        renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
        // Set viewport for responsive designs
        renderer.RenderingOptions.ViewPortWidth = 1920;
        renderer.RenderingOptions.ViewPortHeight = 1080;
        var pdf = renderer.RenderHtmlAsPdf(complexHtml);
        // Add metadata
        pdf.MetaData.Author = "Azure Function";
        pdf.MetaData.CreationDate = DateTime.Now;
        pdf.MetaData.Title = "Complex Dashboard Report";
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error with complex HTML conversion");
        throw;
    }
}
[Function("ConvertComplexHtmlToPdf")]
public async Task<HttpResponseData> ConvertComplexHtmlToPdf(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
FunctionContext executionContext)
{
    try
    {
        // Load complex HTML from file
        // [USER TO PROVIDE: complex-dashboard.html with charts and JavaScript]
        string complexHtml = File.ReadAllText("Templates/complex-dashboard.html");
        var renderer = new ChromePdfRenderer();
        // JavaScript-specific configurations
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.WaitFor.JavaScript(3000); // Wait 3 seconds for JS
        // Optional: Set the CSS media type for print or screen styles
        renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
        // Set viewport for responsive designs
        renderer.RenderingOptions.ViewPortWidth = 1920;
        renderer.RenderingOptions.ViewPortHeight = 1080;
        var pdf = renderer.RenderHtmlAsPdf(complexHtml);
        // Add metadata
        pdf.MetaData.Author = "Azure Function";
        pdf.MetaData.CreationDate = DateTime.Now;
        pdf.MetaData.Title = "Complex Dashboard Report";
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error with complex HTML conversion");
        throw;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

JavaScript PDF 檔案輸出

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 6 - 從複雜的 JavaScript HTML 內容輸出 PDF

處理圖表和數據視覺化

現在,讓我們使用這個包含圖表的 HTML 檔案進行轉換。

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 7 - 輸入 HTML 圖表文件

[Function("ConvertChartToPdf")]
    public async Task<HttpResponseData> ConvertChartToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
    {
        try
        {
            // Load chart template
            string chartHtml = File.ReadAllText("Templates/chart-template.html");
            // Replace placeholders with actual data
            var chartData = await GetChartDataAsync();
            chartHtml = chartHtml.Replace("{{CHART_DATA}}", JsonSerializer.Serialize(chartData));
            var renderer = new ChromePdfRenderer();
            // Ensure charts render completely
            renderer.RenderingOptions.EnableJavaScript = true;
            renderer.RenderingOptions.WaitFor.RenderDelay(2000);
            // Set paper orientation for charts
            renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
            var pdf = renderer.RenderHtmlAsPdf(chartHtml);
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.Body.WriteAsync(pdf.BinaryData);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Chart conversion error");
            throw;
        }
    }
[Function("ConvertChartToPdf")]
    public async Task<HttpResponseData> ConvertChartToPdf(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
    {
        try
        {
            // Load chart template
            string chartHtml = File.ReadAllText("Templates/chart-template.html");
            // Replace placeholders with actual data
            var chartData = await GetChartDataAsync();
            chartHtml = chartHtml.Replace("{{CHART_DATA}}", JsonSerializer.Serialize(chartData));
            var renderer = new ChromePdfRenderer();
            // Ensure charts render completely
            renderer.RenderingOptions.EnableJavaScript = true;
            renderer.RenderingOptions.WaitFor.RenderDelay(2000);
            // Set paper orientation for charts
            renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
            var pdf = renderer.RenderHtmlAsPdf(chartHtml);
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.Body.WriteAsync(pdf.BinaryData);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Chart conversion error");
            throw;
        }
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF 輸出。

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 8 - PDF 圖表輸出

IronPDF 能夠在最終的 PDF 輸出中保持原有的 JavaScript 互動性。

如何新增HTML頁首和頁尾?

專業PDF文件通常要求所有頁面都使用一致的頁首和頁尾。 IronPDF 透過基於 HTML 的模板簡化了這個過程,提供了更高級的頁首和頁尾選項。

建立動態頁首和頁尾

[Function("ConvertWithHeaderFooter")]
public async Task<HttpResponseData> ConvertWithHeaderFooter(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    try
    {
        string mainContent = @"
            <html>
            <body>
                <h1>Annual Report 2024</h1>
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
                <!-- Your main content here -->
            </body>
            </html>";
        var renderer = new ChromePdfRenderer();
        // Configure margins to accommodate headers/footers
        renderer.RenderingOptions.MarginTop = 45;
        renderer.RenderingOptions.MarginBottom = 45;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;
        // HTML Header with merge fields
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 35,
            HtmlFragment = @"
                <div style='text-align: center; font-size: 12px; padding: 10px;'>
                    <div style='float: left;'>Annual Report 2024</div>
                    <div style='float: right;'>Page {page} of {total-pages}</div>
                    <div style='clear: both;'></div>
                </div>",
            DrawDividerLine = true
        };
        // HTML Footer
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            Height = 30,
            HtmlFragment = @"
                <div style='text-align: center; font-size: 10px; padding: 5px;'>
                    <div>Generated on {date} at {time}</div>
                    <div>© 2024 Your Company. All rights reserved.</div>
                </div>",
            DrawDividerLine = true
        };
        var pdf = renderer.RenderHtmlAsPdf(mainContent);
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Header/Footer conversion error");
        throw;
    }
}
[Function("ConvertWithHeaderFooter")]
public async Task<HttpResponseData> ConvertWithHeaderFooter(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    try
    {
        string mainContent = @"
            <html>
            <body>
                <h1>Annual Report 2024</h1>
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
                <!-- Your main content here -->
            </body>
            </html>";
        var renderer = new ChromePdfRenderer();
        // Configure margins to accommodate headers/footers
        renderer.RenderingOptions.MarginTop = 45;
        renderer.RenderingOptions.MarginBottom = 45;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;
        // HTML Header with merge fields
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 35,
            HtmlFragment = @"
                <div style='text-align: center; font-size: 12px; padding: 10px;'>
                    <div style='float: left;'>Annual Report 2024</div>
                    <div style='float: right;'>Page {page} of {total-pages}</div>
                    <div style='clear: both;'></div>
                </div>",
            DrawDividerLine = true
        };
        // HTML Footer
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            Height = 30,
            HtmlFragment = @"
                <div style='text-align: center; font-size: 10px; padding: 5px;'>
                    <div>Generated on {date} at {time}</div>
                    <div>© 2024 Your Company. All rights reserved.</div>
                </div>",
            DrawDividerLine = true
        };
        var pdf = renderer.RenderHtmlAsPdf(mainContent);
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.Body.WriteAsync(pdf.BinaryData);
        return response;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Header/Footer conversion error");
        throw;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF 輸出:附頁首與不帶頁眉

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 9 - 有頁首與不含頁首的 PDF 比較

為不同頁面範圍設定自訂頁眉

public async Task<PdfDocument> CreatePdfWithCustomHeaders(string htmlContent)
{
    var renderer = new ChromePdfRenderer();
    // First page header (cover page)
    renderer.RenderingOptions.FirstPageNumber = 0; // Cover page is page 0
    renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
    {
        Height = 50,
        HtmlFragment = "<div style='text-align: center; font-size: 24px;'>Company Logo</div>",
        DrawDividerLine = false
    };
    // Different header for content pages
    var pdf = renderer.RenderHtmlAsPdf(htmlContent);
    // Apply different headers to specific pages after rendering
    for (int i = 1; i < pdf.PageCount; i++)
    {
        // Add page-specific content if needed
        pdf.StampHtml(i, @"
            <div style='position: absolute; top: 10px; right: 10px; font-size: 10px;'>
                Section " + GetSectionName(i) + @"
            </div>");
    }
    return pdf;
}
private string GetSectionName(int pageNumber)
{
    // Logic to determine section based on page number
    return pageNumber <= 5 ? "Introduction" : "Main Content";
}
public async Task<PdfDocument> CreatePdfWithCustomHeaders(string htmlContent)
{
    var renderer = new ChromePdfRenderer();
    // First page header (cover page)
    renderer.RenderingOptions.FirstPageNumber = 0; // Cover page is page 0
    renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
    {
        Height = 50,
        HtmlFragment = "<div style='text-align: center; font-size: 24px;'>Company Logo</div>",
        DrawDividerLine = false
    };
    // Different header for content pages
    var pdf = renderer.RenderHtmlAsPdf(htmlContent);
    // Apply different headers to specific pages after rendering
    for (int i = 1; i < pdf.PageCount; i++)
    {
        // Add page-specific content if needed
        pdf.StampHtml(i, @"
            <div style='position: absolute; top: 10px; right: 10px; font-size: 10px;'>
                Section " + GetSectionName(i) + @"
            </div>");
    }
    return pdf;
}
private string GetSectionName(int pageNumber)
{
    // Logic to determine section based on page number
    return pageNumber <= 5 ? "Introduction" : "Main Content";
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這將會將頁首套用至指定範圍的 PDF 頁面。

Azure 中的標準 HTML 轉 PDF 用例

IronPDF 的多功能性使其適用於多種不同的用途:

*發票產生:*將包含動態資料的 HTML 範本轉換為專業發票。 報告產生:將資料視覺化和分析結果轉換為可共享的 PDF 報告。 憑證製作:使用 HTML 範本產生個人化憑證和文憑。 文件匯出:將線上文件或知識庫轉換為離線 PDF。 電子郵件存檔:出於合規性目的,保存格式完整的 HTML 電子郵件。 合約產生:**使用 HTML 範本建立具有法律約束力的文件。 *行銷資料:將網頁設計轉換為可列印的 PDF 文件。

如何處理常見的 Azure 特有問題?

即使配置正確,您也可能會遇到一些 Azure 特有的挑戰。 以下是一些最常見的問題及其解決方案:

字體渲染問題

問題:自訂字體顯示不正確或回退到系統字體。

解決方案: Azure 的共用主機層限制了對 GDI+ 的訪問,而自訂字體需要 GDI+。 請確保您至少使用 B1 級別,並使用 Base64 編碼嵌入字體。

string htmlWithEmbeddedFont = @"
    <style>
        @font-face {
            font-family: 'CustomFont';
            src: url(data:font/woff2;base64,YOUR_BASE64_FONT_HERE) format('woff2');
        }
        body { font-family: 'CustomFont', Arial, sans-serif; }
    </style>";
string htmlWithEmbeddedFont = @"
    <style>
        @font-face {
            font-family: 'CustomFont';
            src: url(data:font/woff2;base64,YOUR_BASE64_FONT_HERE) format('woff2');
        }
        body { font-family: 'CustomFont', Arial, sans-serif; }
    </style>";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

如果字體問題持續存在,請參閱IronPDF 的字體故障排除指南

"從套件檔案運行"設定錯誤

問題:啟用"從套件檔案執行"時,IronPDF 無法載入相依性。

解決方案:此選項會建立一個唯讀環境,阻止 IronPDF 提取必要的檔案。 您可以在發佈設定中停用此選項,或使用 IronPdf.Slim 套件,該套件能更好地處理這種情況。

記憶體和超時問題

問題:大型 HTML 文件導致逾時或記憶體異常。

解決方案:配置適當的逾時和記憶體設定:

// In your Function App configuration
renderer.RenderingOptions.Timeout = 120000; // 2 minutes
renderer.RenderingOptions.RequestContext = new RequestContext
{
    MaxResponseContentBufferSize = 100  1024  1024 // 100MB
};
// In your Function App configuration
renderer.RenderingOptions.Timeout = 120000; // 2 minutes
renderer.RenderingOptions.RequestContext = new RequestContext
{
    MaxResponseContentBufferSize = 100  1024  1024 // 100MB
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

有關 Azure Functions 逾時配置的更多信息,請參閱Microsoft 的逾時文件。 許多開發者也在Stack Overflow 的 Azure Functions 標籤下分享了處理大型文件的解決方案。

有關 Azure 中 HTML 到 PDF 轉換的更多故障排除方案,請造訪IronPDF 的 Azure 故障排除文件

效能與優化

根據 HTML 內容的複雜程度和電腦的系統效能,HTML 轉 PDF 轉換可能會佔用系統大量資源。 以下是一些針對 Azure Functions 中 HTML 轉 PDF 任務的關鍵最佳化策略:

動態內容的渲染延遲

在 Azure 中處理包含大量 JavaScript 程式碼的 HTML 轉 PDF 頁面時,請設定適當的渲染延遲:

renderer.RenderingOptions.WaitFor.RenderDelay = 500; // Simple pages
renderer.RenderingOptions.WaitFor.RenderDelay = 2000; // Complex JavaScript
renderer.RenderingOptions.WaitFor.RenderDelay = 500; // Simple pages
renderer.RenderingOptions.WaitFor.RenderDelay = 2000; // Complex JavaScript
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

記憶體管理

對於高容量場景,應妥善處置資源:

using (var renderer = new ChromePdfRenderer())
{
    using (var pdf = renderer.RenderHtmlAsPdf(html))
    {
        // Process PDF
        return pdf.BinaryData;
    }
}
using (var renderer = new ChromePdfRenderer())
{
    using (var pdf = renderer.RenderHtmlAsPdf(html))
    {
        // Process PDF
        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

快取策略

當內容不經常更改時,快取生成的 PDF 文件:

private static readonly MemoryCache _pdfCache = new MemoryCache(new MemoryCacheOptions
{
    SizeLimit = 100 // Limit cache size
});
public async Task<byte[]> GetCachedPdf(string cacheKey, string html)
{
    if (!_pdfCache.TryGetValue(cacheKey, out byte[] cachedPdf))
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        cachedPdf = pdf.BinaryData;
        _pdfCache.Set(cacheKey, cachedPdf, new MemoryCacheEntryOptions
        {
            Size = 1,
            SlidingExpiration = TimeSpan.FromMinutes(10)
        });
    }
    return cachedPdf;
}
private static readonly MemoryCache _pdfCache = new MemoryCache(new MemoryCacheOptions
{
    SizeLimit = 100 // Limit cache size
});
public async Task<byte[]> GetCachedPdf(string cacheKey, string html)
{
    if (!_pdfCache.TryGetValue(cacheKey, out byte[] cachedPdf))
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        cachedPdf = pdf.BinaryData;
        _pdfCache.Set(cacheKey, cachedPdf, new MemoryCacheEntryOptions
        {
            Size = 1,
            SlidingExpiration = TimeSpan.FromMinutes(10)
        });
    }
    return cachedPdf;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

在 Azure 中將 HTML 轉換為 PDF 需要多少費用?

在 Azure 中執行 HTML 轉 PDF 轉換涉及兩個成本部分:

Azure 託管成本

*基礎(B1)層級*:PDF渲染的入門層級,適用於輕量級工作負載 標準 (S1) 層級**:更佳的常規 PDF 產生效能 *進階版 (P1V2) :建議用於高容量或複雜的 PDF 操作

價格因地區而異,並可能隨時變動。請參閱 IronPDF 指南,選擇最適合您的套餐。

IronPDF 授權。

如何使用 Azure 和 IronPDF 將 HTML 轉換為 PDF:圖 10 - IronPDF 許可

IronPDF 許可

IronPDF提供多種許可選項:

*試用許可證* 30 天免費試用 精簡版授權**:單一開發者,單一項目

  • Plus 許可證:適用於擁有多個專案的小型團隊 *專業版授權*:適用於擁有分送權限的大型團隊 無限制授權**:企業級部署

請造訪IronPDF 的許可頁面,以了解詳細的定價和功能比較。

成本最佳化技巧

1.實施快取:減少冗餘的 PDF 生成 2.批次處理:在一次函數執行中處理多個 PDF 文件 3.使用基於佇列的處理:將負載分散到一段時間內,以避免擴展需求。

安全考量

在本指南中,我們重點介紹了 HTML 到 PDF 的轉換,但另一個需要考慮的重要方面是安全性。 處理敏感或機密 PDF 文件時,請務必考慮如何確保 PDF 中的內容安全,防止被惡意竄改。 如果您想了解有關保護 Azure Functions 的更多信息,請參閱:

結論

在 Azure 中將 HTML 轉換為 PDF 並不複雜。 透過 IronPDF 的 Chrome 渲染引擎和正確的 Azure 配置,您可以將任何 HTML 內容轉換為專業的 PDF。

在 Azure 中成功將 HTML 轉換為 PDF 的關鍵要點:

  • 使用 Azure B1 圖層或更高層級可取得可靠的 PDF 渲染效果。
  • 為獲得最佳相容性,請以容器形式部署。
  • 專門針對 Azure 環境配置 IronPDF 設定。
  • 利用 HTML 頁首和頁尾建立專業文件。
  • 使用適當的渲染延遲處理 JavaScript 內容。
  • 對生產工作負載實施快取和最佳化。

IronPDF 不只是一個簡單的 HTML 轉 PDF 轉換器庫。 本文還展示了它的許多其他功能,例如高級 PDF 處理和對 PDF 圖像的支援。 想在 Azure 應用程式以外的其他用途中使用它嗎? IronPDF 可以輕鬆整合到您正在開發的任何應用程式中,包括控制台應用程式和 .NET Core 應用程式。

準備好在 Azure 應用程式中開始將 HTML 轉換為 PDF 了嗎?

立即開始在您的項目中使用 IronPDF 並免費試用。

第一步:
green arrow pointer

立即試用IronPDF 免費試用版,體驗其強大的功能,並開始在 Azure 應用程式中將 HTML 轉換為 PDF!

對於生產環境部署,請探索IronPDF 的授權選項,找到適合您需求的方案。 IronPDF 提供全面的文件、快速回應的支援和持續的更新,為在 Azure Functions 及其他環境中進行可靠的 HTML 到 PDF 轉換提供所需的一切。

常見問題解答

使用 Azure 將 HTML 轉換為 PDF 的目的為何?

使用 Azure 將 HTML 轉換為 PDF,可讓開發人員可靠地產生雲端文件,這對於需要產生和管理文件的應用程式而言至關重要。

IronPDF 如何增強 Azure 上 HTML 到 PDF 的轉換過程?

IronPDF 透過提供強大的功能來增強轉換過程,確保產生高品質的 PDF,包括支援複雜的版面設計和樣式,這對於專業文件的製作至關重要。

是否可以在 Azure 上使用 IronPDF 自動生成 PDF?

是的,IronPDF 可以與 Azure 整合以自動生成 PDF,實現無縫的文件工作流程,並減少在雲環境中的人工干擾。

開發人員使用 IronPDF on Azure 的主要優點是什麼?

主要優點包括可擴充性、高效能,以及處理動態 HTML 內容的能力,讓開發人員更容易管理大量的文件處理工作。

IronPDF 能否在轉換過程中處理複雜的 HTML 佈局?

IronPdf 旨在處理複雜的 HTML 佈局,確保在 PDF 輸出中準確呈現所有元素,這對於保持文件的完整性至關重要。

在 Azure 上部署 IronPDF 有哪些先決條件?

要在 Azure 上部署 IronPDF,您需要有一個有效的 Azure 帳戶、對 Azure 服務的瞭解,以及存取 IronPDF 函式庫以整合您的應用程式。

IronPDF 如何確保基於雲端產生 PDF 的安全性?

IronPDF 透過提供加密的連線和安全的資料處理實務來確保安全性,這對於在 Azure 上產生 PDF 時保護敏感資訊至關重要。

在 Azure 上使用 IronPDF 時,是否可以自訂 PDF 輸出?

是的,IronPDF 為 PDF 輸出提供了廣泛的客製化選項,讓開發人員可以量身打造文件的外觀和功能,以滿足特定需求。

IronPDF 是否支持在 Azure 上将动态网页转换为 PDF?

IronPdf 支援動態網頁的轉換,可擷取即時的資料和內容變更,這對於需要產生最新文件的應用程式特別有用。

在 Azure 中將 HTML 轉換為 PDF 時,IronPDF 是否與 .NET 10 相容?

是 - IronPDF 與 .NET 10 完全相容,可確保所有 HTML-to-PDF 功能都能在 Azure 中順暢運作,並且在支援 .NET 9、8、7、6、Core、Standard 和 Framework 平台的同時,也支援 .NET 10。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。