Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

C# PDF-owe pokwitowania i rejestry transakcji dla aplikacji FinTech

Problem z przygotowaniem umów na dużą skalę

IronPDF Zamknięcie umowy, a ktoś z zespołu sprzedaży otwiera dokument Word, kopiuje w nim prawne imię klienta, aktualizuje wartość umowy, zmienia datę wejścia w życie i eksportuje do PDF. Następnie wysyła go e-mailem do działu prawnego w celu przeglądu przed wysłaniem do klienta. Ten przepływ pracy zawodzi jednocześnie na trzy różne sposoby: jest wolny, wprowadza błąd ludzki i nie skaluje się.

Błędy kopiowania w umowach mają rzeczywiste konsekwencje, nieprawidłowe imię klienta na głównej umowie serwisowej, nieaktualna figura płatności niezgodna z CRM, pozostawiony znacznik, który trafia do skrzynki odbiorczej klienta. Kontrola wersji pogłębia problem: kiedy trzy osoby mają lokalną kopię szablonu bazowego i wprowadzają własne poprawki, "zatwierdzony" szablon umowy przestaje istnieć w jakimkolwiek sensownym zakresie.

Starsze narzędzia pogarszają sytuację. Interoperacyjność COM z Word działa na komputerze dewelopera i zawodzi w kontenerze lub środowisku chmurowym. Scalanie poczty to manualny proces pod przykrywką automatyzacji. Zewnętrzne API generowania umów rozwiązują części problemu, ale dodają opłatę za dokument, skalującą się w stosunku do wolumenu umów, plus zewnętrzne zależności, które znajdują się na kluczowej ścieżce w momencie zamknięcia umowy.

Platformy nieruchomości generujące umowy najmu dla każdego nowego najemcy, dostawcy ubezpieczeń wydający dokumenty polisowe dla każdego wnioskodawcy, agencje zatrudnienia tworzące umowy o pracę z klauzulami specyficznymi dla ról, firmy SaaS tworzące zlecenia głównych usług kiedy umowa osiąga status "zamknięta - wygrana", wszystkie się na to napotykają

Rozwiązanie: Scalanie szablonów i renderowanie dokumentów PDF w .NET

IronPDF to potężna biblioteka PDF, która pozwala aplikacjom .NET generować gotowe do podpisania umowy PDF z HTML, szablonów JavaScript i CSS połączonych z danymi klienta w czasie rzeczywistym. Zespół prawny utrzymuje umowę jako plik HTML z znacznikami zastępczymi. Aplikacja wypełnia te znaczniki z CRM lub bazy danych, ChromePdfRenderer konwertuje wynik na plik PDF, a aplikacja dostarcza go do e-podpisu, pobierania z portalu lub bezpośredniego e-maila.

Nie ma interoperacyjności z Word, nie ma procesu scalania poczty i nie ma opłaty API za dokument. Renderowanie odbywa się wewnątrz istniejącej aplikacji .NET jako biblioteka NuGet dla C#, bez żadnych zewnętrznych procesów i bez dodatkowej infrastruktury - tylko prosty, wszystko-w-jednym pakiet NuGet. Gdy umowa jest zamykana, umowa jest gotowa w ciągu kilku sekund. W kolejnej sekcji omówimy przykład IronPDF, w jaki sposób można obsłużyć tę pracę i tworzyć dokumenty PDF z łatwością.

Jak to działa w praktyce: Konwersja PDF w języku C

1. Wybuch inicjuje generowanie umów

Wyzwalaczem może być webhook CRM wystrzelony, kiedy umowa osiąga stan "zamknięta-wygrana", użytkownik klikający "Generuj umowę" w wewnętrznym narzędziu administracyjnym lub połączenie API upstream z systemu wycen. W każdym przypadku handler otrzymuje ID transakcji i wie, który szablon umowy jest odpowiedni, standardową MSA, umowę najmu, umowę o pracę z klauzulami specyficznymi dla jurysdykcji.

2. Szablon zostaje załadowany z zawartości HTML i wypełniony danymi z transakcji

Szablon HTML jest przechowywany w magazynie blobów, CMS lub wersjonowany obok aplikacji. Zawiera on znaczniki zastępcze dla każdego pola zmiennego:

<p>This agreement is entered into by <strong>{{ClientLegalName}}</strong>
("Client") and {{CompanyName}} ("Provider"), effective {{EffectiveDate}}.</p>
<p>Contract Value: {{ContractValue}} | Payment Terms: {{PaymentTerms}}</p>
<p>This agreement is entered into by <strong>{{ClientLegalName}}</strong>
("Client") and {{CompanyName}} ("Provider"), effective {{EffectiveDate}}.</p>
<p>Contract Value: {{ContractValue}} | Payment Terms: {{PaymentTerms}}</p>
HTML

Sekcje warunkowe - klauzula NDA, która występuje tylko w przypadku umów korporacyjnych, paragraf dotyczący prawa obowiązującego, który zmienia się w zależności od jurysdykcji - są renderowane lub pomijane zgodnie ze znacznikami na rekordzie transakcji.

3. ChromePdfRenderer Converts HTML to PDF

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.MarginTop = 25;

renderer.RenderingOptions.MarginBottom = 25;

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.Letter;

string template = await File.ReadAllTextAsync("templates/msa.html");

string contractHtml = template
    .Replace("{{ClientLegalName}}", deal.ClientLegalName)
    .Replace("{{CompanyName}}", deal.ProviderName)
    .Replace("{{EffectiveDate}}", deal.EffectiveDate.ToString("MMMM d, yyyy"))
    .Replace("{{ContractValue}}", deal.Value.ToString("C"))
    .Replace("{{PaymentTerms}}", deal.PaymentTerms);

PdfDocument contract = renderer.RenderHtmlAsPdf(contractHtml);
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.MarginTop = 25;

renderer.RenderingOptions.MarginBottom = 25;

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.Letter;

string template = await File.ReadAllTextAsync("templates/msa.html");

string contractHtml = template
    .Replace("{{ClientLegalName}}", deal.ClientLegalName)
    .Replace("{{CompanyName}}", deal.ProviderName)
    .Replace("{{EffectiveDate}}", deal.EffectiveDate.ToString("MMMM d, yyyy"))
    .Replace("{{ContractValue}}", deal.Value.ToString("C"))
    .Replace("{{PaymentTerms}}", deal.PaymentTerms);

PdfDocument contract = renderer.RenderHtmlAsPdf(contractHtml);
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.MarginTop = 25

renderer.RenderingOptions.MarginBottom = 25

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.Letter

Dim template As String = Await File.ReadAllTextAsync("templates/msa.html")

Dim contractHtml As String = template _
    .Replace("{{ClientLegalName}}", deal.ClientLegalName) _
    .Replace("{{CompanyName}}", deal.ProviderName) _
    .Replace("{{EffectiveDate}}", deal.EffectiveDate.ToString("MMMM d, yyyy")) _
    .Replace("{{ContractValue}}", deal.Value.ToString("C")) _
    .Replace("{{PaymentTerms}}", deal.PaymentTerms)

Dim contract As PdfDocument = renderer.RenderHtmlAsPdf(contractHtml)
$vbLabelText   $csharpLabel

Przykładowy wynik

Przykladowy wynik IronPDF W przypadku bardziej złożonego renderowania warunkowego widok Razor obsługuje tę samą substytucję znaczników z pełnym przepływem sterowania, pętlami dla rozdzielczych harmonogramów i warunkami dla klauzul opcjonalnych, zanim ciąg HTML dotrze do renderer-a.

4. Nagłówki i stopki są stosowane do każdej strony

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:right; font-size:9px; color:#999;'>
            <img src='data:image/png;base64,...' height='24' alt='Logo'/>
            &nbsp; CONFIDENTIAL
        </div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:9px; color:#999;'>
            Page {page} of {total-pages} &nbsp;|&nbsp;
            Master Service Agreement &nbsp;|&nbsp;
            CONFIDENTIAL — NOT FOR DISTRIBUTION
        </div>",
    DrawDividerLine = true
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:right; font-size:9px; color:#999;'>
            <img src='data:image/png;base64,...' height='24' alt='Logo'/>
            &nbsp; CONFIDENTIAL
        </div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:9px; color:#999;'>
            Page {page} of {total-pages} &nbsp;|&nbsp;
            Master Service Agreement &nbsp;|&nbsp;
            CONFIDENTIAL — NOT FOR DISTRIBUTION
        </div>",
    DrawDividerLine = true
};
HTML

Przykładowy wynik z nagłówkiem/stopką

PDF z zastosowanym naszym naglowkiem i stopka Każda strona umowy zawiera logo firmy, notatkę o poufności i dokładne numerowanie stron, stosowane przez IronPDF w czasie renderowania, a nie ręcznie wstawiane do szablonu.

5. Umowa przechowywana, wersjonowana i dostarczana

Wygenerowany PDF jest przechowywany w magazynie blobów z kluczem zgodnym z ID transakcji i wersją szablonu. Rekord audytu łączy przechowywaną treść PDF z dokładnym zdjęciem danych używanych w czasie generowania, wersją szablonu i znacznikiem UTC. PDF jest następnie wysłany do platformy e-podpisu przez jej API i przesyłany e-mailem do klienta jako załącznik, wszystko z tego samego handlera, zanim odpowiedź wróci.

Korzyści w praktyce

Prędkość. Umowa jest generowana w ciągu kilku sekund od zamknięcia umowy. Zespoły prawne i administracyjne są usuwane z kroku przygotowania dokumentu, przeglądają i zatwierdzają szablon raz, a nie każdą indywidualną umowę.

Dokładność. Dane płyną bezpośrednio z CRM lub bazy danych do szablonu. Nie ma etapu kopiowania, co oznacza brak niepoprawnych imion klientów, brak nieaktualnych wartości umowy i brak pozostałego tekstu zastępczego, który trafia do klienta.

Spójność marki i prawna. Każda umowa jest renderowana z tego samego zatwierdzonego szablonu HTML. Język klauzul, formatowanie, marginesy i marka firmy są identyczne w każdej transakcji, brak lokalnych edycji, brak dryfowania szablonu.

Kontrola wersji. Szablony żyją w kontroli źródła lub systemie zarządzania dokumentami. Kiedy dział prawny aktualizuje klauzulę, zmiana jest śledzona, przeglądana i wdrażana jak każda inna zmiana aplikacji. Każdy wygenerowany PDF jest trwale powiązany z wersją szablonu, która go wytworzyła.

Ślad audytowy. Każdy rekord umowy obejmuje zdjęcie danych w czasie generowania, wersję szablonu i znacznik czasu. Kiedy pojawia się spór lub przegląd zgodności żąda dokumentacji, dokładny dokument podpisany przez klienta jest natychmiast dostępny.

Brak kosztów za dokument. Generowanie umów odbywa się wewnątrz procesu. Nie istnieje zewnętrzne API dokumentu do wywołania, brak cen uzależnionych od użycia od zewnętrznego dostawcy i brak zewnętrznych zależności siedzących na krytycznej ścieżce, gdy umowa zamyka się.

Zakończenie

Generowanie umów to proces, który wygląda na manualny, ponieważ dostępne narzędzia uczyniły go manualnym. Szablon HTML, zastąpienie ciągu i wywołanie RenderHtmlAsPdf zastępuje godziny pracy administracyjnej strumieniem, który kończy się przed zakończeniem wysyłania powiadomienia o umowie.

IronPDF obsługuje pełny cykl życia generowania PDF w języku C# — od renderowania szablonów HTML po zapisywanie, przesyłanie strumieniowe i manipulowanie dokumentami — wszystko z tej samej biblioteki na ironpdf.com. Jeśli tworzysz lub zastępujesz przepływ pracy generowania umowy, bezpłatny 30-dniowy okres próbny daje ci wystarczająco dużo czasu, aby przeprowadzić kompletny przetworzony strumień danych na własnych szablonach i danych transakcji.

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