C#でApi2pdfからIronPDFに移行する方法
Api2pdfはクラウドベースのPDF生成サービスを提供していますが、機密文書を外部サーバーに送信すると、セキュリティリスク、コンプライアンス問題、そして時間の経過とともに蓄積される継続的なコストにつながる可能性があります。このガイドでは、Api2pdfからIronPDFへの詳細な移行パスを説明します。IronPDFは、ドキュメントを完全に独自のインフラストラクチャで処理するネイティブ.NET PDFライブラリであり、データ転送の懸念を解消し、変換コストを一度きりの投資に抑えます。
Api2pdfから移行することを検討する理由は何ですか?
Api2pdf は便利なクラウドベースの PDF 生成を提供しますが、開発チームが PDF 生成のニーズを満たすオンプレミスの代替手段を探す要因はいくつかあります。
セキュリティとコンプライアンスの懸念
Api2pdfはクラウドベースのサービスとして運営されており、機密性の高いHTMLや文書はサードパーティのサーバーに送信され、処理されます。 このため、規制対象データを扱う組織にとっては重大な懸念が生じます。
| リスク | Api2pdf | IronPDF |
|---|---|---|
| データ転送 | 外部サーバーに送信されるすべてのコンテンツ | お客様のインフラストラクチャ上でローカルに処理 |
| GDPRコンプライアンス。 | データは管轄地域をまたぐ | データはお客様の環境から離れません |
| HIPAAコンプライアンス。 | 外部に送信されるPHI | PHIをシステム内に保持 |
| SOC 2 | サードパーティ依存 | データの取り扱いを完全に制御 |
| PCI DSS (英語 | 公開される可能性のあるカードデータ | 外部送信なし |
長期的なコスト蓄積
Api2pdfは変換ごとに約$0.005を無期限で請求しますが、IronPdfは1回限りの永久ライセンスを提供します。 大量のPDFを生成するアプリケーションの場合、コストの差はかなりのものになります:
| ボリューム | Api2pdf(年間) | IronPDF (1回のみ) |
|---|---|---|
| 10,000 PDF/月 | ~600ドル/年 | 749ドル(Lite) |
| 50,000 PDF/月 | ~年間3,000ドル | 749ドル(Lite) |
| 100,000 PDF/月 | ~年間6,000ドル | 1,499ドル(Plus) |
IronPdfはほとんどのプロダクションアプリケーションで数ヶ月以内に元が取れます。
パフォーマンスと可用性
Api2pdfはPDF生成リクエストごとに2-5秒の待ち時間を追加するネットワークのラウンドトリップを必要とします。IronPdfはローカルで100-500ミリ秒で処理します。 さらに、IronPdfは完全にオフラインで動作し、外部サービスの可用性に依存できないアプリケーションにとって重要なエアギャップ環境でも動作します。
Api2pdfvs IronPDF:主な違い
| アスペクト | Api2pdf | IronPDF |
|---|---|---|
| データ処理。 | サードパーティのクラウドサーバーに送信 | お客様のインフラストラクチャ上でローカルに処理 |
| 価格について | ペイパーコンバージョン(~$0.005/PDF) | 1回限りの永久ライセンス |
| レイテンシーについて | 2~5秒(ネットワーク往復) | 100~500ミリ秒(ローカル処理) |
| <ストロング>オフライン</ストロング | 不可 | 完全にオフラインで動作 |
| インストール。 | APIキー + HTTPクライアント | シンプルなNuGetパッケージ。 |
| コンプライアンス。 | GDPR/HIPAAへの配慮(データがネットワークから漏れる) | 完全なコンプライアンス管理 |
ステップごとの移行プロセス
ステップ 1: NuGet パッケージを更新する。
Api2pdfパッケージを削除し、IronPdfをインストールしてください:
# Remove Api2pdf
dotnet remove package Api2Pdf
# Install IronPDF
dotnet add package IronPdf# Remove Api2pdf
dotnet remove package Api2Pdf
# Install IronPDF
dotnet add package IronPdfまたはパッケージマネージャーコンソールから:
Uninstall-Package Api2Pdf
Install-Package IronPdfステップ 2: 名前空間参照の更新
Api2pdfの名前空間をIronPdfに置き換えてください:
// Remove these
using Api2Pdf;
using Api2Pdf.DotNet;
// Add these
using IronPdf;
using IronPdf.Rendering;// Remove these
using Api2Pdf;
using Api2Pdf.DotNet;
// Add these
using IronPdf;
using IronPdf.Rendering;ステップ 3: ライセンス キーの設定
アプリケーション起動時にIronPdfライセンスキーを設定してください:
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }ステップ 4: API キー設定の削除
IronPdfはローカルで動作し、APIキーは必要ありません:
// Remove thisApi2pdfpattern
var client = new Api2PdfClient("API_KEY");
// Just create the renderer directly
var renderer = new ChromePdfRenderer();// Remove thisApi2pdfpattern
var client = new Api2PdfClient("API_KEY");
// Just create the renderer directly
var renderer = new ChromePdfRenderer();完全な API 移行のリファレンス
コア クラス マッピング
| Api2pdfクラス | IronPDF 同等物 | ノート |
|---|---|---|
Api2PdfClient<//code> | <コード>ChromePdfRenderer</コード | 主なレンダリングクラス |
| <コード>Api2PdfResult</コード | <コード>PdfDocument</コード | PDFを表す |
| <コード>HeadlessChromeOptions</コード | <コード>ChromePdfRenderOptions</コード | レンダリング設定 |
メソッドマッピング
| Api2pdfメソッド | IronPDF メソッド | ノート |
|---|---|---|
client.HeadlessChrome.FromHtmlAsync(html). | renderer.RenderHtmlAsPdf(html). | HTML to PDF. |
client.HeadlessChrome.FromUrlAsync(url). | renderer.RenderUrlAsPdf(url)のようにします。 | URL to PDF. |
response.Pdf<//code> (URL) | pdf.SaveAs(path)のようにします。 | ファイルに保存 |
response.Pdf(ダウンロード) | <コード>pdf.BinaryData</コード | バイト配列として取得 |
client.PdfSharp.MergePdfsAsync(urls). | PdfDocument.Merge(pdfs). | PDFをマージ。 |
client.PdfSharp.SetPasswordAsync(url, pwd). | pdf.SecuritySettings.OwnerPassword。 | パスワード保護 |
レンダリング オプション マッピング
| Api2pdfオプション | IronPDF オプション | ノート |
|---|---|---|
ランドスケープ = true | RenderingOptions.PaperOrientation = Landscape<//code>. | ページの向き |
PageSize = "A4". | RenderingOptions.PaperSize=PdfPaperSize.A4。 | 用紙サイズ |
PrintBackground = true. | RenderingOptions.PrintHtmlBackgrounds = true. | 背景色 |
MarginTopなど。 | RenderingOptions.MarginTopなど。 | マージン(mm |
Delay = 5000. | RenderingOptions.WaitFor.RenderDelay(5000)。 | レンダリングする前に待つ |
コード移行の例
HTMLからPDFへの変換
最も一般的なApi2pdf操作は、クラウド API 呼び出しからローカル処理への根本的な移行を示しています。
Api2pdfの実装:
// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
var apiResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Hello World</h1>");
Console.WriteLine(apiResponse.Pdf);
}
}// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
var apiResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Hello World</h1>");
Console.WriteLine(apiResponse.Pdf);
}
}IronPDFの実装:。
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}IronPDFはネットワークのラウンドトリップ、APIキーの管理、Api2pdfのURLベースのレスポンスパターンに必要な個別のダウンロードステップを排除します。
URLからPDFへの変換
Api2pdfの実装:
// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
var apiResponse = await a2pClient.HeadlessChrome.FromUrlAsync("https://www.example.com");
Console.WriteLine(apiResponse.Pdf);
}
}// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
var apiResponse = await a2pClient.HeadlessChrome.FromUrlAsync("https://www.example.com");
Console.WriteLine(apiResponse.Pdf);
}
}IronPDFの実装:。
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF created from URL successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF created from URL successfully");
}
}HTMLファイルをPDFに変換(オプション付き)
Api2pdfの実装:
// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
string html = File.ReadAllText("input.html");
var options = new HeadlessChromeOptions
{
Landscape = true,
PrintBackground = true
};
var apiResponse = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options);
Console.WriteLine(apiResponse.Pdf);
}
}// NuGet: Install-Package Api2Pdf.DotNet
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf.DotNet;
class Program
{
static async Task Main(string[] args)
{
var a2pClient = new Api2PdfClient("your-api-key");
string html = File.ReadAllText("input.html");
var options = new HeadlessChromeOptions
{
Landscape = true,
PrintBackground = true
};
var apiResponse = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options);
Console.WriteLine(apiResponse.Pdf);
}
}IronPDFの実装:。
// NuGet: Install-Package IronPdf
using System;
using System.IO;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
string html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created with options successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using System.IO;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
string html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created with options successfully");
}
}IronPdfはレンダリングオプションを各API呼び出しに個別のオプションパラメーターとして渡すのではなく、レンダリングオブジェクト上で直接設定します。
複数のPDFをマージする
Api2pdfの実装:
using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
var pdfUrls = new List<string>
{
"https://example.com/pdf1.pdf",
"https://example.com/pdf2.pdf",
"https://example.com/pdf3.pdf"
};
var request = new PdfMergeRequest { Urls = pdfUrls };
var response = await a2pClient.PdfSharp.MergePdfsAsync(request);
if (response.Success)
{
// Download merged PDF from response.Pdf URL
}using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
var pdfUrls = new List<string>
{
"https://example.com/pdf1.pdf",
"https://example.com/pdf2.pdf",
"https://example.com/pdf3.pdf"
};
var request = new PdfMergeRequest { Urls = pdfUrls };
var response = await a2pClient.PdfSharp.MergePdfsAsync(request);
if (response.Success)
{
// Download merged PDF from response.Pdf URL
}IronPDFの実装:。
using IronPdf;
// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");using IronPdf;
// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");IronPdfの静的なMergeメソッドは複数のドキュメントを直接受け取ることができ、URLベースのワークフローを排除します。
パスワードで保護された PDF
Api2pdfの実装:
using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
// Generate PDF first
var pdfResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Confidential</h1>");
// Then add password protection in separate call
var protectedResponse = await a2pClient.PdfSharp.SetPasswordAsync(
pdfResponse.Pdf,
"secretpassword"
);using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
// Generate PDF first
var pdfResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Confidential</h1>");
// Then add password protection in separate call
var protectedResponse = await a2pClient.PdfSharp.SetPasswordAsync(
pdfResponse.Pdf,
"secretpassword"
);IronPDFの実装:。
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");IronPdfはSecuritySettingsプロパティを通してPDFのパーミッションを細かくコントロールします。
ヘッダーとフッター
Api2pdfの実装:
using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
var options = new HeadlessChromeOptions
{
HeaderHtml = "<div style='font-size:10px'>Company Header</div>",
FooterHtml = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
};
var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options);using Api2Pdf.DotNet;
var a2pClient = new Api2PdfClient("YOUR_API_KEY");
var options = new HeadlessChromeOptions
{
HeaderHtml = "<div style='font-size:10px'>Company Header</div>",
FooterHtml = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
};
var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options);IronPDFの実装:。
using IronPdf;
var renderer = new ChromePdfRenderer();
// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");using IronPdf;
var renderer = new ChromePdfRenderer();
// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");IronPDFは{page}<//code>や{total-pages}<//code>のようなプレースホルダートークンをサポートしています。 その他のオプションについては、headers and footers documentationを参照してください。
.NETコアの統合
Api2pdfの非同期HTTPパターンはIronPDFの直接PDF生成とは大きく異なります。
Api2pdfパターン:
[ApiController]
public class PdfController : ControllerBase
{
private readonly Api2PdfClient _client;
public PdfController()
{
_client = new Api2PdfClient("YOUR_API_KEY");
}
[HttpGet("generate")]
public async Task<IActionResult> GeneratePdf()
{
var response = await _client.HeadlessChrome.FromHtmlAsync("<h1>Report</h1>");
if (!response.Success)
return BadRequest(response.Error);
// Redirect to download URL
return Redirect(response.Pdf);
}
}[ApiController]
public class PdfController : ControllerBase
{
private readonly Api2PdfClient _client;
public PdfController()
{
_client = new Api2PdfClient("YOUR_API_KEY");
}
[HttpGet("generate")]
public async Task<IActionResult> GeneratePdf()
{
var response = await _client.HeadlessChrome.FromHtmlAsync("<h1>Report</h1>");
if (!response.Success)
return BadRequest(response.Error);
// Redirect to download URL
return Redirect(response.Pdf);
}
}IronPDFパターン:
[ApiController]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
// Return PDF directly - no download step needed
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}[ApiController]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
// Return PDF directly - no download step needed
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}IronPdfはBinaryDataまたはStream経由でPDFを直接返すので、リダイレクトからダウンロードというパターンがなくなります。
依存性注入の構成
// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IPdfService, IronPdfService>();
}
// IPdfService.cs
public interface IPdfService
{
PdfDocument GenerateFromHtml(string html);
Task<PdfDocument> GenerateFromHtmlAsync(string html);
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IPdfService, IronPdfService>();
}
// IPdfService.cs
public interface IPdfService
{
PdfDocument GenerateFromHtml(string html);
Task<PdfDocument> GenerateFromHtmlAsync(string html);
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}エラー処理の移行
Api2pdfはレスポンスオブジェクトチェックを使用しています。 IronPDFは.NETの標準的な例外を使用します。
Api2pdfパターン:
var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html);
if (!response.Success)
{
Console.WriteLine($"Error: {response.Error}");
return;
}var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html);
if (!response.Success)
{
Console.WriteLine($"Error: {response.Error}");
return;
}IronPDFパターン:
try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}パフォーマンス比較
| メトリック | Api2pdf | IronPDF |
|---|---|---|
| シンプルなHTML。 | 2~5秒(ネットワーク) | 100-500ミリ秒(ローカル) |
| 複雑なページ | 5~10秒 | 500ms-2s |
| 100のバッチ。 | 分(レート制限) | セカンズ(パラレル) |
| <ストロング>オフライン</ストロング | 不可 | 作業内容 |
| コールドスタート。 | なし | ~2秒(最初のレンダリング) |
パフォーマンス最適化のヒント
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
public PdfDocument GeneratePdf(string html)
{
return SharedRenderer.RenderHtmlAsPdf(html);
}
// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);
// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
public PdfDocument GeneratePdf(string html)
{
return SharedRenderer.RenderHtmlAsPdf(html);
}
// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);
// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delayよくある移行の問題のトラブルシューティング
課題PDFの見た目がApi2pdfの出力と異なる
Api2pdfのヘッドレスChromeの設定に合わせてください:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);問題です:外部リソースが読み込まれません
リソースのロードタイムアウトを設定します:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);
// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);
// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");課題PDFファイルのサイズが大きい
生成後に画像を圧縮します:
renderer.RenderingOptions.ImageQuality = 80;
// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");renderer.RenderingOptions.ImageQuality = 80;
// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");移行後のチェックリスト
コードの移行が完了したら、以下を確認してください:
- PDF出力の品質が期待値に合っていることを確認
- すべてのエッジケース(大きなドキュメント、特殊文字)をテストします
- パフォーマンス指標を検証する(大幅な改善が見られるはず)
- 該当する場合はDocker構成を更新します
- Api2pdfポータルアカウントとAPIキーを削除する
- 更新の監視(API レイテンシの追跡は不要)
- チームの新しいパターンを文書化する
- CI/CDパイプラインを更新する
PDFインフラストラクチャの将来性を確保する
.NET 10が近づき、C# 14が新しい言語機能を導入する中、ネイティブの.NET PDFライブラリを選択することで、進化するランタイム機能との互換性を確保できます。 IronPDFは最新の.NETバージョンをサポートしており、プロジェクトが2025年や2026年まで拡張されても、変換ごとの継続的なコストが発生することなく、移行への投資が報われます。
その他のリソース
Api2pdfからIronPDFに移行することで、PDF生成はクラウドに依存した変換ごとのコストモデルから、ローカルの1回限りの投資に変わります。 機密文書がインフラ上に残り、待ち時間が数秒から数ミリ秒に短縮され、この重要なアプリケーション機能のベンダー依存が解消されます。






