Poznaj najlepsze alternatywy PDF-do-Obraz do PDFsharp
Większość zadań HTML-to-PDF nie działa z tego samego powodu: strona wygląda dobrze dopiero po zalogowaniu się użytkownika. IronPDF napędza silnik Chrome, więc widzi to, co widziałaby niezalogowana przeglądarka, ekran logowania lub pustą powłokę, dopóki nie poda mu się odpowiednich ciasteczek. Trzy elementy API rozwiązują to: właściwość RequestContext, metoda ApplyCookies i słownik CustomCookies. Oto, gdzie każdy pasuje, z kawałkiem kodu do dopasowania.
Renderowanie faktur i wyciągów za logowaniem
Faktura klienta znajduje się na trasie chronionej sesją, a Twoja aplikacja już posiada jego sesję. Przekaż ten identyfikator sesji bezpośrednio przez CustomCookies:
using IronPdf;
using System.Collections.Generic;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Global;
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "ASP.NET_SessionId", sessionId }
};
renderer.RenderUrlAsPdf("https://app.example.com/account/invoices/1042")
.SaveAs("invoice-1042.pdf");Imports IronPdf
Imports System.Collections.Generic
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Global
renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
{"ASP.NET_SessionId", sessionId}
}
renderer.RenderUrlAsPdf("https://app.example.com/account/invoices/1042").SaveAs("invoice-1042.pdf")W przypadku podstawowego lub Windows authentication sięgnij po ApplyCookies zamiast tego. Loguje się na URL z podanymi danymi uwierzytelniającymi i przechwytuje utworzone ciasteczka w globalnym kontekście, które następny renderowanie ponownie używa:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Global;
var credentials = new ChromeHttpLoginCredentials
{
NetworkUsername = "svc_reports",
NetworkPassword = "your_password"
};
string uri = "https://app.example.com/account/invoices/1042";
renderer.ApplyCookies(uri, credentials);
renderer.RenderUrlAsPdf(uri).SaveAs("invoice-1042.pdf");Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Global
Dim credentials As New ChromeHttpLoginCredentials With {
.NetworkUsername = "svc_reports",
.NetworkPassword = "your_password"
}
Dim uri As String = "https://app.example.com/account/invoices/1042"
renderer.ApplyCookies(uri, credentials)
renderer.RenderUrlAsPdf(uri).SaveAs("invoice-1042.pdf")Uwierzytelnianie oparte na tokenach i zewnętrzne
Nowoczesne aplikacje rzadko polegają na prostych poświadczeniach HTTP. Uwierzytelniają się za pomocą JWT, OAuth, lub SAML, często zapisując wynik w ciasteczku. Ponieważ CustomCookies przyjmuje dowolną parę klucz-wartość, można bezpośrednio użyć tokena dostępu lub ciasteczka dostawcy tożsamości:
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "auth_token", jwt },
{ "refresh_token", refreshToken }
};Imports System.Collections.Generic
renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
{"auth_token", jwt},
{"refresh_token", refreshToken}
}Spersonalizowane i lokalizowane dokumenty
Ciasteczka często przenoszą stan lokalizacji, waluty lub flagi funkcji. Przekaż je dalej, a PDF odpowiada temu, co widzi dany użytkownik, w odpowiednim języku i walucie:
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "locale", "en-AU" },
{ "currency", "AUD" },
{ "feature_newLayout", "on" }
};renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
{"locale", "en-AU"},
{"currency", "AUD"},
{"feature_newLayout", "on"}
}Generowanie wsadowe, które dzieli jedną sesję
Aby wygenerować wiele plików PDF dla tego samego uwierzytelnionego użytkownika w kolejności, ustaw RequestContext na Global. Stan przeglądarki, w tym ciasteczka, trwa między renderowaniami, więc uwierzytelniasz się raz, zamiast każdego dokumentu osobno:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Global;
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "ASP.NET_SessionId", sessionId }
};
foreach (var id in invoiceIds)
{
renderer.RenderUrlAsPdf($"https://app.example.com/invoices/{id}")
.SaveAs($"invoice-{id}.pdf");
}Imports IronPdf.Rendering
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.RequestContext = RequestContexts.Global
renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
{"ASP.NET_SessionId", sessionId}
}
For Each id In invoiceIds
renderer.RenderUrlAsPdf($"https://app.example.com/invoices/{id}").SaveAs($"invoice-{id}.pdf")
NextRównoczesne renderowanie bez przeplatania ciasteczek
Przeciwny scenariusz ma takie samo znaczenie. Usługa renderująca dla wielu różnych użytkowników jednocześnie potrzebuje kontekstu Isolated, co daje każdemu renderowi czysty stan i zapobiega przenikaniu sesji jednego użytkownika do dokumentów innych. Daj każdemu wątkowi własny renderer:
using System.Threading.Tasks;
Parallel.ForEach(jobs, job =>
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.RequestContext = IronPdf.Rendering.RequestContexts.Isolated;
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "ASP.NET_SessionId", job.SessionId }
};
renderer.RenderUrlAsPdf(job.Url).SaveAs(job.OutputPath);
});Imports System.Threading.Tasks
Imports IronPdf.Rendering
Parallel.ForEach(jobs, Sub(job)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.RequestContext = RequestContexts.Isolated
renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
{"ASP.NET_SessionId", job.SessionId}
}
renderer.RenderUrlAsPdf(job.Url).SaveAs(job.OutputPath)
End Sub)Dopasowanie metody do zadania
Użyj standardowych ciasteczek (ApplyCookies) dla podstawowego uwierzytelniania HTTP, Windows authentication i prostych sesji. Sięgnij po CustomCookies przy użyciu tokenów, sesji wieloparametrowych, dostawców zewnętrznych i przechowywanych preferencji. Wybierz Global, aby współdzielić stan pomiędzy renderami, oraz Isolated, aby je oddzielić; Auto domyślnie zostaje oddzielony i przełącza się na globalny, gdy wywołany zostaje ApplyCookies.
Większość niepowodzeń skupia się wokół wygasłych tokenów, niedopasowanych domen ciasteczek, obsługi bezpiecznych ciasteczek na adresach URL HTTPS i zasad SameSite przy żądaniach spoza domeny. Potwierdzaj ważność ciasteczek przed renderowaniem i polegaj na Global, gdy sesje muszą być utrzymywane.
Kiedy ciasteczka stanowią całe zadanie
Ciasteczka nie są przypadkiem granicznym w generowaniu PDF. Zrobisz to dobrze, a wyślesz użyteczny dokument; zrobisz to źle, a wyślesz zrzut ekranu formularza logowania.

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ęczników.