探索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");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");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 }
};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(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");
}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);
});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不是边缘情况。 处理正确,您将交付一个可用的文档; 处理错误,您将交付一张登录表单的截图。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。