using IronPDF 将在线申请表转换为 PDF 摘要
手动生成票证和徽章的问题
对于有二十位客人的小型私人晚宴,可以在Figma或Canva中设计票证并手动导出。 对于一场有3000名与会者的技术大会,分为五个票务等级,这不是一个过程,而是一项责任。
通用的票务平台解决了分发问题,但限制了其他所有方面。 品牌选项被限制为上传徽标和选择颜色。 VIP通行证、演讲者徽章和工作人员凭证的自定义布局需要从不同工具中分别导出。 当公司峰会需要附着到注册记录上的晚宴座位徽章和专门为特定会议生成的QR码时,大多数平台没有答案。
每张票证上没有唯一的可扫描标识符,签到成为瓶颈。 在门口进行纸质名单或姓名查询会减慢每个人的入场速度,并创造欺诈机会,一个没有唯一编码的重复PDF通过视觉检查而未被发现,直到其他人尝试在同一时间使用相同票证。
与会者同样注意到专业活动文档和正文中埋有预订参考的纯文本确认之间的区别。 音乐节、非盈利晚宴、企业峰会,每个都希望材料能反映活动的品牌,而不是来自第三方系统的默认模板。
解决方案:在您的.NET应用程序内部生成个性化的C# PDF票证
IronPDF让.NET应用程序可以从HTML和CSS模板中生成带品牌的PDF票证和徽章,这些模板填充了与会者数据和嵌入的QR码图像。 每个注册人的详细信息填充相同的模板,每个与会者生成一个QR码,编码他们的唯一票证ID或签到URL,ChromePdfRenderer处理HTML到PDF的过程,应用程序通过电子邮件发送或在注册门户提供下载。
没有第三方票务API费用,没有设计工具导出,也没有注册确认和票证交付之间的手动步骤。 渲染在现有的.NET应用程序中运行,一个用于PDF处理的C# NuGet库(IronPDF),一个用于IronQR,并且管道是自包含的。
实际应用示例
1. 注册结束后触发
注册系统通过调用BackgroundService、Hangfire定时任务或webhook端点触发票证生成,无论是在每次注册确认后立即进行,还是在活动日期之前批量运行。 任务查询注册数据库中每个确认的与会者的信息:姓名、电子邮件、票种、分配的会议、座位或桌号和唯一票证ID。
2. 为每位与会者生成带QR码的PDF
每位与会者获取一个QR码,编码他们的票证ID或完整的签到URL,例如:https://event.example.com/checkin/`{ticketId}`。 代码被渲染为PNG格式并转换为base64字符串,便于直接嵌入HTML模板,无需文件系统写入:
using IronQr;
using IronPdf;
// Generate QR code encoding the attendee's check-in URL
var qrCode = QrWriter.Write($"https://event.example.com/checkin/{attendee.TicketId}");
var qrImage = qrCode.Save();
// Convert to base64 for HTML embedding
string qrBase64 = Convert.ToBase64String(qrImage.ExportBytes());
string qrDataUri = $"data:image/png;base64,{qrBase64}";
// Populate HTML ticket template with attendee data and embedded QR code
string ticketHtml = $@"
<div style='font-family:sans-serif; border:2px solid #1a1a2e; padding:32px; max-width:600px;'>
<img src='/assets/event-logo.png' height='48' alt='Event Logo'/>
<h1 style='color:#1a1a2e;'>{attendee.FullName}</h1>
<p><strong>Ticket Type:</strong> {attendee.TicketType}</p>
<p><strong>Session:</strong> {attendee.AssignedSession}</p>
<p><strong>Seat:</strong> {attendee.SeatNumber} | <strong>ID:</strong> {attendee.TicketId}</p>
<img src='{qrDataUri}' width='160' height='160' alt='Entry QR Code'/>
<p style='font-size:11px; color:#666;'>Scan at entry. One use only.</p>
</div>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A5;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
PdfDocument ticket = renderer.RenderHtmlAsPdf(ticketHtml);
using IronQr;
using IronPdf;
// Generate QR code encoding the attendee's check-in URL
var qrCode = QrWriter.Write($"https://event.example.com/checkin/{attendee.TicketId}");
var qrImage = qrCode.Save();
// Convert to base64 for HTML embedding
string qrBase64 = Convert.ToBase64String(qrImage.ExportBytes());
string qrDataUri = $"data:image/png;base64,{qrBase64}";
// Populate HTML ticket template with attendee data and embedded QR code
string ticketHtml = $@"
<div style='font-family:sans-serif; border:2px solid #1a1a2e; padding:32px; max-width:600px;'>
<img src='/assets/event-logo.png' height='48' alt='Event Logo'/>
<h1 style='color:#1a1a2e;'>{attendee.FullName}</h1>
<p><strong>Ticket Type:</strong> {attendee.TicketType}</p>
<p><strong>Session:</strong> {attendee.AssignedSession}</p>
<p><strong>Seat:</strong> {attendee.SeatNumber} | <strong>ID:</strong> {attendee.TicketId}</p>
<img src='{qrDataUri}' width='160' height='160' alt='Entry QR Code'/>
<p style='font-size:11px; color:#666;'>Scan at entry. One use only.</p>
</div>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A5;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
PdfDocument ticket = renderer.RenderHtmlAsPdf(ticketHtml);
Imports IronQr
Imports IronPdf
' Generate QR code encoding the attendee's check-in URL
Dim qrCode = QrWriter.Write($"https://event.example.com/checkin/{attendee.TicketId}")
Dim qrImage = qrCode.Save()
' Convert to base64 for HTML embedding
Dim qrBase64 As String = Convert.ToBase64String(qrImage.ExportBytes())
Dim qrDataUri As String = $"data:image/png;base64,{qrBase64}"
' Populate HTML ticket template with attendee data and embedded QR code
Dim ticketHtml As String = $"
<div style='font-family:sans-serif; border:2px solid #1a1a2e; padding:32px; max-width:600px;'>
<img src='/assets/event-logo.png' height='48' alt='Event Logo'/>
<h1 style='color:#1a1a2e;'>{attendee.FullName}</h1>
<p><strong>Ticket Type:</strong> {attendee.TicketType}</p>
<p><strong>Session:</strong> {attendee.AssignedSession}</p>
<p><strong>Seat:</strong> {attendee.SeatNumber} | <strong>ID:</strong> {attendee.TicketId}</p>
<img src='{qrDataUri}' width='160' height='160' alt='Entry QR Code'/>
<p style='font-size:11px; color:#666;'>Scan at entry. One use only.</p>
</div>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A5
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
Dim ticket As PdfDocument = renderer.RenderHtmlAsPdf(ticketHtml)
示例输出
base64数据URI直接将QR图像嵌入HTML中,所以无论应用程序部署在哪里PDF内容都会正确呈现,无需依赖渲染时可以访问的文件路径或CDN。
3. PDF文档通过电子邮件发送并存储供门户下载
渲染的PdfDocument直接流到MemoryStream作为电子邮件附件,副本上传到Blob存储以供门户访问和现场重印:
using System.Net.Mail;
using System.IO;
var pdfBytes = ticket.BinaryData;
// Store for portal download and on-site reprint
await _blobStorage.UploadAsync(
$"tickets/{attendee.TicketId}.pdf",
new BinaryData(pdfBytes)
);
// Email ticket to attendee
using var stream = new MemoryStream(pdfBytes);
using var attachment = new Attachment(stream,
$"Ticket-{attendee.TicketId}.pdf", "application/pdf");
var message = new MailMessage("tickets@yourevent.com", attendee.Email)
{
Subject = $"Your Ticket — {eventName}",
Body = $"Hi {attendee.FirstName}, your ticket is attached. See you there."
};
message.Attachments.Add(attachment);
using var smtp = new SmtpClient("smtp.yourprovider.com");
await smtp.SendMailAsync(message);
using System.Net.Mail;
using System.IO;
var pdfBytes = ticket.BinaryData;
// Store for portal download and on-site reprint
await _blobStorage.UploadAsync(
$"tickets/{attendee.TicketId}.pdf",
new BinaryData(pdfBytes)
);
// Email ticket to attendee
using var stream = new MemoryStream(pdfBytes);
using var attachment = new Attachment(stream,
$"Ticket-{attendee.TicketId}.pdf", "application/pdf");
var message = new MailMessage("tickets@yourevent.com", attendee.Email)
{
Subject = $"Your Ticket — {eventName}",
Body = $"Hi {attendee.FirstName}, your ticket is attached. See you there."
};
message.Attachments.Add(attachment);
using var smtp = new SmtpClient("smtp.yourprovider.com");
await smtp.SendMailAsync(message);
Imports System.Net.Mail
Imports System.IO
Imports System.Threading.Tasks
Dim pdfBytes = ticket.BinaryData
' Store for portal download and on-site reprint
Await _blobStorage.UploadAsync(
$"tickets/{attendee.TicketId}.pdf",
New BinaryData(pdfBytes)
)
' Email ticket to attendee
Using stream As New MemoryStream(pdfBytes)
Using attachment As New Attachment(stream, $"Ticket-{attendee.TicketId}.pdf", "application/pdf")
Dim message As New MailMessage("tickets@yourevent.com", attendee.Email) With {
.Subject = $"Your Ticket — {eventName}",
.Body = $"Hi {attendee.FirstName}, your ticket is attached. See you there."
}
message.Attachments.Add(attachment)
Using smtp As New SmtpClient("smtp.yourprovider.com")
Await smtp.SendMailAsync(message)
End Using
End Using
End Using
带有附加票证的示例电子邮件
对于成千上万名注册者的活动,任务对与会者列表分区,并在并行处理中批量处理,每个线程使用一个ChromePdfRenderer实例,以便在活动日期之前顺利运行完毕。
实际好处
扩展性。 IronPDF在毫秒内渲染每张票证。 为3000名与会者进行的批量运行跨多个可用内核进行并行化,几分钟内即可完成,而不是几个小时,也不是在活动前一日慌乱中完成。
品牌一致性。 每张票证和徽章都拥有相同的活动品牌、赞助商徽标和字体。 VIP通行证、演讲者徽章和普通入场票看起来都出自同一设计系统,因为确实是这样,同样的HTML内容和CSS由团队维护。
防止欺诈。 每个QR码编码一个与特定注册记录相关的唯一票证ID。 门口工作人员扫描时,系统会验证数据库。 重复的PDF会产生一个重复扫描,系统会立即标记。
快速签到。 扫描QR码并验证注册记录的过程耗时不到一秒。 没有姓名查询,没有打印名单,没有缓慢的人工验证。 入场队列移动更快,工作人员可以管理例外情况,而不是处理每一个手动入场。
模板灵活性。 不同的活动角色得到不同的布局,VIP通行证上可注明休息室进入细节,演讲者徽章上可注明日程亮点,工作人员凭证上可注明后台指示。 一个生成流水线,多种HTML模板,一次部署。
无每票费用。 管道在进程内运行。 没有对票务供应商的API调用,没有使用量计量,也没有随注册数量增长的每文档费用。
结语
票证和徽章生成是那些看似由现有平台解决的问题之一,直到活动需要真正定制化、大量与会者列表,或者平台不支持的集成需求。 在.NET应用程序内部构建管道使团队可以完全控制布局、数据、交付时机和成本。
IronPDF在C#中处理PDF生成的整个生命周期,关键功能涵盖从HTML模板的像素完美渲染到保存它们、应用数字签名和加密、流式传输以及文档操作,详见ironpdf.com。 如果您正在构建注册系统或替换外部票务依赖项,可以使用完整库测试您自己的活动数据,您可以免费试用IronPDF 通过免费试用。




