Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Tworzenie generatora plików PDF w Azure przy użyciu IronPDF (przewodnik po platformie .NET 10)

Tworzenie plików PDF w Azure staje się proste, gdy połączysz profesjonalny silnik renderujący IronPDF z elastyczną infrastrukturą chmury Azure. Ten przewodnik pokazuje, jak zbudować, wdrożyć i dostroić gotowy do produkcji generator plików PDF, który obsługuje wszystko, od konwersji HTML po złożoną obróbkę dokumentów.

Stworzenie niezawodnego generatora plików PDF w chmurze wiąże się z wyjątkowymi wyzwaniami. Biorąc pod uwagę ograniczenia piaskownicy, ograniczenia pamięci oraz złożoność systemów rozproszonych, wielu programistów ma trudności ze znalezieniem rozwiązania gotowego do wdrożenia w środowisku produkcyjnym. Właśnie w tym zakresie Azure i IronPDF doskonale się uzupełniają — IronPDF oferuje profesjonalne generowanie plików PDF, które skaluje się wraz z obciążeniem, zachowując jednocześnie kluczowe funkcje.

Niezależnie od tego, czy generujesz faktury, raporty, czy konwertujesz treści internetowe do formatu PDF, ten przewodnik pokaże Ci, jak zbudować niezawodny generator plików PDF w Azure. Będziesz zajmować się wszystkim, od prostej konwersji HTML po złożoną obróbkę dokumentów, dbając jednocześnie o wydajność i koszty.

Zacznij od bezpłatnej wersji próbnej IronPDF i śledź instrukcje, aby stworzyć swoje rozwiązanie do obsługi plików PDF w chmurze.

Co sprawia, że generator plików PDF w Azure jest dobry?

Nie wszystkie rozwiązania PDF sprawdzają się dobrze w środowiskach chmurowych. Gotowy do użycia generator plików PDF w Azure musi spełniać kluczowe wymagania wykraczające poza podstawowe tworzenie dokumentów. Zrozumienie opcji wdrażania funkcji Azure zapewnia sukces.

Dlaczego wydajność ma znaczenie w generowaniu plików PDF w chmurze?

Wydajność i skalowalność decydują o sukcesie Twojego rozwiązania. Generator musi obsługiwać równoczesne żądania bez wąskich gardeł, automatycznie skalować się w okresach szczytowego obciążenia oraz utrzymywać stały czas odpowiedzi w przypadku złożonych dokumentów. Wybierz bibliotekę stworzoną dla środowisk chmurowych, która rozumie niuanse architektury bezserwerowej.

Jakie ograniczenia związane z platformą Azure należy wziąć pod uwagę?

Platforma Azure wymaga uwzględnienia konkretnych kwestii. Środowisko testowe Usługa aplikacji ogranicza interfejsy API Win32/grafiki — biblioteki korzystające ze stosów graficznych dla komputerów stacjonarnych mogą nie działać. Ograniczenia pamięci w planach taryfowych powodują awarie w przypadku większych dokumentów. Rozproszony charakter wymaga wydajnych operacji bezstanowych. Aby uzyskać szczegółowe informacje na temat rozwiązywania problemów związanych z wdrażaniem platformy Azure, zapoznaj się z pełną dokumentacją dotyczącą rozwiązywania problemów.

Które funkcje dla Enterprise są niezbędne?

Aplikacje Enterprise wymagają czegoś więcej niż tylko konwersji HTML. Niewoczesne generatory plików PDF muszą obsługiwać renderowanie JavaScript, radzić sobie ze złożonymi arkuszami CSS oraz oferować funkcje bezpieczeństwa, takie jak szyfrowanie i podpisy cyfrowe. IronPDF rozwiązuje te problemy dzięki silnikowi renderowania opartemu na przeglądarce Chrome, dzięki czemu doskonale nadaje się do wdrożenia w środowisku Azure.

Jaka jest różnica między usługami Azure Usługa aplikacjis a Funkcje Azure?

Azure Usługa aplikacjis i Funkcje Azure obsługują aplikacje w chmurze, ale służą różnym celom. Wybór odpowiedniego rozwiązania ma wpływ na architekturę, model kosztów i podejście do wdrożenia.

Jak wybrać usługi Azure Usługa aplikacjis?

Azure Usługa aplikacjis zapewnia w pełni zarządzany hosting aplikacji internetowych, interfejsów API REST oraz backendów mobilnych. Oferuje trwałe zasoby, obsługuje długotrwałe procesy i zawiera wbudowane skalowanie, sloty wdrożeniowe oraz integrację CI/CD. Te cechy sprawiają, że idealnie nadaje się do aplikacji działających w trybie ciągłym.

Jak zdecydować, kiedy Funkcje Azure jest lepszym wyborem?

Funkcje Azure zapewnia bezserwerowe przetwarzanie danych dla zadań krótkotrwałych, sterowanych zdarzeniami. Funkcje uruchamiają się tylko po wywołaniu (żądanie HTTP, timer lub kolejka komunikatów), a użytkownik płaci wyłącznie za czas wykonania. Doskonale sprawdzają się w zadaniach w tle, przetwarzaniu danych, skryptach automatyzacji i mikrousługach bez konieczności ciągłego uruchamiania hostów.

Opcje hostingu Azure do generowania plików PDF
Funkcja Usługa aplikacji Funkcje Azure
Model rozliczeniowy Stała opłata miesięczna Za wykonanie
Koszt bezczynności Zawsze rozliczane Zero w stanie spoczynku
Ryzyko związane z zimnym startem Minimalne Tak (plan konsumpcyjny)
Długotrwałe pliki PDF Obsługiwane Obowiązują limity czasowe
Pojemniki niestandardowe Obsługiwane Tylko wersja Premium/Dedykowana

Jak zainstalować IronPDF dla Funkcje Azure?

Konfiguracja IronPDF w Funkcje Azure wymaga wyboru odpowiedniego pakietu. Biblioteka oferuje opcje dla środowisk Windows i Linux. Właściwy dobór pakietów zapewnia optymalną wydajność i pozwala uniknąć problemów z kompatybilnością.

Który pakiet IronPDF należy zainstalować?

W przypadku funkcji Funkcje Azure opartych na systemie Windows należy użyć standardowego pakietu IronPDF dostępnego w serwisie NuGet. W przypadku kontenerów Linux należy użyć IronPdf.Linux z wdrożeniem typu run-from-package, aby przyspieszyć uruchamianie na zimno.

# NuGet Package Manager (Windows / Usługa aplikacji)
Install-Package IronPdf

# .NET CLI (cross-platform)
dotnet add package IronPdf
# NuGet Package Manager (Windows / Usługa aplikacji)
Install-Package IronPdf

# .NET CLI (cross-platform)
dotnet add package IronPdf
SHELL
# Linux / container deployments
Install-Package IronPdf.Linux

# .NET CLI alternative
dotnet add package IronPdf.Linux
# Linux / container deployments
Install-Package IronPdf.Linux

# .NET CLI alternative
dotnet add package IronPdf.Linux
SHELL

Jak skonfigurować IronPDF dla Funkcje Azure?

Oto kompletna funkcja Azure Function obsługująca generowanie plików PDF z odpowiednią konfiguracją dla .NET 10 przy użyciu instrukcji najwyższego poziomu:

using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

// Configure IronPDF once at startup
License.LicenseKey = Environment.GetEnvironmentVariable("IronPdfLicenseKey") ?? string.Empty;
Installation.LinuxAndDockerDependenciesAutoConfig = true;
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
Installation.CustomDeploymentDirectory = "/tmp";

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

host.Run();

// Azure Function class
public class PdfGeneratorFunction
{
    private readonly ILogger _logger;

    public PdfGeneratorFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<PdfGeneratorFunction>();
    }

    [Function("GeneratePdf")]
    public async Task<HttpResponseData> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "generate-pdf")] HttpRequestData req)
    {
        string htmlContent = await req.ReadAsStringAsync() ?? string.Empty;
        var response = req.CreateResponse(HttpStatusCode.OK);

        if (string.IsNullOrWhiteSpace(htmlContent))
        {
            response.StatusCode = HttpStatusCode.BadRequest;
            await response.WriteStringAsync("HTML content is required.");
            return response;
        }

        try
        {
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true
                }
            };

            using var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.WriteBytesAsync(pdf.BinaryData);
            _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF.");
            response.StatusCode = HttpStatusCode.InternalServerError;
            await response.WriteStringAsync($"PDF generation failed: {ex.Message}");
            return response;
        }
    }
}
using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

// Configure IronPDF once at startup
License.LicenseKey = Environment.GetEnvironmentVariable("IronPdfLicenseKey") ?? string.Empty;
Installation.LinuxAndDockerDependenciesAutoConfig = true;
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
Installation.CustomDeploymentDirectory = "/tmp";

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

host.Run();

// Azure Function class
public class PdfGeneratorFunction
{
    private readonly ILogger _logger;

    public PdfGeneratorFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<PdfGeneratorFunction>();
    }

    [Function("GeneratePdf")]
    public async Task<HttpResponseData> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "generate-pdf")] HttpRequestData req)
    {
        string htmlContent = await req.ReadAsStringAsync() ?? string.Empty;
        var response = req.CreateResponse(HttpStatusCode.OK);

        if (string.IsNullOrWhiteSpace(htmlContent))
        {
            response.StatusCode = HttpStatusCode.BadRequest;
            await response.WriteStringAsync("HTML content is required.");
            return response;
        }

        try
        {
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true
                }
            };

            using var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.WriteBytesAsync(pdf.BinaryData);
            _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF.");
            response.StatusCode = HttpStatusCode.InternalServerError;
            await response.WriteStringAsync($"PDF generation failed: {ex.Message}");
            return response;
        }
    }
}
Imports IronPdf
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http
Imports Microsoft.Extensions.Logging
Imports System.Net

' Configure IronPDF once at startup
License.LicenseKey = If(Environment.GetEnvironmentVariable("IronPdfLicenseKey"), String.Empty)
Installation.LinuxAndDockerDependenciesAutoConfig = True
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
Installation.CustomDeploymentDirectory = "/tmp"

Dim host = New HostBuilder() _
    .ConfigureFunctionsWorkerDefaults() _
    .Build()

host.Run()

' Azure Function class
Public Class PdfGeneratorFunction
    Private ReadOnly _logger As ILogger

    Public Sub New(loggerFactory As ILoggerFactory)
        _logger = loggerFactory.CreateLogger(Of PdfGeneratorFunction)()
    End Sub

    <Function("GeneratePdf")>
    Public Async Function Run(
        <HttpTrigger(AuthorizationLevel.Function, "post", Route:="generate-pdf")> req As HttpRequestData) As Task(Of HttpResponseData)

        Dim htmlContent As String = Await req.ReadAsStringAsync() OrElse String.Empty
        Dim response = req.CreateResponse(HttpStatusCode.OK)

        If String.IsNullOrWhiteSpace(htmlContent) Then
            response.StatusCode = HttpStatusCode.BadRequest
            Await response.WriteStringAsync("HTML content is required.")
            Return response
        End If

        Try
            Dim renderer = New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .MarginTop = 10,
                    .MarginBottom = 10,
                    .MarginLeft = 10,
                    .MarginRight = 10,
                    .EnableJavaScript = True
                }
            }

            Using pdf = renderer.RenderHtmlAsPdf(htmlContent)
                response.Headers.Add("Content-Type", "application/pdf")
                Await response.WriteBytesAsync(pdf.BinaryData)
                _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount)
                Return response
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error generating PDF.")
            response.StatusCode = HttpStatusCode.InternalServerError
            Await response.WriteStringAsync($"PDF generation failed: {ex.Message}")
            Return response
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Dlaczego te ustawienia konfiguracyjne są ważne?

Ustawienia konfiguracyjne zapewniają pomyślne wdrożenie w Azure. LinuxAndDockerDependenciesAutoConfig poprawnie konfiguruje zależności Chrome, a wyłączenie trybu GPU zapobiega problemom z renderowaniem bezserwerowym. Ustawienie katalogu wdrożeniowego na /tmp zapewnia dostęp do zapisu w środowiskach Funkcje Azure z ograniczeniami, co jest częstą przyczyną błędów "odmowa dostępu".

Przykładowy plik PDF

Miesięczny raport w formacie PDF wygenerowany przez Azure Function, zawierający wskaźniki sprzedaży, tabelę danych regionalnych oraz najważniejsze informacje o firmie z profesjonalnym zielonym nagłówkiem.

Który poziom hostingu Azure należy wybrać do generowania plików PDF?

Generowanie plików PDF za pomocą IronPDF wymaga większej mocy obliczeniowej i wsparcia graficznego niż lżejsze obciążenia. Zarówno Microsoft, jak i IronPDF zalecają unikanie planów Free, Shared i Consumption ze względu na ograniczenia GDI+, limity współdzielonych zasobów obliczeniowych oraz niewystarczającą ilość pamięci.

Zalecane poziomy Azure dla IronPDF
Poziom Obsługa GDI+ Odpowiednie dla formatu PDF Uwagi
Bezpłatne / Współdzielone Nie Nie Ograniczona piaskownica
Wykorzystanie (funkcje) Ograniczone Ograniczone Obowiązują limity pamięci
Podstawowy / Standardowy Tak Tak Minimalnene wymagania
Premium / Izolowane Tak Tak (najlepiej) Pełny dostęp do funkcji

W przypadku dużych obciążeń warstwy Premium lub Isolated zapewniają dedykowaną moc obliczeniową, integrację z siecią VNET oraz brak opóźnień związanych z uruchamianiem — wszystkie te czynniki bezpośrednio poprawiają przepustowość i niezawodność przetwarzania plików PDF.

Jak zbudować bezserwerowe API PDF za pomocą Funkcje Azure?

Stworzenie bezserwerowego interfejsu API PDF za pomocą Funkcje Azure zapewnia automatyczne skalowanie, rozliczanie zgodnie z rzeczywistym zużyciem oraz minimalne nakłady związane z zarządzaniem infrastrukturą. Poniższa funkcja przyjmuje żądania JSON z opcjonalnymi ustawieniami zabezpieczeń i zwraca strumień bajtów PDF.

Jak zorganizować produkcyjny interfejs API do obsługi plików PDF?

using IronPdf;
using IronPdf.Editing;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using System.Net;
using System.Text.Json;

public class PdfApiFunction
{
    private static readonly ChromePdfRenderer Renderer = new ChromePdfRenderer
    {
        RenderingOptions = new ChromePdfRenderOptions
        {
            PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    };

    [Function("ConvertUrlToPdf")]
    public async Task<HttpResponseData> ConvertUrl(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var body = await req.ReadAsStringAsync() ?? "{}";
        var request = JsonSerializer.Deserialize<ConvertUrlRequest>(body);

        if (string.IsNullOrEmpty(request?.Url))
        {
            var bad = req.CreateResponse(HttpStatusCode.BadRequest);
            await bad.WriteStringAsync("URL is required.");
            return bad;
        }

        using var pdf = Renderer.RenderUrlAsPdf(request.Url);

        if (request.AddWatermark)
        {
            pdf.ApplyWatermark(
                "<h2>CONFIDENTIAL</h2>",
                30,
                VerticalAlignment.Middle,
                HorizontalAlignment.Center);
        }

        if (request.ProtectWithPassword && !string.IsNullOrEmpty(request.Password))
        {
            pdf.SecuritySettings.UserPassword = request.Password;
            pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        }

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.WriteBytesAsync(pdf.BinaryData);
        return response;
    }
}

public class ConvertUrlRequest
{
    public string Url { get; set; } = string.Empty;
    public bool AddWatermark { get; set; }
    public bool ProtectWithPassword { get; set; }
    public string Password { get; set; } = string.Empty;
}
using IronPdf;
using IronPdf.Editing;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using System.Net;
using System.Text.Json;

public class PdfApiFunction
{
    private static readonly ChromePdfRenderer Renderer = new ChromePdfRenderer
    {
        RenderingOptions = new ChromePdfRenderOptions
        {
            PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    };

    [Function("ConvertUrlToPdf")]
    public async Task<HttpResponseData> ConvertUrl(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var body = await req.ReadAsStringAsync() ?? "{}";
        var request = JsonSerializer.Deserialize<ConvertUrlRequest>(body);

        if (string.IsNullOrEmpty(request?.Url))
        {
            var bad = req.CreateResponse(HttpStatusCode.BadRequest);
            await bad.WriteStringAsync("URL is required.");
            return bad;
        }

        using var pdf = Renderer.RenderUrlAsPdf(request.Url);

        if (request.AddWatermark)
        {
            pdf.ApplyWatermark(
                "<h2>CONFIDENTIAL</h2>",
                30,
                VerticalAlignment.Middle,
                HorizontalAlignment.Center);
        }

        if (request.ProtectWithPassword && !string.IsNullOrEmpty(request.Password))
        {
            pdf.SecuritySettings.UserPassword = request.Password;
            pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        }

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.WriteBytesAsync(pdf.BinaryData);
        return response;
    }
}

public class ConvertUrlRequest
{
    public string Url { get; set; } = string.Empty;
    public bool AddWatermark { get; set; }
    public bool ProtectWithPassword { get; set; }
    public string Password { get; set; } = string.Empty;
}
Imports IronPdf
Imports IronPdf.Editing
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http
Imports System.Net
Imports System.Text.Json

Public Class PdfApiFunction
    Private Shared ReadOnly Renderer As New ChromePdfRenderer With {
        .RenderingOptions = New ChromePdfRenderOptions With {
            .PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            .PrintHtmlBackgrounds = True,
            .CreatePdfFormsFromHtml = True,
            .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    }

    <Function("ConvertUrlToPdf")>
    Public Async Function ConvertUrl(
        <HttpTrigger(AuthorizationLevel.Function, "post")> req As HttpRequestData) As Task(Of HttpResponseData)

        Dim body As String = Await req.ReadAsStringAsync() ?? "{}"
        Dim request As ConvertUrlRequest = JsonSerializer.Deserialize(Of ConvertUrlRequest)(body)

        If String.IsNullOrEmpty(request?.Url) Then
            Dim bad As HttpResponseData = req.CreateResponse(HttpStatusCode.BadRequest)
            Await bad.WriteStringAsync("URL is required.")
            Return bad
        End If

        Using pdf = Renderer.RenderUrlAsPdf(request.Url)
            If request.AddWatermark Then
                pdf.ApplyWatermark(
                    "<h2>CONFIDENTIAL</h2>",
                    30,
                    VerticalAlignment.Middle,
                    HorizontalAlignment.Center)
            End If

            If request.ProtectWithPassword AndAlso Not String.IsNullOrEmpty(request.Password) Then
                pdf.SecuritySettings.UserPassword = request.Password
                pdf.SecuritySettings.AllowUserCopyPasteContent = False
            End If

            Dim response As HttpResponseData = req.CreateResponse(HttpStatusCode.OK)
            response.Headers.Add("Content-Type", "application/pdf")
            Await response.WriteBytesAsync(pdf.BinaryData)
            Return response
        End Using
    End Function
End Class

Public Class ConvertUrlRequest
    Public Property Url As String = String.Empty
    Public Property AddWatermark As Boolean
    Public Property ProtectWithPassword As Boolean
    Public Property Password As String = String.Empty
End Class
$vbLabelText   $csharpLabel

Taka struktura zapewnia elastyczność przy zachowaniu wyraźnego podziału. Funkcja przyjmuje żądania JSON, przetwarza je z obsługą błędów i zwraca pliki PDF z opcjonalnymi zabezpieczeniami. Można dodawać znaki wodne, wdrażać ochronę hasłem oraz stosować podpisy cyfrowe.

Jakie są najlepsze praktyki dotyczące generowania plików PDF do produkcji?

Generowanie plików PDF do produkcji wymaga szczególnej dbałości o wydajność, niezawodność i zarządzanie zasobami. Te najlepsze praktyki zapewniają optymalną wydajność w rzeczywistych warunkach przy wielu równoczesnych żądaniach.

Jak zarządzasz pamięcią i zasobami?

Zarządzanie pamięcią staje się kluczowe w przypadku żądań wykonywanych jednocześnie. Zawsze usuwaj obiekty PDF za pomocą instrukcji using. W przypadku dużych dokumentów należy stosować strumieniowe przesyłanie danych zamiast ładowania całych plików PDF do pamięci. Wprowadź ograniczanie liczby żądań, aby zapobiec wyczerpaniu pamięci podczas skoków ruchu.

using IronPdf;
using Microsoft.Extensions.Logging;

public static class PdfProductionService
{
    // Limit concurrent PDF operations to avoid memory exhaustion
    private static readonly SemaphoreSlim Throttle = new SemaphoreSlim(5);

    public static async Task<byte[]> GeneratePdfAsync(string html, ILogger log)
    {
        await Throttle.WaitAsync();
        try
        {
            using var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    Timeout = 60,
                    UseMarginsOnHeaderAndFooter = UseMargins.Niene
                }
            };

            renderer.RenderingOptions.WaitFor.RenderDelay(1000);
            using var pdf = renderer.RenderHtmlAsPdf(html);

            log.LogInformation(
                "PDF generated: {Pages} pages, {Bytes} bytes",
                pdf.PageCount,
                pdf.BinaryData.Length);

            return pdf.BinaryData;
        }
        finally
        {
            Throttle.Release();
        }
    }
}
using IronPdf;
using Microsoft.Extensions.Logging;

public static class PdfProductionService
{
    // Limit concurrent PDF operations to avoid memory exhaustion
    private static readonly SemaphoreSlim Throttle = new SemaphoreSlim(5);

    public static async Task<byte[]> GeneratePdfAsync(string html, ILogger log)
    {
        await Throttle.WaitAsync();
        try
        {
            using var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    Timeout = 60,
                    UseMarginsOnHeaderAndFooter = UseMargins.Niene
                }
            };

            renderer.RenderingOptions.WaitFor.RenderDelay(1000);
            using var pdf = renderer.RenderHtmlAsPdf(html);

            log.LogInformation(
                "PDF generated: {Pages} pages, {Bytes} bytes",
                pdf.PageCount,
                pdf.BinaryData.Length);

            return pdf.BinaryData;
        }
        finally
        {
            Throttle.Release();
        }
    }
}
Imports IronPdf
Imports Microsoft.Extensions.Logging
Imports System.Threading

Public NotInheritable Class PdfProductionService
    ' Limit concurrent PDF operations to avoid memory exhaustion
    Private Shared ReadOnly Throttle As New SemaphoreSlim(5)

    Public Shared Async Function GeneratePdfAsync(html As String, log As ILogger) As Task(Of Byte())
        Await Throttle.WaitAsync()
        Try
            Using renderer As New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .Timeout = 60,
                    .UseMarginsOnHeaderAndFooter = UseMargins.Niene
                }
            }
                renderer.RenderingOptions.WaitFor.RenderDelay(1000)
                Using pdf = renderer.RenderHtmlAsPdf(html)
                    log.LogInformation("PDF generated: {Pages} pages, {Bytes} bytes", pdf.PageCount, pdf.BinaryData.Length)
                    Return pdf.BinaryData
                End Using
            End Using
        Finally
            Throttle.Release()
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Jak monitorować stan generowania plików PDF?

Monitorowanie zapewnia wgląd w stan generatora plików PDF. Użyj Application Insights do śledzenia czasów generowania, wskaźników awaryjności i zużycia zasobów. Ustaw alerty dla anomalii, takich jak wzrost liczby błędów lub pogorszenie jakości odpowiedzi. Rejestruj szczegółowe informacje o każdym żądaniu w celu rozwiązywania problemów.

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;

// Track custom metrics using Application Insights
var telemetry = new TelemetryClient(TelemetryConfiguration.CreateDefault());

var sw = System.Diagnostics.Stopwatch.StartNew();
var pdfBytes = await PdfProductionService.GeneratePdfAsync(html, logger);
sw.Stop();

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds);
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length);
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;

// Track custom metrics using Application Insights
var telemetry = new TelemetryClient(TelemetryConfiguration.CreateDefault());

var sw = System.Diagnostics.Stopwatch.StartNew();
var pdfBytes = await PdfProductionService.GeneratePdfAsync(html, logger);
sw.Stop();

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds);
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length);
Imports Microsoft.ApplicationInsights
Imports Microsoft.ApplicationInsights.Extensibility
Imports System.Diagnostics

' Track custom metrics using Application Insights
Dim telemetry As New TelemetryClient(TelemetryConfiguration.CreateDefault())

Dim sw As Stopwatch = Stopwatch.StartNew()
Dim pdfBytes = Await PdfProductionService.GeneratePdfAsync(html, logger)
sw.Stop()

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds)
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length)
$vbLabelText   $csharpLabel

Jak radzisz sobie z zaawansowanymi funkcjami plików PDF w Azure?

Zaawansowane funkcje IronPDF rozszerzają możliwości generatora PDF poza podstawowe tworzenie dokumentów. Funkcje te są w pełni obsługiwane w Azure i umożliwiają profesjonalne przetwarzanie dokumentów.

Jak zabezpieczyć pliki PDF za pomocą szyfrowania i uprawnień?

IronPDF obsługuje ochronę hasłem i zarządzanie uprawnieniami, co pozwala na precyzyjną kontrolę nad dokumentami. Funkcja uprawnień i haseł do plików PDF wykorzystuje szyfrowanie AES-256:

using IronPdf;

// Load or generate the PDF
using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>");

// Apply password protection
pdf.SecuritySettings.UserPassword = "view-password";
pdf.SecuritySettings.OwnerPassword = "admin-password";

// Restrict permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;

pdf.SaveAs("azure-secure-report.pdf");
using IronPdf;

// Load or generate the PDF
using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>");

// Apply password protection
pdf.SecuritySettings.UserPassword = "view-password";
pdf.SecuritySettings.OwnerPassword = "admin-password";

// Restrict permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;

pdf.SaveAs("azure-secure-report.pdf");
Imports IronPdf

' Load or generate the PDF
Using pdf = New ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>")

    ' Apply password protection
    pdf.SecuritySettings.UserPassword = "view-password"
    pdf.SecuritySettings.OwnerPassword = "admin-password"

    ' Restrict permissions
    pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights
    pdf.SecuritySettings.AllowUserCopyPasteContent = False
    pdf.SecuritySettings.AllowUserAnnotations = False

    pdf.SaveAs("azure-secure-report.pdf")
End Using
$vbLabelText   $csharpLabel

Można połączyć szyfrowanie z podpisami cyfrowymi, aby tworzyć dokumenty niepodważalne i zabezpieczone przed manipulacją.

Jak dodać nagłówki, stopki i znaki wodne?

Dodawanie nagłówków i stopek z dynamicznymi numerami stron i niestandardowymi znakami wodnymi działa w Azure tak samo, jak w każdym innym środowisku .NET:

using IronPdf;

using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>");

// Add dynamic header with page numbers
var header = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
    Height = 15
};
pdf.AddHTMLHeaders(header);

// Apply a draft watermark when needed
pdf.ApplyWatermark(
    "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
    45,
    IronPdf.Editing.VerticalAlignment.Middle,
    IronPdf.Editing.HorizontalAlignment.Center);

pdf.SaveAs("report-with-header.pdf");
using IronPdf;

using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>");

// Add dynamic header with page numbers
var header = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
    Height = 15
};
pdf.AddHTMLHeaders(header);

// Apply a draft watermark when needed
pdf.ApplyWatermark(
    "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
    45,
    IronPdf.Editing.VerticalAlignment.Middle,
    IronPdf.Editing.HorizontalAlignment.Center);

pdf.SaveAs("report-with-header.pdf");
Imports IronPdf

Using pdf = New ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>")
    ' Add dynamic header with page numbers
    Dim header As New HtmlHeaderFooter With {
        .HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
        .Height = 15
    }
    pdf.AddHTMLHeaders(header)

    ' Apply a draft watermark when needed
    pdf.ApplyWatermark(
        "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
        45,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center)

    pdf.SaveAs("report-with-header.pdf")
End Using
$vbLabelText   $csharpLabel

Można również łączyć lub dzielić pliki PDF, wyodrębniać tekst, konwertować pliki PDF na obrazy oraz pracować z formularzami PDF.

Na jakie typowe błędy należy uważać?

Nawet przy prawidłowej konfiguracji podczas wdrażania generatorów plików PDF w Azure często pojawiają się pewne problemy. Zrozumienie tych problemów pozwala zaoszczędzić cenny czas potrzebny na rozwiązywanie problemów.

Dlaczego pojawiają się błędy "Odmowa dostępu"?

Błąd "Odmowa dostępu do ścieżki" pojawia się, gdy IronPDF nie może zapisać plików tymczasowych. Ustaw Installation.CustomDeploymentDirectory = "/tmp", aby zapewnić dostęp do zapisu. Jeśli korzystasz z wdrożenia typu "Run-from-Package", upewnij się, że aplikacja ma oddzielną ścieżkę z prawem do zapisu, ponieważ /home/site/wwwroot jest w tym trybie tylko do odczytu.

Jak rozwiązać problemy związane z przekroczeniem limitu czasu i renderowaniem?

Wyjątki związane z przekroczeniem limitu czasu występują, gdy renderowanie złożonych dokumentów przekracza limit czasu funkcji platformy Azure. Zwiększ limit czasu renderowania, dodaj opóźnienie renderowania dla stron z dużą ilością kodu JavaScript lub przenieś duże zadania do trwałej kolejki zadań.

Problemy z renderowaniem czcionek objawiają się brakiem lub nieprawidłowym wyświetlaniem czcionek. Osadzaj czcionki przy użyciu kodowania Base64, korzystaj z czcionek bezpiecznych dla sieci, które są natywnie obsługiwane przez platformę Azure, lub przejdź na wdrożenie kontenerowe, aby uzyskać pełną kontrolę nad czcionkami.

Co powoduje wyjątki pamięci podczas generowania plików PDF?

Wyjątki pamięci wynikają z tego, że generowanie plików PDF wymaga dużej ilości pamięci. Typowe problemy obejmują wyjątki braku pamięci podczas dużych lub równoczesnych żądań.

Najlepsze praktyki obejmują:

  • Natychmiastowo usuwaj obiekty PdfDocument za pomocą instrukcji using
  • Ogranicz liczbę jednoczesnych żądań za pomocą SemaphoreSlim, jak pokazano w przykładzie usługi produkcyjnej
  • W przypadku dużych plików PDF należy stosować wyjście oparte na strumieniu zamiast ładowania całych tablic bajtów
  • Przejdź z planu Consumption na plan Premium lub Dedicated, aby zapewnić przewidywalny przydział pamięci

Jak wdrażasz i monitorujesz generator plików PDF w Azure?

Solidna strategia wdrażania gwarantuje, że generator plików PDF pozostanie stabilny, łatwy do monitorowania i aktualizacji. Poniższe praktyki mają zastosowanie niezależnie od tego, czy tłumaczenie jest przeznaczone dla usługi Azure Usługa aplikacji, czy Funkcje Azure.

Jakich najlepszych praktyk wdrożeniowych należy przestrzegać?

  • Zautomatyzowane CI/CD: Użyj Azure DevOps lub GitHub Actions do powtarzalnych i podlegających audytowi wdrożeń
  • Klucze licencyjne: Przechowuj licencje IronPDF w Azure Key Vault zamiast w systemie kontroli wersji lub zmiennych środowiskowych
  • Ścieżka zapisu: Skonfiguruj foldery tymczasowe IronPDF (/tmp dla kontenerów Linux) podczas uruchamiania aplikacji
  • Wybór pakietu: Użyj IronPdf.Linux dla wdrożeń opartych na kontenerach; użyj standardowego pakietu IronPdf dla Windows Usługa aplikacji

Jak skonfigurować monitorowanie i wskaźniki?

Application Insights integruje się bezpośrednio z Funkcje Azure i Usługa aplikacji. Użyj TelemetryClient, aby śledzić niestandardowe metryki dla każdego zdarzenia generowania pliku PDF:

using Microsoft.ApplicationInsights;

var telemetryClient = new TelemetryClient();
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds);
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount);
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes);
using Microsoft.ApplicationInsights;

var telemetryClient = new TelemetryClient();
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds);
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount);
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes);
Imports Microsoft.ApplicationInsights

Dim telemetryClient As New TelemetryClient()
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds)
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount)
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes)
$vbLabelText   $csharpLabel

Ustaw alerty oparte na wskaźnikach w portalu Azure, aby otrzymywać powiadomienia, gdy czas generowania przekroczy dopuszczalny próg lub gdy wzrośnie liczba błędów.

Jak już dziś rozpocząć korzystanie z usługi Azure PDF Generation?

Masz teraz pełny obraz tego, jak zbudować gotowy do produkcji generator PDF w Azure: od wyboru odpowiedniego poziomu Azure i zainstalowania właściwego pakietu NuGet, przez konfigurację renderera dla środowisk chmurowych, aż po dodanie zabezpieczeń, monitorowania i ograniczania zasobów.

Połączenie infrastruktury chmurowej Azure i silnika renderującego IronPDF opartego na przeglądarce Chrome tworzy platformę PDF, która skaluje się wraz z Twoimi potrzebami. Niezależnie od tego, czy przetwarzasz kilka dokumentów, czy tysiące na godzinę, generator zapewnia stałą wydajność przy przewidywalnych kosztach.

Zacznij od przeglądu funkcji IronPDF, aby zapoznać się z pełnym zakresem dostępnych możliwości, a następnie zapoznaj się z dokumentacją, aby uzyskać szczegółowe informacje na temat API. Gdy będziesz gotowy do wdrożenia, aktywuj bezpłatną licencję próbną, aby przetestować wszystkie funkcje bez opłat za poszczególne dokumenty. Zapoznaj się z opcjami licencyjnymi, aby wybrać plan dostosowany do Twojego obciążenia produkcyjnego.

Aby uzyskać dodatkowe opcje przetwarzania dokumentów, zapoznaj się z instrukcją instalacji IronPDF NuGet oraz pełną Suite produktów IronSoftware.

Zacznij z IronPDF teraz.
green arrow pointer

Często Zadawane Pytania

Jakie są zalety korzystania z IronPDF w Azure do generowania plików PDF?

IronPDF zapewnia funkcje generowania plików PDF klasy Enterprise, które płynnie integrują się z platformą Azure, gwarantując skalowalność i niezawodność. Rozwiązanie to pozwala pokonać wyzwania, takie jak ograniczenia piaskownicy i ograniczenia pamięci, powszechne w środowiskach chmurowych.

W jaki sposób IronPDF radzi sobie z ograniczeniami pamięci w środowiskach Azure?

IronPDF jest zoptymalizowany do pracy w ramach ograniczeń pamięci platformy Azure, wykorzystując wydajne techniki przetwarzania, które pozwalają mu generować pliki PDF bez przekraczania dostępnych zasobów.

Czy IronPDF może być używany z Azure Functions?

Tak, IronPDF można zintegrować z Azure Functions w celu tworzenia bezserwerowych rozwiązań do generowania plików PDF, korzystając z automatycznego skalowania i ekonomicznego wykonywania.

Jakie kwestie związane z bezpieczeństwem należy wziąć pod uwagę podczas korzystania z IronPDF w Azure?

IronPDF obsługuje bezpieczne generowanie plików PDF poprzez przestrzeganie najlepszych praktyk w zakresie ochrony danych w trakcie przesyłania i przechowywania, zapewniając zgodność ze standardami bezpieczeństwa platformy Azure.

Czy można wdrożyć IronPDF w usłudze Azure App Service?

Oczywiście, IronPDF można wdrożyć w usłudze Azure App Service, co pozwala programistom korzystać z jego funkcji w zarządzanym środowisku hostingowym.

Czy IronPDF obsługuje dostosowywanie funkcji PDF w Azure?

Tak, IronPDF oferuje szerokie możliwości dostosowywania generowania plików PDF, w tym układu, wyglądu i interaktywności, podczas działania w Azure.

W jaki sposób IronPDF zapewnia wysoką wydajność w rozproszonym systemie Azure?

IronPDF został zaprojektowany tak, aby bez problemu skalować się w systemach rozproszonych, wykorzystując infrastrukturę Azure w celu utrzymania wysokiej wydajności i niezawodności.

Czy IronPDF obsługuje .NET 10 do generowania plików PDF w Azure?

Tak, IronPDF jest w pełni kompatybilny z .NET 10 we wszystkich środowiskach Azure — w tym w usługach Functions, App Services i wdrożeniach kontenerowych. Oferuje płynną obsługę od razu po uruchomieniu, bez konieczności stosowania specjalnych obejść. Wymagania platformowe IronPDF wyraźnie wymieniają .NET 10 wśród obsługiwanych środowisk uruchomieniowych. (ironpdf.com)

Jakie wersje .NET obsługuje IronPDF i w jaki sposób kompatybilność z .NET 10 poprawia wydajność?

IronPDF obsługuje szeroki zakres wersji .NET, w tym .NET 6, 7, 8, 9 i 10. Korzystanie z .NET 10 oznacza, że zyskujesz dzięki najnowszym optymalizacjom środowiska uruchomieniowego, ulepszonemu zbieraniu śmieci i zwiększonej wydajności w Azure — zwłaszcza w przypadku generowania plików PDF bezserwerowego lub opartego na kontenerach. ironpdf.com potwierdza obsługę .NET 10 w liście funkcji „Biblioteki PDF dla C#”.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie