C#でDynamicPDFからIronPDFに移行する方法
なぜDynamicPDFからIronPDFに移行するのですか?
DynamicPDFの製品の断片化は、移行の主な原動力となっています。 ライセンスモデルを理解することは、現在の実装の真のコストを評価するために不可欠です。
製品の断片化の問題
DynamicPDFは、別々のライセンスで別々の製品として販売されています:
- DynamicPDF Generator: PDFをゼロから作成
- DynamicPDF Merger:既存のPDFを結合、分割、操作します(別途購入)
- DynamicPDF Core Suite:ジェネレータとマージャーの統合
- DynamicPDF ReportWriter:レポート生成
- DynamicPDF HTML Converter: HTMLからPDFへの変換(別アドオン)
- DynamicPDF Print Manager:プログラムでPDFを印刷する
完全なPDFソリューションには、DynamicPDFの3-5ライセンスが必要です。 IronPDFは1つのパッケージにすべてを含んでいます。
アーキテクチャの比較
| アスペクト | ダイナミックPDF | IronPDF |
|---|---|---|
| 製品モデル | 断片的(5つ以上の製品) | オールインワンライブラリ |
| ライセンスについて | 複数のライセンスが必要 | シングルライセンス |
| HTMLからPDFへ | 別途アドオン購入 | 組み込み、Chromiumベース |
| CSSサポート | 制限付き(アドオンが必要です) | フルCSS3とFlexbox/Grid |
| APIスタイル | 座標ベースのポジショニング | HTML/CSS + 操作API |
| ラーニングカーブ | Steep(複数のAPI) | ジェントル(ウェブ技術) |
| モダン.NET | .NET Standard 2.0 | .NET 6/7/8/9+ ネイティブ |
主な移行のメリット
1.単一パッケージ: 1つのNuGetパッケージで3~5個のDynamicPDFパッケージを置き換える 2.最新のレンダリング: Chromium エンジンと従来のレンダリング
- Webテクノロジー:座標ベースの配置の代わりにHTML/CSSを使用する 4.よりシンプルなAPI:コードが少なくなり、読みやすくなり、メンテナンスが容易になります 5.アドオン購入なし: HTML、マージ、セキュリティがすべて含まれています
移行前の準備
前提条件
あなたの環境がこれらの要件を満たしていることを確認してください:
- .NET Framework 4.6.2+または.NET Core 3.1 / .NET 5-9
- Visual Studio 2019+またはC#拡張機能付きVS Code
- NuGetパッケージマネージャへのアクセス
- IronPDFライセンスキー (ironpdf.com にて無料トライアル可能)
DynamicPDFの使用状況を監査する
ソリューションディレクトリで以下のコマンドを実行して、すべてのDynamicPDF参照を確認してください:
# Find allダイナミックPDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
# Find allダイナミックPDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
一般的なパッケージ
ceTe.DynamicPDF.CoreSuite.NETceTe.DynamicPDF.Generator.NETceTe.DynamicPDF.Merger.NETceTe.DynamicPDF.HtmlConverter.NET
パラダイムシフトを理解する
DynamicPDFからIronPDFへの移行で最も大きな変更は、ドキュメント作成の基本的なアプローチです。 DynamicPDFは、ページ上の特定のX,Y座標に要素を配置する座標ベースのポジショニングを使用します。 IronPDFはHTML/CSSレンダリングを使用し、ウェブテクノロジーでデザインします。
このパラダイム シフトとは、TextArea、および Table2 要素を HTML の同等の要素に変換することを意味します。この変更により、通常、より読みやすく保守しやすいコードが生成されます。
ステップごとの移行プロセス
ステップ 1: NuGet パッケージを更新する
すべてのDynamicPDFパッケージを削除し、IronPDFをインストールしてください:
# RemoveダイナミックPDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf
# RemoveダイナミックPDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf
ステップ 2: 名前空間参照の更新
DynamicPDF名前空間をIronPDFに置き換えてください:
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
Imports IronPdf
ステップ 3: ライセンスの設定
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完全な API 移行のリファレンス
コア クラス マッピング
| DynamicPDFクラス | IronPDF 同等物 |
|---|---|
Document |
ChromePdfRenderer |
Document |
PdfDocument |
Page |
HTML <div> 改ページ付き |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
ページ要素と HTML のマッピング
| DynamicPDF ページ要素 | IronPDF/HTMLに相当するもの |
|---|---|
Label |
<p>, <span>, <div> |
TextArea |
<p>(CSS 付き) |
Image |
<img> タグ |
Table2 |
HTML <table> |
PageNumberingLabel |
{page} / {total-pages} プレースホルダー |
主な API マッピング
| ダイナミックPDF | IronPDF |
|---|---|
Document + Page |
ChromePdfRenderer |
Label, TextArea |
HTML <div> |
Table2 |
HTML <table> |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
document.Draw() |
pdf.SaveAs() / pdf.BinaryData |
PageNumberingLabel %%CP%% |
{page} プレースホルダー |
コード移行の例
HTMLからPDFへの変換
HTML から PDF への変換では、IronPDF の組み込み Chromium レンダリングではなく、DynamicPDF に別個の HtmlConverter アドオンが必要であることが示されています。
DynamicPDFの実装:。
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim converter As New HtmlConverter(html)
converter.Convert("output.pdf")
End Sub
End Class
IronPDFの実装:。
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF の ChromePdfRenderer は、完全な CSS3 サポートを備えた Chromium ベースのレンダリングを提供します。別途アドオンを購入する必要はありません。 その他のオプションについては、HTML to PDF documentationを参照してください。
複数のPDFをマージする
PDF マージでは、DynamicPDF の MergeDocument クラス (Merger 製品ライセンスが必要) とIronPDFに組み込まれている静的な Merge メソッドの違いを示します。
DynamicPDFの実装:。
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger
Class Program
Shared Sub Main()
Dim document As New MergeDocument("document1.pdf")
document.Append("document2.pdf")
document.Draw("merged.pdf")
End Sub
End Class
IronPDFの実装:。
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
IronPDF の静的 Merge メソッドは、複数の PdfDocument オブジェクトを直接受け入れます。 その他のオプションについては、 PDF 結合のドキュメントを参照してください。
PDFにテキストを追加する
テキストの配置は、DynamicPDF の座標ベースの Label 要素からIronPDFの HTML ベースの TextStamper へのパラダイム シフトを示しています。
DynamicPDFの実装:。
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Class Program
Shared Sub Main()
Dim document As New Document()
Dim page As New Page(PageSize.Letter)
Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
page.Elements.Add(label)
document.Pages.Add(page)
document.Draw("output.pdf")
End Sub
End Class
IronPDFの実装:。
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper As New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalAlignment = VerticalAlignment.Top
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF の TextStamper は、座標ベースの配置ではなく、配置ベースの位置決めを提供するため、さまざまなページ サイズにわたってレイアウトをより適応させることができます。 その他のオプションについては、watermark and stamping documentationを参照してください。
完全なドキュメント生成例
この包括的な例では、複数の要素を持つDynamicPDFドキュメントをIronPDFのHTMLアプローチに変換しています。
DynamicPDFの実装:。
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger
' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)
Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")
' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")
IronPDFの実装:。
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' All features in one library
Dim html As String = "
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>"
Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")
重要な移行に関する注意事項
座標ベースから HTML/CSS ポジショニングへ
根本的なパラダイムシフトとして、X,Y座標のポジショニングをCSSベースのレイアウトに変換する必要があります:
//ダイナミックPDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
//ダイナミックPDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
'ダイナミックPDF- coordinate-based
Dim label As New Label("Hello World", 100, 200, 300, 50)
'IronPDF- CSS positioning (if absolute positioning needed)
Dim html As String = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>"
'IronPDF- preferred approach (flow-based)
html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>"
ページ番号の構文
DynamicPDFとIronPDFはページ番号に異なるプレースホルダー構文を使用します:
//ダイナミックPDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
//ダイナミックPDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
'ダイナミックPDFplaceholders
"Page %%CP%% of %%TP%%"
'IronPDFplaceholders
"Page {page} of {total-pages}"
ヘッダーとフッター
DynamicPDF Template 要素をIronPDF HtmlHeaderFooter に変換します。
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
'IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
その他のヘッダー/フッターオプションについては、headers and footers documentationを参照してください。
セキュリティ設定
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
'IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"
包括的なセキュリティ オプションについては、暗号化のドキュメントを参照してください。
移行後のチェックリスト
コードの移行が完了したら、以下を確認してください:
- 生成されたPDFの視覚的な比較
- テキストの位置とレイアウトを確認する
- テストテーブルのレンダリングとオーバーフロー
- すべてのページのヘッダー/フッターを確認する
- フォーム入力機能をテストする
- セキュリティ/暗号化を確認する
- パフォーマンスベンチマーク
- 未使用のDynamicPDFライセンスファイルを削除する
- ドキュメントの更新
PDFインフラストラクチャの将来性を確保する
.NET 10が目前に迫り、C# 14が新しい言語機能を導入する中、最新 for .NETパターンを取り入れたPDFライブラリを選択することで、長期的な互換性を確保できます。IronPDFは.NET 6/7/8/9+をネイティブサポートしているため、プロジェクトが2025年や2026年に拡張されても、複数の製品ライセンスを管理したり、断片化されたAPIをナビゲートするような複雑な作業をすることなく、明確に前進することができます。
その他のリソース
DynamicPDFからIronPDFに移行することで、最新のChromiumベースのレンダリングと完全なCSS3サポートを提供しながら、複数の製品ライセンスを管理する複雑さを解消します。 座標ベースの位置決めからHTML/CSS設計への移行は、通常、慣れ親しんだウェブ技術を活用した、より保守性の高いコードにつながります。

