Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Przekształcanie internetowych formularzy zgłoszeniowych w podsumowania w formacie PDF za pomocą IronPDF

Problem z ręczną generacją biletów i plakietek

Strona główna IronPDF Projektowanie biletów w Figma lub Canva i ich ręczny eksport na małą prywatną kolację z dwudziestoma gośćmi jest wykonalne. Dla konferencji technologicznej z 3 000 uczestników w pięciu poziomach biletów nie jest to proces, to odpowiedzialność.

Ogólne platformy biletowe rozwiązują problem dystrybucji, ale ograniczają wszystko inne. Opcje znakowania ograniczają się do wgrania logo i wyboru koloru. Niestandardowe układy dla wejściówek VIP, identyfikatorów prelegentów i uprawnień personelu wymagają osobnych eksportów z różnych narzędzi. Kiedy na szczycie korporacyjnym wymagana jest plakietka siedzeniowa do kolacji powiązana z rejestracją i specyficznym kodem QR sesji, większość platform nie ma rozwiązania.

Bez unikalnego, możliwego do zeskanowania identyfikatora na każdym bilecie, odprawa staje się wąskim gardłem. Lista wydrukowana lub wyszukiwanie nazwiska przy drzwiach opóźnia wejście dla wszystkich i stwarza możliwości oszustwa; zduplikowany PDF bez unikalnego kodowania przechodzi inspekcję wizualną i nie jest wykryty, dopóki ktoś inny nie spróbuje użyć tego samego biletu w tym samym czasie.

Uczestnicy zauważają również różnicę między profesjonalnym dokumentem wydarzenia a potwierdzeniem w formie tekstu zwykłego z odniesieniem do rezerwacji ukrytym w treści. Festiwal muzyczny, gala non-profit, szczyt korporacyjny; każdy spodziewa się materiałów odzwierciedlających markę wydarzenia, a nie domyślnego szablonu z systemu trzeciej strony.

Rozwiązanie: Spersonalizowane bilety PDF C# generowane wewnątrz Twojej aplikacji .NET

IronPDF pozwala aplikacjom .NET generować markowe bilety i identyfikatory PDF z HTML i szablonów CSS wypełnionych danymi uczestników i wbudowanymi obrazami kodów QR. Szczegóły każdego rejestrującego wypełniają ten sam szablon, kod QR jest generowany dla każdego uczestnika, kodując ich unikalny identyfikator biletu lub URL rejestracji, a ChromePdfRenderer obsługuje proces HTML to PDF, a aplikacja dostarcza to e-mailem lub umożliwia pobranie w portalu rejestracyjnym.

Nie ma opłat za API zewnętrznych dostawców biletów, eksportów narzędzi projektowych, ani ręcznych kroków między potwierdzeniem rejestracji a dostarczeniem biletu. Renderowanie działa wewnątrz istniejącej aplikacji .NET, jedna biblioteka NuGet C# do przetwarzania PDF (IronPDF), jedna do IronQR, a pipeline jest samodzielny.

Jak to działa w praktyce

1. Wyzwalacz działa po zamknięciu rejestracji

Usługa w tle, powtarzająca się praca Hangfire lub punkt końcowy webhook wywołany przez system rejestracji wyzwala generowanie biletów, albo natychmiast po potwierdzeniu każdej rejestracji, albo w partii przed datą wydarzenia. Zadanie zapytuje bazę danych rejestracji dla każdego potwierdzonego uczestnika: imię, email, typ biletu, przydzielone sesje, miejsce lub numer stołu i unikalny ID biletu.

2. Utwórz PDF z kodem QR generowanym dla każdego uczestnika

Każdy uczestnik otrzymuje kod QR kodujący albo ich ID biletu, albo pełny URL odprawy, na przykład, https://event.example.com/checkin/`{ticketId}`. Kod jest renderowany jako PNG i konwertowany na ciąg base64 dla łatwego bezpośredniego osadzania w szablonie HTML, bez potrzeby pisania do systemu plików:

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} &nbsp;|&nbsp; <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} &nbsp;|&nbsp; <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} &nbsp;|&nbsp; <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)
$vbLabelText   $csharpLabel

Przykładowy wynik

Przykładowy plik PDF z IronPDF Dane URI w formacie base64 osadzają obraz QR bezpośrednio w HTML, dzięki czemu zawartość PDF jest poprawnie renderowana niezależnie od miejsca wdrożenia aplikacji, brak zależności od ścieżki pliku lub CDN dostępnego w czasie renderowania.

3. Dokument PDF wysyłany mailem i przechowywany do pobrania w portalu

Renderowany dokument PDF jest przesyłany bezpośrednio do MemoryStream jako załącznik maila, z kopią wgrywaną do przechowywania blob dla dostępu portalowego i na miejscu do ponownego wydruku:

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
$vbLabelText   $csharpLabel

Przykład emaila z załączonym biletem

Przykładowy wysłany email Dla wydarzeń z tysiącami rejestrowanych, zadanie dzieli listę uczestników i przetwarza partie równolegle, jedna instancja ChromePdfRenderer na wątek, aby zakończyć działanie na długo przed datą wydarzenia.

Korzyści w praktyce

Skalowalność. IronPDF renderuje każdy bilet w milisekundach. Partia dla 3 000 uczestników, zrównoleglona na dostępnych rdzeniach, kończy się w minutach, nie godzinach i nie dzień przed wydarzeniem w panice.

Spójność brandingu. Każdy bilet i identyfikator nosi te same oznaczenia wydarzenia, loga sponsorów i typografię. Wejściówki VIP, identyfikatory prelegentów i bilety na wejście ogólne wszystko wygląda, jakby pochodziły z tego samego systemu projektowania, ponieważ tak jest, ta sama zawartość HTML i CSS, które zespół utrzymuje.

Zapobieganie oszustwom. Każdy kod QR koduje unikalny identyfikator biletu powiązany z określonym rekordem rejestracji. Kiedy personel przy drzwiach go zeskanuje, system weryfikuje go względem bazy danych. Zduplikowany PDF produkuje zdublowane skanowanie, które system natychmiast znak.

Szybka odprawa. Skanowanie kodu QR i weryfikacja względem rekordu rejestracyjnego zajmuje mniej niż sekundę. Brak konieczności wyszukiwania nazwisk, brak wydrukowanych list, brak powolnego ręcznego weryfikowania. Kolejki przy wejściu przesuwają się szybciej, a personel może zarządzać wyjątkami zamiast zajmować się każdym wpisem ręcznie.

Elastyczność szablonu. Różne role wydarzeń dostają różne układy, wejściówki VIP z szczegółami dostępu do strefy VIP, identyfikatory prelegentów z wyróżnionymi punktami programu, uprawnienia personelu z wskaźnikami dostępu do backstage. Jeden pipeline generacyjny, wiele szablonów HTML, jedno wdrożenie.

Brak kosztów za bilet. Pipeline działa w procesie. Nie ma połączeń API do dostawcy biletów, brak liczenia użycia i brak opłat za dokument, które rosną wraz ze wzrostem liczby rejestracji.

Zakończenie

Generowanie biletów i identyfikatorów to jeden z tych problemów, które wydają się rozwiązane przez istniejące platformy, aż do momentu, gdy wydarzenie ma rzeczywiste wymagania dostosowania, dużą listę uczestników lub potrzeby integracyjne, których platforma nie obsługuje. Budowanie pipeline wewnątrz aplikacji .NET daje zespołowi pełną kontrolę, nad układem, danymi, czasem dostarczenia i kosztami.

IronPDF obsługuje pełen cykl życia generowania PDF w C# z kluczowymi funkcjami od doskonałego pikselowo renderowania szablonów HTML po zapisywanie ich, stosowanie podpisów cyfrowych i szyfrowanie, strumieniowanie i manipulowanie dokumentami, wszystko na ironpdf.com. Jeśli budujesz system rejestracji lub zastępujesz zewnętrzną zależność biletową, pełna biblioteka jest dostępna do testów z Twoimi własnymi danymi wydarzenia, możesz wypróbować IronPDF za darmo z bezpłatną wersją próbną.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie