IronPDF를 사용하여 온라인 지원서를 PDF 요약으로 전환하기
수동 티켓 및 배지 생성을 통한 문제
20명의 손님과 함께 하는 소규모 개인 저녁 식사에서는 Figma 또는 Canva를 사용하여 티켓을 디자인하고 수동으로 내보내는 것이 가능합니다. 5개의 티켓 등급에 걸쳐 3,000명의 참석자가 있는 기술 컨퍼런스에서는 이는 프로세스가 아니라 책임입니다.
일반적인 티켓 플랫폼은 배포 문제를 해결하지만 그 외의 모든 부분을 제약합니다. 브랜딩 옵션은 로고 업로드와 색상 선택기로 제한됩니다. VIP 패스, 연사 배지, 스태프 인증을 위한 맞춤형 레이아웃은 각각 다른 도구에서 별도로 내보내야 합니다. 기업 정상 회의에 등록 기록과 연계를 가진 저녁 식사 좌석 배지를 필요로 하거나 세션별 QR 코드가 필요한 경우, 대부분의 플랫폼은 답을 제시하지 않습니다.
각 티켓에 고유한 스캔 가능한 식별자가 없으면 체크인이 병목현상이 됩니다. 입구에서 인쇄된 목록이나 이름 검색은 모두의 입장을 늦추고 사기의 기회를 만듭니다. 고유한 인코딩이 없는 복제된 PDF는 시각적 검사를 통과하고 누군가 다른 사람이 동일한 티켓을 동시에 사용하려 할 때까지 발견되지 않습니다.
참여자들은 전문가용 행사 문서와 본문에 묻힌 예약 참고가 있는 단순 텍스트 확인서의 차이를 눈치챕니다. 음악 축제, 비영리 갈라, 기업 정상 회의 각각은 이벤트의 브랜드를 반영하는 자료를 기대합니다. 제삼자 시스템의 기본 템플릿이 아닌 것입니다.
솔루션: .NET 애플리케이션 내에서 생성된 개인화된 C# PDF 티켓
IronPDF는 .NET 애플리케이션이 HTML과 CSS 템플릿에서 참석자 데이터가 채워지고 QR 코드 이미지를 포함한 브랜드 PDF 티켓과 배지를 생성할 수 있게 합니다. 각 등록자의 세부정보는 동일한 템플릿을 채우고, 고유한 티켓 ID나 체크인 URL을 인코딩하는 QR 코드는 참석자별로 생성됩니다. ChromePdfRenderer는 HTML을 PDF로 변환하는 과정을 처리하고 애플리케이션은 이를 이메일로 전달하거나 등록 포털에서 다운로드 가능하게 만듭니다.
제삼자 티켓 API 요금이 없고, 디자인 도구 내보내기가 없으며, 등록 확인과 티켓 전달 사이에 수동 단계가 없습니다. 렌더링은 기존 .NET 애플리케이션 내에서 실행됩니다. PDF 처리용으로 하나의 C# NuGet 라이브러리(IronPDF), 하나의 IronQR 라이브러리가 있고, 파이프라인은 자체적으로 포함되어 있습니다.
실제 적용 사례
1. 등록 마감 후 트리거 발생
BackgroundService, Hangfire 반복 작업, 또는 등록 시스템이 호출하는 웹훅 엔드포인트가 티켓 생성을 트리거합니다. 각 등록이 완료된 직후 또는 이벤트 날짜 전에 일괄 실행됩니다. 작업은 등록 데이터베이스에서 확인된 각 참석자의 이름, 이메일, 티켓 유형, 할당된 세션, 좌석 또는 테이블 번호, 고유 티켓 ID를 쿼리합니다.
2. 참석자별로 생성된 QR 코드와 함께 PDF 생성
각 참석자는 티켓 ID 또는 전체 체크인 URL을 인코딩하는 QR 코드를 받습니다. 예를 들면 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명의 참석자에 대한 배치 실행은 사용 가능한 코어에 병렬 처리되어 몇 분 내에 완료되며, 이벤트 전날에 당황하여 처리하는 일이 아닙니다.
브랜드 일관성. 모든 티켓과 배지는 동일한 이벤트 브랜드, 스폰서 로고, 타이포그래피를 담고 있습니다. VIP 패스, 연사 배지, 일반 입장 티켓 모두 동일한 디자인 시스템에서 나온 것처럼 보입니다. 실제로 그렇기 때문입니다. 팀이 유지 관리하는 동일한 HTML 콘텐츠와 CSS 때문입니다.
사기 방지. 각 QR 코드는 특정 등록 기록에 연결된 고유한 티켓 ID를 인코딩합니다. 도어 직원이 스캔할 때, 시스템은 데이터베이스를 확인합니다. 중복된 PDF는 시스템에서 즉시 표시하는 중복 스캔을 생성합니다.
빠른 체크인. QR 코드를 스캔하고 등록 기록과 대조하는 데 1초도 걸리지 않습니다. 이름 조회도 없고, 인쇄된 목록도 없고, 느린 수동 확인도 없습니다. 대기열이 더 빨리 이동하며 직원은 모든 입장을 수동으로 처리하는 대신 예외 처리를 관리할 수 있습니다.
템플릿 유연성. 다양한 이벤트 역할에 따라 다른 레이아웃을 얻으며, 라운지 접근 세부 정보가 포함된 VIP 패스, 일정 하이라이트가 포함된 연사 배지, 백스테이지 표시가 있는 스태프 인증이 있습니다. 하나의 생성 파이프라인, 여러 HTML 템플릿, 하나의 배포.
티켓당 비용 없음. 파이프라인이 프로세스 내에서 실행됩니다. 티켓 벤더에 대한 API 호출이 없고, 사용량 측정이 없으며, 등록 수에 따라 증가하는 문서당 요금이 없습니다.
마무리
티켓과 배지 생성은 기존 플랫폼에서 해결된 문제처럼 보이지만, 이벤트가 실질적인 커스터마이징 요구사항, 대규모 참석자 목록, 또는 플랫폼이 지원하지 않는 통합 요구사항이 있을 때까지입니다. .NET 애플리케이션 내에서 파이프라인을 구축하면 팀이 레이아웃, 데이터, 전달 타이밍 및 비용을 완전히 제어할 수 있습니다.
IronPDF는 C#에서 PDF 생성의 전체 수명을 처리하며, 픽셀 단위의 HTML 템플릿 렌더링에서 저장, 디지털 서명 및 암호화 적용, 스트리밍, 문서 조작까지 ironpdf.com을 통해 사용할 수 있는 주요 기능을 제공합니다. 등록 시스템을 구축하고 있거나 외부 티켓 종속성을 대체하는 경우, 전체 라이브러리는 사용자 자신의 이벤트 데이터를 테스트할 수 있도록 제공됩니다. 무료 체험을 통해 IronPDF를 무료로 시도할 수 있습니다.




