Transformando formulários de inscrição online em resumos em PDF usando o IronPDF
O Problema Com a Geração Manual de Ingressos e Crachás
Para um pequeno jantar privado com vinte convidados, projetar ingressos no Figma ou Canva e exportá-los manualmente é gerenciável. Para uma conferência de tecnologia com 3.000 participantes distribuídos por cinco níveis de ingresso, isso não é um processo, é uma responsabilidade.
Plataformas de bilhética genéricas resolvem o problema de distribuição, mas restringem todo o resto. As opções de marca são limitadas a um upload de logotipo e um seletor de cores. Layouts personalizados para passes VIP, crachás de palestrantes e credenciais de equipe exigem exportações separadas de diferentes ferramentas. Quando uma cúpula corporativa precisa de um crachá de assento para um jantar que se vincula a um registro de inscrição e a um código QR específico para sessões, a maioria das plataformas não tem resposta.
Sem um identificador único e escaneável em cada ingresso, o check-in torna-se um gargalo. Uma lista impressa ou uma pesquisa de nome na porta desacelera a entrada para todos e cria oportunidades de fraude, um PDF duplicado sem codificação única passa na inspeção visual e não é pego até que alguém tente usar o mesmo ingresso ao mesmo tempo.
Os participantes também notam a diferença entre um documento de evento profissional e uma confirmação em texto simples com uma referência de reserva enterrada no corpo. Um festival de música, um gala de caridade, uma cúpula corporativa, cada evento espera materiais que reflitam a marca do evento, não um padrão de modelo de um sistema de terceiros.
A Solução: Ingressos PDF Personalizados em C# Gerados Dentro da Sua Aplicação .NET
IronPDF permite que aplicações .NET gerem ingressos PDF com a marca e crachás a partir de HTML e modelos CSS preenchidos com dados dos participantes e imagens de códigos QR incorporadas. Os detalhes de cada registrado preenchem o mesmo modelo, um código QR é gerado por participante codificando seu ID de ingresso único ou URL de check-in, ChromePdfRenderer cuida do processo HTML para PDF, e a aplicação o entrega por e-mail ou o disponibiliza para download em um portal de registro.
Não há taxas de API de bilhética de terceiros, sem exportações de ferramentas de design, e sem passos manuais entre a confirmação de registro e a entrega do ingresso. A renderização ocorre dentro da aplicação .NET existente, uma biblioteca NuGet C# para processamento de PDF (IronPDF), uma para IronQR, e o pipeline é auto-suficiente.
Como funciona na prática
1. Gatilho É Acionado Após o Fechamento do Registro
Um BackgroundService, um trabalho recorrente do Hangfire, ou um endpoint de webhook chamado pelo sistema de registro aciona a geração de ingressos, ou imediatamente após a confirmação de cada registro ou em um lote antes da data do evento. O trabalho consulta o banco de dados de registro para cada participante confirmado: nome, e-mail, tipo de ingresso, sessões atribuídas, número de assento ou mesa, e um ID de ingresso único.
2. Criar um PDF com Código QR Gerado por Participante
Cada participante recebe um código QR codificando ou seu ID de ingresso ou um URL completo de check-in, por exemplo, https://event.example.com/checkin/`{ticketId}`. O código é renderizado como um PNG e convertido para uma string base64 para fácil incorporação direta no modelo HTML, sem necessidade de gravação no sistema de arquivos:
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)
Exemplo de saída
O URI de dados base64 incorpora a imagem QR diretamente no HTML, assim o conteúdo do PDF é renderizado corretamente independentemente de onde a aplicação é implantada, sem dependência de um caminho de arquivo ou CDN sendo acessível no momento da renderização.
3. Documento PDF Enviado por E-mail e Armazenado para Download no Portal
O PdfDocument renderizado é transmitido diretamente para um MemoryStream para anexo de e-mail, com uma cópia carregada no armazenamento em blob para acesso ao portal e reimpressão no local:
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
Exemplo de e-mail com bilhete anexado
Para eventos com milhares de inscritos, o trabalho divide a lista de participantes e processa lotes em paralelo, uma instância de ChromePdfRenderer por thread, para completar a execução bem antes da data do evento.
Benefícios no mundo real
Escala. IronPDF renderiza cada bilhete em milissegundos. Uma execução em lote para 3.000 participantes, paralelizada em todos os núcleos disponíveis, é concluída em minutos, e não horas, e não no dia anterior ao evento em pânico.
Consistência de marca. Cada bilhete e crachá carrega a mesma marca do evento, logotipos dos patrocinadores e tipografia. Passes VIP, crachás de palestrantes e ingressos de admissão geral parecem todos ter vindo do mesmo sistema de design, porque vieram, o mesmo conteúdo HTML e CSS que a equipe mantém.
Prevenção de fraude. Cada código QR codifica um ID de bilhete exclusivo vinculado a um registro de inscrição específico. Quando a equipe da porta o escaneia, o sistema valida contra o banco de dados. Um PDF duplicado produz uma digitalização duplicada que o sistema sinaliza imediatamente.
Check-in rápido. Escanear um código QR e validar contra um registro de inscrição leva menos de um segundo. Sem buscas por nome, sem listas impressas, sem verificação manual lenta. As filas de entrada se movem mais rápido e a equipe pode gerenciar exceções em vez de lidar manualmente com cada entrada.
Flexibilidade de modelo. Diferentes papéis no evento recebem layouts diferentes, passes VIP com detalhes de acesso ao lounge, crachás de palestrantes com destaques da programação, credenciais de equipe com indicadores de bastidores. Uma única linha de geração, múltiplos modelos HTML, um único deployment.
Sem custos por bilhete. A linha executa-se no processo. Não há chamadas de API para um fornecedor de bilhetes, sem medição de uso e sem taxa por documento que cresce com o número de registros.
Encerramento
A geração de bilhetes e crachás é um daqueles problemas que parecem resolvidos por plataformas existentes até que o evento tenha requisitos reais de personalização, uma grande lista de participantes, ou necessidades de integração que a plataforma não suporta. Construir a linha dentro do aplicativo .NET dá à equipe controle total sobre layout, dados, tempo de entrega e custo.
IronPDF lida com o ciclo de vida completo da geração de PDF em C# com recursos-chave que variam desde a renderização em pixel de modelos HTML até salvá-los, aplicação de assinaturas digitais e criptografia, streaming e manipulação de documentos, tudo a partir de ironpdf.com. Se você estiver construindo um sistema de inscrição ou substituindo uma dependência de bilhetagem externa, a biblioteca completa está disponível para testar contra seus próprios dados de eventos, você pode experimentar o IronPDF gratuitamente com o teste gratuito.




