探索PDFsharp的最佳PDF到图像替代方案
大多数HTML-to-PDF工作失败都是因为同一个原因:只有用户登录页面看起来才正确。 IronPDF驱动一个Chrome引擎,因此它看到的与一个未登录的浏览器相同,一个登录屏幕或一个空壳,直到您为它提供正确的cookie。 API的三个部分解决了这个问题,CustomCookies字典。 以下是每个适用的地方,以及一个对应的代码片段。
在登录后渲染发票和声明
客户的发票位于一个会话保护的路径上,并且您的应用程序已经持有他们的会话。 直接通过CustomCookies传递会话ID:
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");
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")
对于基本或Windows认证,请改用ApplyCookies。 它使用提供的凭据在URL上登录,并将生成的cookie捕获到全局上下文中,以下的渲染会重用该上下文:
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");
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")
基于令牌和第三方认证
现代应用程序很少依赖简单的HTTP凭据。 它们使用JWT、OAuth或SAML进行身份验证,通常将结果存储在cookie中。 由于CustomCookies接受任何键值对,因此可以直接放入Bearer令牌或身份提供者的cookie:
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "auth_token", jwt },
{ "refresh_token", refreshToken }
};
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}
}
个性化和本地化文档
cookie通常携带语言、货币或特征标志状态。 转发它们,PDF会匹配该特定用户看到的内容,以正确的语言和货币显示:
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
{ "locale", "en-AU" },
{ "currency", "AUD" },
{ "feature_newLayout", "on" }
};
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"}
}
共享一个会话的批量生成
要为同一认证用户连续生成多个PDF,请将Global。 浏览器状态,包括cookie,在渲染之间保持不变,因此您只需认证一次,而不是每个文件都进行认证:
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");
}
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")
Next
在没有cookie泄露的情况下进行并发渲染
相反的情况同样重要。 为多个不同用户同时提供服务的渲染需要Isolated上下文,这使每个渲染都有一个干净的状态,并且防止一个用户的会话泄露到另一个用户的文档中。 为每个线程分配自己的渲染器:
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);
});
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)
将方法与工作匹配
对于基本HTTP认证、Windows认证和简单会话使用标准cookie (ApplyCookies)。 在使用令牌、多参数会话、第三方提供商和存储偏好时使用CustomCookies。 选择Isolated来保持其分离; ApplyCookies后切换至全局状态。
大多数失败集中在过期的令牌、不匹配的cookie域、HTTPS URLs上的安全cookie处理以及跨域请求的SameSite策略。 在渲染之前确认cookie的有效性,并在会话必须持久化时依赖Global。
当cookie是整个工作时
在PDF生成中,cookie不是边缘情况。 处理正确,您将交付一个可用的文档; 处理错误,您将交付一张登录表单的截图。
常见问题解答
如何使用IronPDF将登录保护页面渲染为PDF?
将RequestContext设置为Global,并在调用RenderUrlAsPdf之前填充CustomCookies以包含用户的会话Cookie。IronPDF的Chrome引擎将使用这些Cookie进行身份验证并渲染受保护页面。
IronPDF中的ApplyCookies和CustomCookies有什么区别?
ApplyCookies使用HTTP凭据(基本身份认证或Windows身份认证)登录,将生成的会话Cookie捕获到全局上下文中。CustomCookies允许您直接提供Cookie键值对 — 对于JWT令牌、OAuth Cookie和多参数会话非常有用。
什么是RequestContext,何时应使用Global或Isolated?
当多个渲染共享同一认证会话时,使用Global(例如批量为一个用户生成发票)。当为多个不同用户同时渲染时,使用Isolated,每个渲染获取清晰的Cookie状态,防止会话在用户之间泄漏。
IronPDF是否可以处理PDF渲染的JWT和OAuth身份认证?
可以。在CustomCookies中以键值对形式传递令牌值(例如auth_token和refresh_token)。IronPDF将其与Chrome引擎发出的每个请求一同转发。
为什么我的PDF渲染为空白页面或登录屏幕?
最常见的原因是会话Cookie已过期、Cookie域不匹配、HTTPS URL的安全Cookie限制,以及跨域请求的SameSite政策阻止。在渲染之前,验证Cookie是否有效且与目标域匹配。

