Zum Fußzeileninhalt springen
IRONPDF NUTZEN

Wie man PDF-Dateien in ASP.NET mit IronPDF druckt

Das Problem der Richtliniendokumentenerstellung in großem Maßstab

IronPDF-Startseite Ein Hausratversicherungsdokument besteht nicht nur aus einem Dokument, sondern aus einer Erklärungsseite, einem Satz von Deckungsabschnitten, einer Liste von Zusätzen, die der Versicherungsnehmer ausgewählt hat, anwendbaren Ausschlüssen und allen staatlich vorgeschriebenen Hinweisen, die auf ihre Jurisdiktion zutreffen. Zwei Versicherungsnehmer in unterschiedlichen Staaten mit unterschiedlichen Deckungsstufen und unterschiedlichen Zusätzen erhalten Dokumente, die zwar eine Struktur teilen, aber fast keinen identischen Inhalt haben. Jede Verbindung erzeugt eine einzigartige Kombination.

Legacy-Policy-Admin-Systeme sind dafür nicht ausgelegt. Deren Dokumentenausgabe ist funktional, aber schlicht, keine Carrier-Branding, keine moderne Typografie, kein Layout, das widerspiegelt, was Kunden von einem Unternehmen erwarten, dem sie ihr Zuhause oder Geschäft anvertrauen. Für ein Insurtech, das Mieterversicherungen innerhalb von Minuten nach Kauf ausstellt, oder einen kommerziellen MGA, der Policen für Geschäftsinhaber mit deckungsbezogenen Klauseln bindet, ist diese Ausgabequalität ein Markennachteil.

Manuelle Zusammenstellung verschlimmert das Genauigkeitsproblem. Wenn ein Team eine Police durch Auswahl von Fragmenten aus einem gemeinsamen Ordner zusammenstellt: Erklärungsseite hier, Endorsement-Formular dort, staatliche Hinweise aus einem nach Gerichtsbarkeit organisierten Ordner, besteht das Risiko, die falsche Formularversion einzubeziehen, ein erforderliches Endorsement zu überspringen oder ein Dokument zu liefern, das nicht mit der gebundenen Deckung übereinstimmt. Bei Hunderten von Verbindungen pro Tag während der Stoßzeit der Erneuerung ist es unvermeidlich.

Drittanbieter-Dokumentgenerierungs-APIs verschieben das Betriebsproblem, ohne es zu beseitigen, und fügen pro Seite oder Dokument Preise hinzu, die direkt gegen das Verlängerungsvolumen skalieren, der Moment der höchsten Nachfrage ist der Moment, in dem die Kosten am höchsten steigen.

Die Lösung: Abschnittsweises Rendering und Zusammenführen beim Binden

IronPDF ermöglicht es .NET-Versicherungsplattformen, komplette, personalisierte Policendokumente aus HTML- und CSS-Vorlagen zum Zeitpunkt des Bindens oder der Erneuerung zu erzeugen. Die Anwendung zieht die Deckungsdaten des Policeninhabers, ausgewählte Endorsements, anwendbare Ausschlüsse und staatlich vorgeschriebene Hinweise aus dem Policy-Admin-System, füllt abschnittsspezifische Vorlagen aus, rendert jeden mit ChromePdfRenderer und führt sie zu einem einzigen Polizeidokument zusammen mit PdfDocument.Merge().

Das Ergebnis ist eine gebrandete, mehrteilige PDF-Datei, die die gebundene Deckung genau widerspiegelt und wie ein professionelles Carrier-Dokument liest. Kein Legacy-Berichtsgenerator, keine manuelle Abschnittsauswahl, keine pro Dokument API-Gebühr, die gegen das Verlängerungsvolumen skaliert. Das Rendering läuft innerhalb der vorhandenen .NET-Anwendung als einzelnes NuGet-Paket ohne externe Prozesse.

Wie es in der Praxis funktioniert

1. Bindungsereignis löst Dokumentenzusammenstellung aus

Ein Policy-Binding oder eine Erneuerung im Admin-System löst ein Ereignis oder einen Webhook aus, der eine neue PDF-Dokumentenzusammenstellung initiiert. Die Anwendung fragt den Policeneintrag für alles ab, was das Dokument benötigt: Versicherter Name, Policennummer, Beginn- und Ablaufdaten, Deckungsabschnitte mit Limits und Selbstbeteiligungen, ausgewählte Endorsements, anwendbare Ausschlüsse, Prämienaufgliederung und die Gerichtsbarkeit, die verwendet wird, um zu bestimmen, welche staatlich vorgeschriebenen Hinweise enthalten sein müssen.

Das Abfrageergebnis bestimmt sowohl den Inhalt als auch die Struktur des Dokuments, welche Abschnitte existieren, in welcher Reihenfolge, mit welchen Daten. Nichts in diesem Schritt ist manuell.

2. Abschnitte Vorlagen sind unabhängig

Jeder Dokumentabschnitt ist eine HTML- und CSS-Vorlagendatei, die von dem Team gewartet wird, das diesen Inhalt besitzt. Die Erklärungsseitenvorlage wird von der Policy-Betriebspflege gewartet. Die Deckungsabschnittsvorlagen werden vom Produktteam besessen. Endorsement-Vorlagen werden pro Formular gewartet, versioniert neben den Formularen selbst. Staatliche Hinweismeldungsvorlagen werden von der Compliance aktualisiert, wenn sich regulatorische Anforderungen ändern.

Diese Trennung bedeutet, dass ein Compliance-Update für einen staatlichen Hinweis nicht erfordert, die Erklärungsvorlage oder einen Deckungsabschnitt zu ändern. Jedes Team aktualisiert seine eigenen Dateien, und jede zukünftige Verbindung in dieser Gerichtsbarkeit übernimmt die Änderung automatisch.

Beispiel für eine HTML-Dateivorlage: declarations.html

Beispiel-HTML-Eingabedatei eins

Beispiel für eine HTML-Dateivorlage: coverage-dwelling.html

Beispiel-HTML-Eingabedatei zwei

Beispiel für eine HTML-Dateivorlage: coverage-liability.html

Beispiel-HTML-Eingabedatei drei

3. Abschnitte werden gerendert und in ein einziges generiertes PDF-Dokument zusammengeführt

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

// Declarations page
string declHtml = (await File.ReadAllTextAsync("Templates/declarations.html"))
    .Replace("{{PolicyNumber}}", policy.Number)
    .Replace("{{InsuredName}}", policy.InsuredName)
    .Replace("{{EffectiveDate}}", policy.EffectiveDate.ToString("MMMM d, yyyy"))
    .Replace("{{Premium}}", policy.AnnualPremium.ToString("C"));

// Coverage sections
string dwellingHtml = (await File.ReadAllTextAsync("Templates/coverage-dwelling.html"))
    .Replace("{{DwellingLimit}}", policy.DwellingCoverage.Limit.ToString("C"))
    .Replace("{{Deductible}}", policy.DwellingCoverage.Deductible.ToString("C"));

string liabilityHtml = (await File.ReadAllTextAsync("Templates/coverage-liability.html"))
    .Replace("{{LiabilityLimit}}", policy.LiabilityCoverage.Limit.ToString("C"));

var declPdf = renderer.RenderHtmlAsPdf(declHtml);
var dwellingPdf = renderer.RenderHtmlAsPdf(dwellingHtml);
var liabilityPdf = renderer.RenderHtmlAsPdf(liabilityHtml);

// Use the overload that accepts an IEnumerable<PdfDocument>
PdfDocument policyDoc = PdfDocument.Merge(new[] { declPdf, dwellingPdf, liabilityPdf });
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

// Declarations page
string declHtml = (await File.ReadAllTextAsync("Templates/declarations.html"))
    .Replace("{{PolicyNumber}}", policy.Number)
    .Replace("{{InsuredName}}", policy.InsuredName)
    .Replace("{{EffectiveDate}}", policy.EffectiveDate.ToString("MMMM d, yyyy"))
    .Replace("{{Premium}}", policy.AnnualPremium.ToString("C"));

// Coverage sections
string dwellingHtml = (await File.ReadAllTextAsync("Templates/coverage-dwelling.html"))
    .Replace("{{DwellingLimit}}", policy.DwellingCoverage.Limit.ToString("C"))
    .Replace("{{Deductible}}", policy.DwellingCoverage.Deductible.ToString("C"));

string liabilityHtml = (await File.ReadAllTextAsync("Templates/coverage-liability.html"))
    .Replace("{{LiabilityLimit}}", policy.LiabilityCoverage.Limit.ToString("C"));

var declPdf = renderer.RenderHtmlAsPdf(declHtml);
var dwellingPdf = renderer.RenderHtmlAsPdf(dwellingHtml);
var liabilityPdf = renderer.RenderHtmlAsPdf(liabilityHtml);

// Use the overload that accepts an IEnumerable<PdfDocument>
PdfDocument policyDoc = PdfDocument.Merge(new[] { declPdf, dwellingPdf, liabilityPdf });
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.MarginTop = 20

renderer.RenderingOptions.MarginBottom = 20

' Declarations page
Dim declHtml As String = (Await File.ReadAllTextAsync("Templates/declarations.html")) _
    .Replace("{{PolicyNumber}}", policy.Number) _
    .Replace("{{InsuredName}}", policy.InsuredName) _
    .Replace("{{EffectiveDate}}", policy.EffectiveDate.ToString("MMMM d, yyyy")) _
    .Replace("{{Premium}}", policy.AnnualPremium.ToString("C"))

' Coverage sections
Dim dwellingHtml As String = (Await File.ReadAllTextAsync("Templates/coverage-dwelling.html")) _
    .Replace("{{DwellingLimit}}", policy.DwellingCoverage.Limit.ToString("C")) _
    .Replace("{{Deductible}}", policy.DwellingCoverage.Deductible.ToString("C"))

Dim liabilityHtml As String = (Await File.ReadAllTextAsync("Templates/coverage-liability.html")) _
    .Replace("{{LiabilityLimit}}", policy.LiabilityCoverage.Limit.ToString("C"))

Dim declPdf = renderer.RenderHtmlAsPdf(declHtml)
Dim dwellingPdf = renderer.RenderHtmlAsPdf(dwellingHtml)
Dim liabilityPdf = renderer.RenderHtmlAsPdf(liabilityHtml)

' Use the overload that accepts an IEnumerable(Of PdfDocument)
Dim policyDoc As PdfDocument = PdfDocument.Merge(New PdfDocument() {declPdf, dwellingPdf, liabilityPdf})
$vbLabelText   $csharpLabel

Beispiel für das Ausgabedokument C# PDF

IronPDF-Beispielausgabe PdfDocument.Merge() fügt die Abschnitte in der richtigen Reihenfolge zusammen, zum Beispiel zuerst die Erklärungen, dann die Deckungsabschnitte, dann Endorsements, Ausschlüsse und Hinweise, mit Seitenumbrüchen zwischen den Abschnitten. Das zusammengeführte Dokument fließt kontinuierlich als ein einziges PDF.

4. Endorsements werden bedingt durch Polizendaten aufgenommen

var sections = new List<PdfDocument> { declPdf, dwellingPdf, liabilityPdf };

foreach (var endorsementCode in policy.Endorsements)
{
    string templatePath = $"Templates/endorsements/{endorsementCode}.html";
    if (!File.Exists(templatePath)) continue;

    string endorsementHtml = (await File.ReadAllTextAsync(templatePath))
        .Replace("{{PolicyNumber}}", policy.Number)
        .Replace("{{EndorsementEffective}}", policy.EffectiveDate.ToString("MMMM d, yyyy"));
    sections.Add(renderer.RenderHtmlAsPdf(endorsementHtml));
}

PdfDocument finalPolicy = PdfDocument.Merge(sections);

finalPolicy.SaveAs($"policies/{policy.Number}-{policy.EffectiveDate:yyyyMMdd}.pdf");
var sections = new List<PdfDocument> { declPdf, dwellingPdf, liabilityPdf };

foreach (var endorsementCode in policy.Endorsements)
{
    string templatePath = $"Templates/endorsements/{endorsementCode}.html";
    if (!File.Exists(templatePath)) continue;

    string endorsementHtml = (await File.ReadAllTextAsync(templatePath))
        .Replace("{{PolicyNumber}}", policy.Number)
        .Replace("{{EndorsementEffective}}", policy.EffectiveDate.ToString("MMMM d, yyyy"));
    sections.Add(renderer.RenderHtmlAsPdf(endorsementHtml));
}

PdfDocument finalPolicy = PdfDocument.Merge(sections);

finalPolicy.SaveAs($"policies/{policy.Number}-{policy.EffectiveDate:yyyyMMdd}.pdf");
Imports System.IO

Dim sections As New List(Of PdfDocument) From {declPdf, dwellingPdf, liabilityPdf}

For Each endorsementCode In policy.Endorsements
    Dim templatePath As String = $"Templates/endorsements/{endorsementCode}.html"
    If Not File.Exists(templatePath) Then Continue For

    Dim endorsementHtml As String = (Await File.ReadAllTextAsync(templatePath)).
        Replace("{{PolicyNumber}}", policy.Number).
        Replace("{{EndorsementEffective}}", policy.EffectiveDate.ToString("MMMM d, yyyy"))
    sections.Add(renderer.RenderHtmlAsPdf(endorsementHtml))
Next

Dim finalPolicy As PdfDocument = PdfDocument.Merge(sections)

finalPolicy.SaveAs($"policies/{policy.Number}-{policy.EffectiveDate:yyyyMMdd}.pdf")
$vbLabelText   $csharpLabel

Beispiel für eine Endorsement-Vorlage

Vorlagenerklärung Der Endorsement-Loop rendert nur Vorlagen, die existieren, und schließt nur Abschnitte ein, die der tatsächlichen Endorsement-Liste des Policeninhabers entsprechen. Eine Police ohne geplantes persönliches Eigentum-"Endorsement" hat diesen Abschnitt nie in ihrem Dokument. Eine Police in einem Staat, der einen spezifischen Flut-Ausschluss-Hinweis erfordert, hat diesen immer.

Das endgültig zusammengeführte PDF wird dem Policeninhaber per E-Mail oder im Agentenportal zugestellt und im Dokumentenspeicher archiviert, der nach Policenummer und Wirksamkeitsdatum indiziert ist, dem offiziellen Policendatensatz für diesen Zeitraum.

Nutzen in der realen Welt

Genauigkeit. Das PDF wird direkt aus den Daten des Policenverwaltungssystems generiert, demselben Datensatz, der zur Bindung der Deckung verwendet wird. Es gibt keinen Transkriptionsschritt und keinen Pfad für eine Diskrepanz zwischen dem System of Record und dem Dokument, das dem Policeninhaber geliefert wird.

Bedingte Zusammenstellung. Endorsements und staatliche Hinweise werden programmgesteuert basierend auf dem Policen-Datensatz ein- oder ausgeschlossen. Es gibt keine manuelle Auswahl, welche Formulare einzuschließen sind, kein Risiko, dass ein erforderliches Endorsement weggelassen wird, und kein Risiko, dass ein nicht anwendbares Formular hinzugefügt wird.

Markenqualität. HTML- und CSS-Vorlagen erzeugen ein modernes, carrier-gebrandetes Dokument, das die visuelle Identität des Unternehmens widerspiegelt. Die Ausgabe sieht nicht so aus, als wäre sie mit einer Infrastruktur aus dem Jahr 2003 erzeugt worden.

Erneuerungsautomatisierung. Dasselbe Pipeline regeneriert aktualisierte Policendokumente bei jeder Erneuerung mit neuen Wirksamkeitsdaten, überarbeiteten Prämienzahlen und jeglichen Deckungsänderungen. Es gibt keinen manuellen Überarbeitungszyklus pro Erneuerung, das Ereignis wird ausgelöst, das Dokument wird zusammengestellt, der Policeninhaber erhält es.

Regulatorische Compliance. Staatlich vorgeschriebene Hinweise werden zur Abfragezeit nach Gerichtsbarkeit ausgewählt und immer aufgenommen, wenn erforderlich. Das Risiko, ein unvollständiges Policenpaket zu liefern, z. B. einen Hinweis zu verpassen, der in einem bestimmten Staat erforderlich ist, wird auf Codeebene gesteuert, anstatt durch eine manuelle Checkliste.

Keine Kosten pro Dokument. Die Wiedergabe erfolgt prozessintern. Es gibt keine API-Gebühr pro Seite, keine Gebühr pro Dokument und kein Preismodell, das die Erneuerungssaison – wenn das Volumen am höchsten ist – unverhältnismäßig teuer macht.

Abschluss

Ein Policendokument, das sich selbst aus dem gebundenen Deckungsrecord zusammenstellt, nur die anwendbaren Abschnitte einschließt und ein gebrandetes PDF zum Zeitpunkt des Bindens erzeugt, ist eine grundlegend andere Operation als eine, die auf manuelle Zusammenstellung oder auf einen veralteten Berichtsgenerator angewiesen ist. Der erste Ansatz skaliert mit dem Geschäft; der zweite bricht darunter zusammen.

Das musterhafte Rendering und Zusammenführen abschnittsweise orientiert sich direkt daran, wie Policendokumente tatsächlich strukturiert sind: unabhängige Abschnitte, bedingt aufgenommen, geordnet nach Dokumentenlogik und nicht alphabetisch. IronPDF behandelt den gesamten Lebenszyklus von PDF-Generierungsaufgaben in C# bei ironpdf.com, vom Rendering von HTML-Vorlagen bis hin zum Zusammenführen, Paginieren und Manipulieren von Dokumenten. Wenn Sie daran arbeiten, eine Policen-Dokumentenpipeline zu erstellen oder zu modernisieren, starten Sie Ihre kostenlose 30-tägige Testversion und testen die Zusammenstellung mit Ihren eigenen Deckungsdaten und Vorlagen vor Ihrer nächsten Erneuerungssaison.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an