using IronPDF 將線上申請表轉換為 PDF 摘要
手動生成票券和識別證的問題
對於二十位客人的小型私人晚宴,在Figma或Canva中設計票券並手動匯出是可以管理的。 對於有五個票券等級及3,000名與會者的技術會議,這不只是一個過程,這會成為一種責任。
通用票券平台解決了分發問題,但限制了其他一切。 品牌選項僅限於上傳logo和選擇顏色。 VIP通行證、講者徽章和工作人員憑證的自訂佈局需要從不同工具分別匯出。 當企業峰會需要與註冊記錄相連的晚宴座位徽章及特定會議的QR Code時,大多數平台無法提供解決方案。
如果每張票沒有唯一的可掃描識別碼,入場檢查將成為瓶頸。 在門口的列印名單或根據名字查找將使每個人的入場緩慢,並創造詐欺的機會,無唯一編碼的重複PDF通過視覺檢查,不會在其他人同時使用同一張票之前被發現。
與會者也注意到專業事件文件和正文中埋有預訂參考的純文字確認之間的差異。 音樂節、非營利晚宴、企業峰會,都期望材料反映事件的品牌,而不是來自第三方系統的預設模板。
解決方案:在您的.NET應用程式內部個人化C# PDF票券生成
IronPDF讓.NET應用程式從HTML和CSS模板中生成品牌化的PDF票券和徽章,並填入與會者資料和嵌入的QR Code圖像。 每位註冊者的詳細資訊填寫在相同的模板中,對每位與會者生成的QR Code編碼其唯一票券ID或檢查URL,ChromePdfRenderer處理HTML到PDF的過程,應用程式通過電子郵件發送或使其在註冊入口網站下載。
沒有第三方票務API費用,沒有設計工具匯出,也沒有從註冊確認到票券交付之間的手動步驟。 渲染運行在現有的.NET應用程式內部,一個用於PDF處理的C# NuGet函式庫(IronPDF),一個用於IronQR,且管道是自包含的。
實際運作方式
1. 註冊關閉後觸發操作
由註冊系統調用的BackgroundService、Hangfire定期作業或webhook端點觸發票券生成,方式可能在每次註冊確認後立即進行,或在活動日期前進行批次運行。 作業查詢註冊資料庫中每位已確認與會者:姓名、電子郵件、票券型別、指定會議、座位或桌號及唯一票券ID。
2. 建立每位與會者的QR Code生成的PDF
每位與會者得到一個QR Code,編碼其票券ID或一個完整的檢查URL,例如,https://event.example.com/checkin/`{ticketId}`。 此程式碼渲染為PNG並轉換為方便直接內嵌到HTML模板中的base64字串,無需寫入檔案系統:
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在毫秒內渲染每個票券。 對於3,000名與會者的批次運行,並行處理在可用核心上,數分鐘內完成,而不是幾小時,也不是在活動前一天急匆匆地完成。
品牌一致性。每張票券和徽章都承載相同的活動品牌、贊助商logo,和字體設計。 VIP通行證、講者徽章和一般入場票全都看起來像來自同一個設計系統,因為它們確實來自相同的HTML內容和團隊維護的CSS。
防詐。每個QR Code都編碼了一個唯一的票券ID,與特定的註冊記錄相對應。 門口工作人員掃描時系統會對照資料庫進行驗證。 重複的PDF會生成一個重複的掃描,系統會立即標記。
快速入場。掃描QR Code並對照註冊記錄驗證需不到一秒。 無需名字查找,無需列印名單,無需緩慢的手動驗證。 入口隊伍加快移動,工作人員能處理例外情況而不是手動處理每次入場。
模板靈活性。不同的事件角色獲得不同的佈局,VIP通行證提供休息區細節,講者徽章顯示行程亮點,工作人員憑證顯示後台標識。 一條生成管道,多個HTML模板,一次部署。
無每張票的成本。管道在進程中運行。 無到票務供應商的API呼叫,無使用測量,無隨註冊數量增長的每項文件費用。
結語
票券和徽章生成是那些看似由現有平台解決的問題之一,但當事件有真正的自訂要求、大型與會者名單或平台不支援的整合需求時,問題就會浮現。 在.NET應用程式內構建管道可使團隊完全控管佈局、資料、交付時間及成本。
IronPDF負責PDF生成的完整生命周期,具有關鍵功能,從HTML模板的像素級渲染到保存、應用數位簽名和加密、串流及文件操作,全部來自ironpdf.com。 如果您正在構建註冊系統或替換外部票券依賴,完整函式庫可用來測試您的活動資料,您可以試用免費試用版的IronPDF。




