IRONSOFTWAREHOME
ビデオ

How to Convert SVGs to PDF Using C#

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

なぜNReco PDFジェネレーターからIronPDFへ移行するのか

NRecoPDFジェネレータの重大なセキュリティ問題

NReco PDF Generatorはwkhtmltopdfバイナリをラップし、その既知のセキュリティ脆弱性を引き継ぎます。 wkhtmltopdfプロジェクトの最後の安定リリースは0.12.6(2020年6月)であり、上流のリポジトリは2023年1月2日にアーカイブされたため、パッチは来ません:

  • CVE-2020-21365: ディレクトリトラバーサル/作成されたHTMLを介したローカルファイル読み取り(同一オリジンポリシーの脆弱性)
  • CVE-2022-35583: 注入された<iframe>を介したサーバーサイドリクエスト偽造 (SSRF) in 0.12.6 (CVSS 9.8)

追加の NReco PDF ジェネレーターの制限

  1. 大規模でのライセンスフリクション: 非SaaSの単一サーバー生産展開には無料; SaaS、マルチサーバー、または再配布シナリオにはnrecosite.comからの$199の企業用ソースコードパックが必要です。

  2. 旧式のレンダリングエンジン: CSS3/JSサポートが限定されたWebKit Qt(2012年ごろ):

    • CSSグリッドやFlexboxを使用しない
    • 最新 for JavaScript(ES6+)は使用しないでください。
    • 貧弱なウェブフォントサポート
    • CSS変数やカスタムプロパティを使用しない
  3. 外部バイナリ依存関係: プラットフォームごとにwkhtmltopdfバイナリを管理する必要があります (wkhtmltopdf.exe, wkhtmltox.dll)。

  4. メンテナンスの停滞: NReco.PdfGenerator 1.2.1は2023年1月8日に公開され、nuget.orgでのさらにリリースはありません; 基礎のwkhtmltopdfエンジンはもう更新されません。

5.**非同期サポートの制限:**同期 API は Web アプリケーション内のスレッドをブロックします。

NReco PDF GeneratorとIronPDFの比較

アスペクトNReco PDFジェネレータIronPDF
レンダリングエンジンWebKit Qt (2012)Chromium(現在)
セキュリティ未パッチの複数のCVE(例:CVE-2020-21365, CVE-2022-35583); エンジンは2023年1月2日にアーカイブされましたアクティブなセキュリティアップデート
CSSサポートCSS2.1、限定的なCSS3フルCSS3、グリッド、フレックスボックス
JavaScript基本的なES5完全なES6+、async/await
依存関係外部wkhtmltopdfバイナリ自己完結型
非同期サポート同期のみ完全なasync/await
ウェブフォント制限的フルGoogleフォント、@font-face
ライセンス非SaaSの単一サーバー用に無料です; SaaS / マルチサーバー用の$199の企業用パック透明な商用価格設定
無料レベル非SaaSの単一サーバーライセンスの下で無料トライアルには透かしは必要ありません

始める前に

前提条件

  1. .NET環境: .NET Framework 4.6.2+ または.NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGetアクセス: NuGetパッケージをインストールする機能
  3. IronPDFライセンス: IronPDFからライセンスキーを取得します。

NuGetパッケージの変更

# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator

# Install IronPDF
dotnet add package IronPdf
SHELL

また、配備からwkhtmltopdfバイナリを削除してください:

  • プロジェクトからwkhtmltox.dllを削除する
  • wkhtmltopdfインストールスクリプトの削除
  • プラットフォーム固有のバイナリフォルダの削除

ライセンス構成

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

NRecoPDFジェネレーターの使用法を特定する

# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
SHELL

完全な API リファレンス

コア クラス マッピング

NReco PDFジェネレータIronPDF
HtmlToPdfConverterChromePdfRenderer
PageMargins個々のマージン特性
PageOrientationPdfPaperOrientation
PageSizePdfPaperSize

レンダリング メソッド マッピング

NReco PDFジェネレータIronPDF
GeneratePdf(html)RenderHtmlAsPdf(html)
GeneratePdfFromFile(url, output)RenderUrlAsPdf(url)
GeneratePdfFromFile(htmlPath, output)RenderHtmlFileAsPdf(path)
(非同期はサポートされていません)_。RenderHtmlAsPdfAsync(html)
(非同期はサポートされていません)_。RenderUrlAsPdfAsync(url)

ページ構成マッピング

NReco PDFジェネレータIronPDF
PageWidth = 210RenderingOptions.PaperSize = PdfPaperSize.A4
PageHeight = 297RenderingOptions.SetCustomPaperSizeinMilimeters(w, h)
Orientation = PageOrientation.LandscapeRenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Size = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4

マージン マッピング

NReco PDFジェネレータIronPDF
Margins.Top = 10RenderingOptions.MarginTop = 10
Margins.Bottom = 10RenderingOptions.MarginBottom = 10
Margins.Left = 10RenderingOptions.MarginLeft = 10
Margins.Right = 10RenderingOptions.MarginRight = 10
new PageMargins { ... }個々のプロパティ

ヘッダー/フッター プレースホルダー マッピング

NReco PDFジェネレータ(wkhtmltopdf)IronPDF
[page]{page}
[topage]{total-pages}
[date]{date}
[time]{time}
[title]{html-title}

出力処理のマッピング

NReco PDFジェネレータIronPDF
byte[] pdfBytes = GeneratePdf(html)PdfDocument pdf = RenderHtmlAsPdf(html)
File.WriteAllBytes(path, bytes)pdf.SaveAs(path)
return pdfBytesreturn pdf.BinaryData
new MemoryStream(pdfBytes)new MemoryStream(pdf.BinaryData)

コード移行の例

例1: 基本的なHTMLからPDFへ

**翻訳前 (NReco PDF Generator): **

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}

翻訳後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}

基本的な違いは、戻り値の型と保存パターンです。 NReco PDF GeneratorのFile.WriteAllBytes()を使用して手動でディスクに書き込む必要があります。 IronPDFのPdfDocumentオブジェクトを返します。

このオブジェクト指向のアプローチは、保存する前にPDFを操作(透かしを追加したり、文書をマージしたり、セキュリティを追加したり)できるという、さらなる利点を提供します。 既存のコードとの互換性のために生のバイトが必要な場合は、pdf.BinaryDataを使用してください。 その他のレンダリングオプションについては、HTML to PDF documentationを参照してください。

例2: 余白を使ったカスタムページサイズ

**翻訳前 (NReco PDF Generator): **

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        htmlToPdf.PageWidth = 210;
        htmlToPdf.PageHeight = 297;
        htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("custom-size.pdf", pdfBytes);
    }
}

翻訳後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("custom-size.pdf");
    }
}

NReco PDF Generatorは数値寸法 (PageWidth = 210, PageHeight = 297) とPageMarginsオブジェクトを使用します。 IronPDFは標準サイズ(A4、レター、リーガルなど)を含むRenderingOptionsオブジェクト上の個別の余白プロパティを使用します。

主な移行の変更点

  • PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • new PageMargins { Top = 10, ... }→ Individual properties: RenderingOptions.MarginTop = 10

列挙型でカバーされていないカスタム用紙サイズについては、RenderingOptions.SetCustomPaperSizeinMilimeters(width, height)を使用してください。 ページ構成オプションの詳細については、こちらをご覧ください。

例3: URLからPDFへの変換

**翻訳前 (NReco PDF Generator): **

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}

翻訳後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

NReco PDF Generatorは、ローカルファイルとURLの両方に対して、紛らわしいことにGeneratePdfFromFile()メソッドを使用します。第2パラメータはNull許容です。 IronPDFは専用のメソッドを提供します: URL用のRenderHtmlFileAsPdf()

IronPDFのアプローチはよりクリーンで直感的です。非同期Webアプリケーションでは、スレッドをブロックしないようにするためにawait renderer.RenderUrlAsPdfAsync(url)を使用してください。これはNReco PDF Generatorでは単にできません。


重要な移行に関する注意事項

ズーム値変換

NReco PDF Generatorは浮動小数点数(0.0-2.0)を使用し、IronPDFはパーセント整数を使用します:

// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90

// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);

プレースホルダーの構文の更新

すべてのヘッダー/フッターのプレースホルダーを更新する必要があります:

NReco PDFジェネレータIronPDF
[page]{page}
[topage]{total-pages}
[date]{date}
[title]{html-title}
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};

返品タイプの変更

NReco PDF Generatorはbyte[]を直接返します; IronPDFはPdfDocumentを返します:

//NReco PDFジェネレータpattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;

スレッドの安全性と再利用性

NReco PDF Generatorは通常、呼び出しごとに新しいコンバータを作成します。 IronPDFのChromePdfRendererはスレッドセーフで再利用可能です:

//NReco PDFジェネレータpattern (creates new each time):
public byte[] Generate(string html)
{
    var converter = new HtmlToPdfConverter();
    return converter.GeneratePdf(html);
}

//IronPDFpattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] Generate(string html)
{
    return _renderer.RenderHtmlAsPdf(html).BinaryData;
}

非同期サポート (新機能)

IronPDFはNReco PDF Generatorが提供できない非同期/待機パターンをサポートしています:

// NReco PDF Generator: No async support available

// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
    var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

トラブルシューティング

問題 1: HtmlToPdfConverter が見つかりません

問題: IronPDFにはHtmlToPdfConverterクラスが存在しません。

解決策: ChromePdfRendererを使用してください:

// NReco PDF Generator
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();

問題2: GeneratePdfが間違った型を返す

問題: コードはPdfDocumentを受け取ります。

解決策: .BinaryDataプロパティにアクセスしてください:

// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);

// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;

問題 3: PageMargins オブジェクトが見つかりません

問題: IronPDFにはPageMarginsクラスが存在しません。

**解決策:**個別のマージンプロパティを使用します。

// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };

// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;

課題4:ページ番号が表示されない

問題: [topage]プレースホルダーが機能しません。

解決策: IronPDFプレースホルダー構文を更新します。

// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};

移行チェックリスト

移行前

  • コードベース内のNReco.PdfGeneratorの使用状況をすべてインベントリする
  • すべてのCustomWkHtmlPageArgsの値を文書化する
  • プレースホルダーを含むすべてのヘッダー/フッター HTML テンプレートを一覧表示します
  • 非同期要件(Web コントローラー、サービス)を特定する
  • ズームと余白の設定を確認する
  • 比較のために既存のPDF出力をバックアップする
  • IronPDFライセンスキーを取得する

パッケージの変更

  • NReco.PdfGenerator NuGetパッケージを削除する
  • IronPdf NuGetパッケージをインストールする: dotnet add package IronPdf
  • using IronPdf;への名前空間インポートを更新する

コードの変更

  • 起動時にライセンスキー設定を追加する
  • ChromePdfRendererに置き換える
  • RenderHtmlAsPdf(html)に置き換える
  • RenderUrlAsPdf(url)に置き換える
  • PageMarginsオブジェクトを個々の余白プロパティに変換する
  • ズーム値を浮動小数点数からパーセンテージに更新
  • プレースホルダーの構文を更新する: [page][topage]{total-pages}
  • pdf.SaveAs()に置き換える
  • 有益な場合は同期呼び出しを非同期に変換する

移行後

  • プロジェクト/デプロイメントからwkhtmltopdfバイナリを削除します
  • Dockerファイルを更新してwkhtmltopdfのインストールを削除します
  • PDF出力を比較する回帰テストを実行する
  • ヘッダー/フッターのプレースホルダーが正しくレンダリングされることを確認する
  • すべてのターゲットプラットフォーム(Windows、Linux、macOS)でテスト
  • CI/CD パイプラインを更新して wkhtmltopdf ステップを削除します
  • CVE の削除を確認するためにセキュリティスキャンを更新します

ご注意: NRecoとwkhtmltopdfは、それぞれの所有者の登録商標です。 このサイトは、NRecoやwkhtmltopdfと提携しておらず、支持やスポンサー提供も受けていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。
Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。