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.
| 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
# 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
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
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

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.
| 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
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
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)
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
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
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
PdfDocumentza pomocą instrukcjiusing - 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 (
/tmpdla kontenerów Linux) podczas uruchamiania aplikacji - Wybór pakietu: Użyj
IronPdf.Linuxdla wdrożeń opartych na kontenerach; użyj standardowego pakietuIronPdfdla 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)
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.
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#”.




