Generowanie miesięcznych wyciągów z konta w formacie PDF
Problem z generowaniem instrukcji na dużą skalę
W przypadku niewielkiej bazy klientów eksportowanie pliku CSV i ręczne formatowanie jest powolne, ale wykonalne. Przy kilkuset klientach staje się to zadaniem wymagającym pełnego zaangażowania. Przy kilku tysiącach staje się to wąskim gardłem, które blokuje cykl rozliczeniowy.
SSRS i Crystal Reports przez długi czas były standardowym rozwiązaniem. Nadal działają, ale wynik wygląda jakby pochodził z 2008 roku, trudno go dostosować do motywu, jest kosztowny w utrzymaniu i nie pasuje do projektu wizualnego, który przyjęła reszta produktu. Aktualizacja definicji raportu wymaga pomocy specjalisty, a wynik rzadko odpowiada marce bez znacznego wysiłku.
API do generowania oświadczeń stron trzecich rozwiązują problem wyglądu, ale wprowadzają nowe problemy. Ceny za dokument są bezpośrednio uzależnione od wzrostu liczby klientów, co oznacza, że koszty infrastruktury rosną wraz z sukcesem firmy. Istnieje również zależność sieciowa: jeśli API jest niedostępne podczas cyklu rozliczeniowego, cały cykl ulega zatrzymaniu.
Wymiar wydajności nie jest bez znaczenia. Platforma SaaS generująca podsumowania użytkowania dla 10 000 klientów pierwszego dnia miesiąca, system telekomunikacyjny tworzący szczegółowe rejestry połączeń, zarządca nieruchomości rozsyłający rejestry czynszów do setek najemców – wszystkie te rozwiązania mają określony czas, w którym muszą zakończyć działanie. Podejście, które nie jest zaprojektowane pod kątem przepustowości, nie spełni tego zadania.
Klienci oczekują natomiast dokumentu z brandingiem, który wygląda tak, jakby należał do produktu, za który płacą, a nie surowego eksportu danych z logo umieszczonym na wierzchu.
Ten przykład IronPDF pokazuje, w jaki sposób nowoczesne aplikacje .NET mogą automatycznie generować markowe dokumenty PDF na podstawie plików HTML i dostarczać je klientom na dużą skalę. Korzystając z biblioteki IronPDF C# PDF, programiści mogą konwertować HTML na niezawodne pliki PDF w ramach projektu .NET bez konieczności korzystania z usług zewnętrznych. Przedstawione tutaj podejście działa na wielu platformach, łatwo integruje się z Visual Studio i wykorzystuje znaną bibliotekę NuGet do dystrybucji plików PDF, której programiści .NET już ufają.
Rozwiązanie: Generowanie plików PDF w trybie wsadowym za pomocą biblioteki IronPDF C# PDF
IronPDF umożliwia aplikacjom .NET generowanie spersonalizowanych dokumentów PDF na podstawie szablonów HTML i CSS w pętli wsadowej lub w tle. Dane każdego klienta wypełniają ten sam szablon, ChromePdfRenderer generuje plik PDF, a aplikacja dostarcza go pocztą elektroniczną lub umieszcza na portalu samoobsługowym.
Nie ma potrzeby utrzymywania instalacji SSRS, odnawiania licencji Crystal Reports ani ponoszenia opłat za dokument, które rosną wraz z liczbą klientów. IronPDF działa w ramach istniejącej aplikacji .NET jako pojedynczy pakiet NuGet bez procesów zewnętrznych. Szablon HTML jest własnością Twojego zespołu, stylizowany jest przy użyciu tego samego CSS, który obsługuje resztę produktu, i aktualizowany zgodnie z Twoim harmonogramem.
Instalacja pakietu IronPDF NuGet
Większość programistów instaluje IronPDF za pomocą menedżera pakietów NuGet w Visual Studio. Otwórz Eksplorator rozwiązań programu Visual Studio, kliknij prawym przyciskiem myszy opcję Odwołania, wybierz Zarządzaj pakietami NuGet, a następnie wyszukaj (Ctrl) IronPDF i kliknij Zainstaluj IronPDF.
Obok listy pakietów widnieje logo NuGet, potwierdzające dostępność najnowszej wersji NuGet. Po zainstalowaniu dodaj wymaganą przestrzeń nazw do swojego projektu:
using IronPdf;
using IronPdf;
Imports IronPdf
IronPDF jest dostarczany jako biblioteka DLL C# PDF dystrybuowana za pośrednictwem biblioteki C# NuGet, co sprawia, że instalacja jest prosta w przypadku każdego przepływu pracy z dokumentami .NET.
Jak to działa w praktyce: Korzystanie z IronPDF w projektach .NET
1. Zaplanowane zadanie uruchamia proces rozliczeniowy
Usługa BackgroundService, cykliczne zadanie Hangfire lub harmonogram Quartz.NET uruchamia się na początku każdego okresu rozliczeniowego, zazwyczaj o północy pierwszego dnia miesiąca. Zadanie wysyła zapytanie do bazy danych rozliczeniowej o wszystkich aktywnych klientów i ich dane za dany okres: pozycje, opłaty, kredyty, saldo bieżące i wskaźniki użytkowania.
Zapytanie zwraca jeden zestaw rekordów na klienta. Od tego momentu generowanie instrukcji przebiega w pętli.
2. Szablon HTML jest wypełniany indywidualnie dla każdego klienta
Szablonem jest standardowy ciąg znaków HTML lub wyrenderowany widok Razor. Zawiera logo firmy (osadzone jako URI danych base64 w celu bezpiecznego renderowania), numer konta klienta, okres rozliczeniowy oraz wszystkie szczegóły rozliczeniowe uporządkowane w sekcje: zestawienie zużycia, opłaty, kredyty i saldo końcowe.
Szablon stanowi jedyne wiarygodne źródło informacji o tym, jak wygląda każde stwierdzenie. Gdy zespół prawny potrzebuje nowego stopki z informacjami prawnymi lub zespół projektowy aktualizuje schemat kolorów, zmienia się jeden plik, a każde przyszłe oświadczenie odzwierciedla tę zmianę.
3. ChromePdfRenderer renderuje każde oświadczenie
W tym przykładzie IronPDF, ChromePdfRenderer konwertuje dynamiczną zawartość HTML na wygenerowany dokument PDF, pokazując, jak nowoczesna przeglądarka PDF, taka jak Adobe Reader, może wyświetlać końcową zawartość PDF dokładnie tak, jak została zaprojektowana.
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
foreach (var customer in activeCustomers)
{
string html = $@"
<h1>Account Statement — {customer.StatementPeriod}</h1>
<p><strong>Account:</strong> {customer.AccountNumber}</p>
<p><strong>Name:</strong> {customer.FullName}</p>
<hr/>
<h2>Charges This Period</h2>
{customer.LineItemsHtml}
<p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";
PdfDocument statement = renderer.RenderHtmlAsPdf(html);
await DeliverStatementAsync(customer, statement);
}
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
foreach (var customer in activeCustomers)
{
string html = $@"
<h1>Account Statement — {customer.StatementPeriod}</h1>
<p><strong>Account:</strong> {customer.AccountNumber}</p>
<p><strong>Name:</strong> {customer.FullName}</p>
<hr/>
<h2>Charges This Period</h2>
{customer.LineItemsHtml}
<p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";
PdfDocument statement = renderer.RenderHtmlAsPdf(html);
await DeliverStatementAsync(customer, statement);
}
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
For Each customer In activeCustomers
Dim html As String = $"
<h1>Account Statement — {customer.StatementPeriod}</h1>
<p><strong>Account:</strong> {customer.AccountNumber}</p>
<p><strong>Name:</strong> {customer.FullName}</p>
<hr/>
<h2>Charges This Period</h2>
{customer.LineItemsHtml}
<p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>"
Dim statement As PdfDocument = renderer.RenderHtmlAsPdf(html)
Await DeliverStatementAsync(customer, statement)
Next
Wynikowy dokument PDF
Ponowne wykorzystanie tej samej instancji ChromePdfRenderer w pętli pozwala uniknąć zbędnego obciążenia związanego z inicjalizacją. W przypadku baz klientów liczących tysiące pozycji zadanie może podzielić listę i uruchamiać równoległe partie na dostępnych rdzeniach, aby zmieścić się w oknie rozliczeniowym.
4. Plik PDF dostarczany pocztą elektroniczną i przechowywany w celu uzyskania dostępu przez portal
Klasa PdfDocument udostępnia metodę BinaryData, która zapisuje dane bezpośrednio do strumienia MemoryStream w celu dołączenia do wiadomości e-mail, bez konieczności zapisywania w systemie plików:
using System.Net.Mail;
using System.IO;
async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
var pdfBytes = statement.BinaryData;
// Store in blob storage for portal download
await _blobClient.UploadAsync(
$"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
new BinaryData(pdfBytes)
);
// Email to customer
using var stream = new MemoryStream(pdfBytes);
using var attachment = new Attachment(stream,
$"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
var message = new MailMessage("billing@yourcompany.com", customer.Email)
{
Subject = $"Your {customer.StatementPeriod} Statement",
Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
};
message.Attachments.Add(attachment);
using var smtp = new SmtpClient("smtp.yourprovider.com");
await smtp.SendMailAsync(message);
}
using System.Net.Mail;
using System.IO;
async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
var pdfBytes = statement.BinaryData;
// Store in blob storage for portal download
await _blobClient.UploadAsync(
$"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
new BinaryData(pdfBytes)
);
// Email to customer
using var stream = new MemoryStream(pdfBytes);
using var attachment = new Attachment(stream,
$"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
var message = new MailMessage("billing@yourcompany.com", customer.Email)
{
Subject = $"Your {customer.StatementPeriod} Statement",
Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
};
message.Attachments.Add(attachment);
using var smtp = new SmtpClient("smtp.yourprovider.com");
await smtp.SendMailAsync(message);
}
Imports System.Net.Mail
Imports System.IO
Async Function DeliverStatementAsync( _
customer As CustomerRecord, _
statement As PdfDocument) As Task
Dim pdfBytes = statement.BinaryData
' Store in blob storage for portal download
Await _blobClient.UploadAsync( _
$"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf", _
New BinaryData(pdfBytes) _
)
' Email to customer
Using stream As New MemoryStream(pdfBytes)
Using attachment As New Attachment(stream, _
$"Statement-{customer.StatementPeriod}.pdf", "application/pdf")
Dim message As New MailMessage("billing@yourcompany.com", customer.Email) With { _
.Subject = $"Your {customer.StatementPeriod} Statement", _
.Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached." _
}
message.Attachments.Add(attachment)
Using smtp As New SmtpClient("smtp.yourprovider.com")
Await smtp.SendMailAsync(message)
End Using
End Using
End Using
End Function
Przykładowa wiadomość e-mail z załączoną fakturą w formacie PDF
Magazyn obiektów indeksuje pliki według numeru konta i okresu, dzięki czemu wyszukiwanie w portalu jest proste. Klienci pobierają bieżące i historyczne wyciągi bez konieczności kontaktowania się z pomocą techniczną.
Korzyści w praktyce
Skala. IronPDF renderuje każde oświadczenie w ciągu milisekund. Rozliczenie dla 5000 klientów trwa zaledwie kilka minut, gdy jest wykonywane równolegle na wielu rdzeniach, co mieści się w typowym nocnym oknie rozliczeniowym.
Spójność marki. Każde oświadczenie zawiera to samo logo, kolorystykę, typografię i układ. Nie ma ryzyka, że eksport będzie niezgodny lub że oświadczenie będzie wyglądało inaczej, ponieważ zostało wygenerowane przez innego członka zespołu.
Samoobsługa klienta. Wyciągi przechowywane w magazynie obiektów blob są dostępne do pobrania z portalu natychmiast po zakończeniu cyklu rozliczeniowego. Klienci samodzielnie pobierają dane dotyczące bieżącego i poprzednich okresów, dzięki czemu odpowiednio spada liczba zgłoszeń do pomocy technicznej z pytaniem "czy możecie ponownie wysłać mi wyciąg?".
Zgodność i archiwizacja. IronPDF obsługuje format wyjściowy PDF/A, znormalizowany przez ISO format do długoterminowej archiwizacji dokumentów. W przypadku instytucji finansowych i branż podlegających regulacjom wyciągi w formacie PDF/A spełniają wymogi dotyczące przechowywania dokumentacji bez konieczności przeprowadzania oddzielnego etapu archiwizacji. Włączenie tej funkcji jest opcją dostępną w ramach jednego renderowania.
Ponowne wykorzystanie szablonów. Szablon HTML i CSS jest utrzymywany przez Twój zespół wraz z pozostałą częścią kodu aplikacji. Aktualizacja wymaga tych samych umiejętności, co w przypadku innych widoków — nie jest potrzebny projektant raportów ani zastrzeżony format definicji.
Brak kosztów za dokument. Renderowanie odbywa się w trakcie procesu. Nie ma wywołań API do dostawcy usług, nie ma mierzonego zużycia do śledzenia, ani pozycji na rachunku za infrastrukturę, która rośnie wraz z liczbą klientów.
Pierwsze kroki z IronPDF
Programiści mogą przetestować bibliotekę, korzystając z w pełni funkcjonalnej bezpłatnej wersji próbnej, która obejmuje klucz próbny dostępny po utworzeniu konta za pośrednictwem formularza próbnego. Podczas oceny nie jest wymagany test z użyciem karty kredytowej, co oznacza, że zespoły mogą zapoznać się z kluczowymi funkcjami bez żadnych zobowiązań.
IronPDF jest częścią szerszego pakietu Iron Suite, często reprezentowanego przez logo Iron Suite Enterprise oraz branding związany z Iron Suite widoczny na logo klientów Iron Software. Zestaw narzędzi pomaga firmom rozwiązywać problemy związane z przepływem dokumentów w aplikacjach .NET i systemach Enterprise.
Jeśli chcesz zapoznać się z instrukcją, możesz poprosić zespół ds. prezentacji oprogramowania o prezentację na żywo, osobistą prezentację lub prezentację produktów Iron Software. Zespół sprzedaży organizuje spotkania, podczas których konsultanci ds. przedsiębiorstw z Iron Software oraz specjaliści ds. konsultacji dla przedsiębiorstw przedstawiają zalecenia dotyczące konkretnych funkcji projektu i odpowiadają na pytania techniczne.
Zakończenie
Generowanie miesięcznych zestawień wydaje się problemem rozwiązanym, dopóki nie spróbuje się tego zrobić na dużą skalę, zachowując spójny wizerunek marki i niezawodność dostaw. Narzędzia, które były standardem dziesięć lat temu, generują wyniki, które nie pasują już do wyglądu produktów, a alternatywne rozwiązania SaaS zamieniają jeden zestaw ograniczeń na inny.
Pętla wsadowa oparta na IronPDF zastępuje to wszystko szablonem HTML, rendererem i etapem dostarczania, a wszystko to działa w aplikacji, którą Twój zespół już posiada i obsługuje. IronPDF obejmuje pełny cykl życia pracy z plikami PDF w języku C# — od renderowania i generowania dokumentów po ich zapisywanie, przesyłanie strumieniowe i manipulowanie nimi — a wszystko to z tej samej biblioteki dostępnej na stronie ironpdf.com. Jeśli tworzysz lub przeprojektowujesz potok rozliczeniowy, rozpocznij bezpłatny 30-dniowy okres próbny i przeprowadź pełny cykl rozliczeniowy na własnych danych przed podjęciem ostatecznej decyzji.




