IronPDFを使用してASP.NETでPDFファイルを印刷する方法
大規模なポリシードキュメント生成の問題
住宅所有者の保険証書は1つのドキュメントではなく、申告ページ、カバレッジセクションのセット、ポリシーホルダーが選択した支持書のリスト、適用される除外事項、および州に義務付けられた通知が含まれています。 異なる州で異なるカバレッジの階層と異なる支持書を持つ二人の保険契約者が、構造は同じだがほとんど同じ内容を持たないドキュメントを受け取ります。 各バインドはユニークな組み合わせを生成します。
レガシーポリシー管理システムはこれに対応して設計されていません。 それらのドキュメント出力は機能的ですが、フラットで、キャリアブランディング、現代的なタイポグラフィはなく、顧客が自社のホームやビジネスを信頼する企業から期待するレイアウトが反映されていません。 購入から数分で家賃契約を発行するインシュアテックや、カバレッジ特化の支持書付きのビジネスオーナーポリシーをバインディングする商業MGAには、その出力品質はブランド責任です。
手動組み立ては、精度の問題をさらに悪化させます。 ポリシーチームが、共有ドライブから断片を選択してドキュメントを組み立てるとき:ここに申告テンプレート、あそこに支持書フォーム、管轄ごとに整理されたフォルダからの州通知、フォームの誤ったバージョンを含めたり、必要な支持書を省略したり、バインディングカバレッジと一致しないドキュメントを提供したりするリスクが存在します。 ピークリニューアルシーズンで1日あたり何百ものバインズを抱えていると、不可避です。
第三者のドキュメント生成APIは運用の問題を解消せず、それを移しますが、ページごとまたはドキュメントごとの価格を追加し、リニューアルのボリュームに直接比例して、最も需要が高い瞬間が最もコストが急上昇する瞬間になります。
解決策:バインドイベント時のセクションごとのレンダリングと結合
IronPDFを使用すると、.NETインシュアランスプラットフォームはバインドまたはリニューアルの瞬間に、HTMLとCSSテンプレートを使用して完全で個別化されたポリシードキュメントを生成できます。 アプリケーションは、ポリシーホルダーのカバレッジデータ、選択された支持書のデータ、適用される除外事項、州に義務付けられた通知をポリシー管理システムから取得し、セクションごとのテンプレートに入力し、ChromePdfRendererで各セクションをレンダリングし、PdfDocument.Merge()を使用して単一のポリシードキュメントに結合します。
結果は、該当するカバレッジを正確に反映し、プロのキャリアドキュメントのように読まれるブランド化されたマルチセクションPDFファイルです。 レガシーレポートエンジンなし、手動セクション選択なし、更新ボリュームに対してスケールするドキュメント別API料なし。 レンダリングは既存 for .NETアプリケーション内で外部プロセスなしで単一のNuGetパッケージとして実行されます。
実際の使用方法
1. バインドイベントがドキュメント組み立てをトリガーします
管理システムでのポリシーバインドまたはリニューアルがイベントまたはウェブフックを発火させ、 新しいPDFドキュメント組立てを開始します。 アプリケーションは、文書に必要なすべてのものをポリシーレコードに照会します:被保険者の名前、ポリシー番号、有効日と満了日、限度額と控除免責を伴うカバレッジセクション、選択された支持書、適用される除外事項、保険料の内訳、および含める必要がある州に義務付けられた通知を決定するために使用される管轄。
クエリ結果は、文書の内容と構造の両方を駆動します。どのセクションが存在し、どの順序で、どのデータと共に。 この段階では手動のものは何もありません。
2. セクションテンプレートは独立して所有されています
それぞれのドキュメントセクションは、コンテンツを所有するチームによって維持されるHTMLとCSSテンプレートファイルです。 申告ページテンプレートはポリシーオペレーションによって維持されています。 カバレッジセクションテンプレートは製品チームによって所有されています。 支持書のテンプレートはフォームごとに維持され、フォーム自身と共にバージョン管理されています。 州通知テンプレートは、規制要件が変更された際にコンプライアンスによって更新されます。
この分離により、州通知のコンプライアンス更新が、申告テンプレートやカバレッジセクションに触れる必要がなくなります。 各チームは自分のファイルを更新し、その管轄での将来の全てのバインドは自動的に変更を反映します。
HTMLファイルテンプレート例入力: declarations.html

HTMLファイルテンプレートの例入力: coverage-dwelling.html

HTMLファイルテンプレートの例入力: coverage-liability.html

3. 各セクションをレンダリングし、1つの生成されたPDFドキュメントに結合
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})
例の出力をマージしたC# PDF文書
PdfDocument.Merge()は、セクションを正しい順序で組み立てます。たとえば、最初に宣言、次にカバレッジセクション、さらに承認、除外、通知を順番にページ区切りで配置します。 マージされたドキュメントは、単一のPDFとして連続しています。
4. ポリシーレコードにより条件的に含まれる承認
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")
承認テンプレートの例
承認ループは、存在するテンプレートのみをレンダリングし、ポリシーホルダーの実際の承認リストに対応するセクションのみを含めます。予定されていない個人財産の承認がないポリシーには、そのセクションがドキュメントに存在しません。 特定の洪水除外通知を要求する州のポリシーは常に存在します。
最終的なマージされたPDFは、ポリシーホルダーにメールまたはエージェントポータルを通じて配信され、ポリシー番号と有効日でキー登録されたドキュメントストアにアーカイブされ、その期間の公式ポリシーレコードとなります。
実世界の利点
正確性。 PDFは、ポリシー管理システムのデータから直接生成され、カバレッジのバインディングに使用される記録と同じです。 転写ステップはありませんし、記録システムとポリシーホルダーに配信されたドキュメントとの不一致の道もありません。
条件付きアセンブリ。 承認および州の通知は、ポリシーレコードに基づいてプログラム的に含まれたり除外されたりします。 含めるフォームを手動で選択する必要はなく、必要な承認が省略されるリスクも、無関係なフォームが追加されるリスクもありません。
ブランドクオリティ。 HTMLとCSSテンプレートは、会社のビジュアルアイデンティティを反映した現代的なキャリアブランドのドキュメントを生成します。 出力は2003年に構築されたインフラによって作られたようには見えません。
更新の自動化。 同じパイプラインが有効日を更新し、修正されたプレミアム数字を含め、カバレッジの変更を含んだ更新されたポリシードキュメントを各更新時に再生成します。 手動での更新作業サイクルはありません。イベントが発生し、ドキュメントが組立てられ、ポリシーホルダーに送付されます。
規制遵守。 州により要請される通知は、問い合わせ時に管轄によって選択され、必須となった場合には常に含まれます。 特定の州で必要とされる通知が欠けている例として、不完全な政策パッケージを配信するリスクは、手動のチェックリストではなく、コードレベルで管理されます。
ドキュメントごとの費用はかかりません。レンダリングはインプロセスで実行されます。 ページごとのAPI料金はありませんし、ドキュメントごとのチャージもありません。また、最も多くのボリュームがある更新シーズンを広告的に高くする価格モデルもありません。
結び
バウンドカバレッジレコードから自身を組み立てるポリシードキュメントは、適用されるセクションのみを含み、バインドの瞬間にブランド化されたPDFを生成するため、手動のアセンブリや従来のレポートエンジンに依存しているプロセスとは根本的に異なります。最初のアプローチはビジネスと共に拡大します。 2番目はそれを押しつぶします。
セクションごとにレンダリングされるマージパターンは、実際にどのようにポリシードキュメントが構造化されているかに直接マップします。独立したセクション、条件付きで含まれるもの、ドキュメントロジックによりアルファベット順ではなく順序づけられるものです。 ironpdf.com では、IronPDFがHTMLテンプレートのレンダリングからドキュメントの結合、ページング、操作に至るまで、C#でのPDF生成タスクのライフサイクルをフルに管理します。 ポリシードキュメントパイプラインを構築またはモダン化している場合は、無料の30日間トライアルを開始し、ご自身のカバレッジデータとテンプレートをもとに次の更新シーズンまでに組立てをテストしてください。




