IRONSOFTWAREHOME
ビデオ

Azure Blob Storage に保存された画像を C# でレンダリングする方法

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

PuppeteerSharp からIronPDFへの移行は、300MB以上のChromiumへの依存が必要なブラウザ自動化ツールから、メモリ管理が自動化された専用のPDFライブラリにワークフローを移行します。 このガイドは、ランタイムChromiumダウンロードを排除し、負荷下で報告されたメモリ増加に対処し、包括的なPDF操作機能を追加するステップバイステップの移行パスを提供します。

なぜPuppeteerSharpからIronPDFへ移行するのか

PuppeteerSharpの理解

PuppeteerSharpは、GoogleのPuppeteer for .NET移植版で、ブラウザ自動化機能をC#にもたらします。 Chromeに内蔵されているprint-to-PDF機能(ブラウザでCtrl+Pを押すのと同じ)を使ってPDFを生成します。 このため、画面に表示されるものとは異なる、紙に最適化された印刷用出力が作成されます。

PuppeteerSharpは、ウェブテストとスクレイピングのために設計されており、文書生成のために設計されていません。 PDFの生成にPuppeteerSharpを使用することは可能ですが、制作上の大きな課題があります。

ブラウザ自動化の問題

PuppeteerSharpは、ドキュメント生成ではなく、ブラウザ自動化のために設計されています。 このため、PDFに使用する場合、基本的な問題が発生します:

1.初回使用前に300MB以上のChromiumダウンロードが必要です。 PuppeteerSharpの重大な欠点は、主にChromiumバイナリをバンドルしているため、デプロイメントサイズが大きいことです。 この膨大なサイズはDockerイメージを肥大化させ、サーバーレス環境におけるコールドスタートの問題を引き起こす可能性があります。

  1. 負荷がかかった状態で報告されるメモリの増加 は、手動のブラウザリサイクルが必要です。 持続的な負荷の下で、PuppeteerSharpユーザーはブラウザーインスタンス間でメモリの累積が報告されており、通常は手動のプロセス再利用によって対処されています。

3.ブラウザのライフサイクル管理による複雑な非同期パターン

4.PDF出力(画面キャプチャではなく、Ctrl+Pと同等)。 レイアウトはリフローし、背景はデフォルトで省略され、出力はブラウザのビューポートに合わせるのではなく、印刷用にページ分割されます。

5.コンプライアンス要件のため、PDF/AまたはPDF/UAのサポートはありません。 PuppeteerSharpでは、PDF/A(アーカイブ)またはPDF/UA(アクセシビリティ)に準拠した文書は作成できません。

6.PDFの操作はできません - 生成のみで、マージ/分割/編集はできません。 PuppeteerSharpはPDFを効率的に生成できますが、PDFの結合、分割、保護、編集など、さらなる操作のための機能が欠けています。

PuppeteerSharpとIronPDFの比較

アスペクトPuppeteerSharpIronPDF
主な目的ブラウザ自動化PDF生成
クロム依存300MB以上の個別ダウンロード最適化エンジン内蔵
APIの複雑さ非同期ブラウザ/ページライフサイクル同期ワンライナー
初期化BrowserFetcher.DownloadAsync() + LaunchAsyncnew ChromePdfRenderer()
メモリ管理手動のブラウザリサイクル自動翻訳
負荷下のメモリ重いワークロードでの増加が報告されています持続的な実行間で安定しています
PDF/Aサポート不可サポート対象
PDF/UAアクセシビリティ不可サポート対象
PDFの編集不可マージ、分割、スタンプ、編集
デジタル署名不可サポート対象
スレッドセーフティ制限付き(上流のガイダンスによる)フル
ライセンスについてMIT(オープンソース)商用ライセンス

プラットフォームサポート

ライブラリ.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDFフルフルフルフル
PuppeteerSharpnetstandard2.0 経由フルフルフル

IronPDF のサポートは最新の .NET ターゲットに対して行われており、ほとんどの既存のアプリケーションに互換性の摩擦なく統合できます。


始める前に

前提条件

  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 PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

No BrowserFetcher.DownloadAsync() required with IronPDF - レンダリングエンジンは自動的にバンドルされます。

ライセンス構成

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

完全な API リファレンス

名前空間の変更

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

コア API マッピング

PuppeteerSharp APIIronPDF APIノート
new BrowserFetcher().DownloadAsync()不要ブラウザのダウンロードなし
Puppeteer.LaunchAsync(options)不要ブラウザ管理なし
browser.NewPageAsync()不要ページコンテキストなし
page.GoToAsync(url)renderer.RenderUrlAsPdf(url)直接レンダリング
page.SetContentAsync(html)renderer.RenderHtmlAsPdf(html)直接レンダリング
page.PdfAsync(path)pdf.SaveAs(path)レンダリング後
await page.CloseAsync()不要自動クリーンアップ
await browser.CloseAsync()不要自動クリーンアップ
PdfOptions.FormatRenderingOptions.PaperSize用紙サイズ
PdfOptions.LandscapeRenderingOptions.PaperOrientationオリエンテーション
PdfOptions.MarginOptionsRenderingOptions.MarginTop/Bottom/Left/Right個々の余白
PdfOptions.PrintBackgroundRenderingOptions.PrintHtmlBackgrounds背景印刷
PdfOptions.HeaderTemplateRenderingOptions.HtmlHeaderHTMLヘッダー
PdfOptions.FooterTemplateRenderingOptions.HtmlFooterHTMLフッター
page.WaitForSelectorAsync()RenderingOptions.WaitFor.HtmlElementId要素を待つ

コード移行の例

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

以前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}

翻訳後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

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

この例は、基本的なアーキテクチャの違いを示しています。PuppeteerSharpでは6つの非同期操作が必要です:BrowserFetcher.DownloadAsync() (300MB+のChromiumダウンロード)、await usingでの適切な廃棄。

IronPDF はこの複雑さをすべて排除します:SaveAs()します。 非同期パターン、ブラウザのライフサイクル、Chromiumのダウンロードはありません。 IronPDFのアプローチは、よりきれいな構文と最新 for .NETアプリケーションとのより良い統合を提供します。 包括的な例については、HTML to PDF documentationを参照してください。

例2: URLからPDFへの変換

以前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}

翻訳後(IronPDF):

// NuGet: Install-Package IronPdf
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");
    }
}

PuppeteerSharp はURLに移動するためにPdfAsync()を続けます。IronPDFはナビゲーションとPDF生成を一回の呼び出しで処理する単一のRenderUrlAsPdf()メソッドを提供します。 詳しくは、チュートリアルをご覧ください。

例3: 余白を使ったカスタムページ設定

以前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        
        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}

翻訳後(IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}

この例では、PDFオプションが2つのライブラリ間でどのようにマッピングされるかを示しています。PuppeteerSharpは"20mm")を含めて使用します。IronPDFは直接ペーパーサイズの列挙型、向きの列挙型、およびミリメートル単位の数値余白値を持つRenderingOptionsプロパティを使用します。

主なマッピング

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (数値のミリメートル)

持続的な負荷におけるメモリの増加

PuppeteerSharpにおける持続的な負荷の下でのメモリの累積が報告されており、通常は手動のブラウザリサイクルによって軽減されています:

//PuppeteerSharp- memory growth typically requires periodic recycling
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations

//IronPDF- reuse a single renderer across operations
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
C#

IronPDFは、PuppeteerSharpが必要とするブラウザ・プーリングのインフラを不要にします:

// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

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

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

非同期から同期への変換

PuppeteerSharpは、全体を通してasync/awaitを必要とします; IronPDFは同期操作をサポートしています:

// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

マージン単位の変換

PuppeteerSharpは文字列単位を使用します; IronPDFはミリメートルの数値を使用しています:

//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;

ヘッダー/フッター プレースホルダーの変換

PuppeteerSharpクラスIronPDF プレースホルダー
<span class='pageNumber'>{page}
<span class='totalPages'>{total-pages}
<span class='date'>{date}
<span class='title'>{html-title}

移行後の新機能

IronPDFに移行した後は、PuppeteerSharpでは提供できない機能を得ることができます:

PDFマージ

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");

ウォーターマーク

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);

パスワード保護

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

デジタル署名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

PDF/A準拠

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);

性能比較概要

メトリックPuppeteerSharpIronPDF改善
最初のPDF(コールドスタート)45s+~20s55%以上のスピード
後続のPDF変数一貫性予測可能な
メモリ使用量500MB以上(成長中)~50MB(安定版)90%少ないメモリ
ディスクスペース(Chromium)300MB以上0ダウンロードを排除する
ブラウザダウンロード必須不要ゼロセットアップ
スレッドの安全性制限的フル信頼できる並行処理
PDF作成時間45s20s55%速い

移行チェックリスト

移行前

  • コードベース内のすべてのPuppeteerSharpの使用箇所を特定する
  • ドキュメントの余白値(文字列をミリメートルに変換)
  • 変換のためのヘッダー/フッターのプレースホルダー構文に注意してください
  • ブラウザプーリング/リサイクルインフラストラクチャを削除する
  • IronPDFからIronPDFライセンスキーを取得します

パッケージの変更

  • PuppeteerSharp NuGetパッケージを削除
  • .local-chromium フォルダーを削除して約300MBのディスクスペースを回収
  • IronPdf NuGetパッケージをインストール: dotnet add package IronPdf

コードの変更

  • 名前空間のインポートを更新する
  • BrowserFetcher.DownloadAsync() 呼び出しを削除
  • Puppeteer.LaunchAsync() とブラウザ管理を削除
  • page.SetContentAsync() + page.PdfAsync()RenderHtmlAsPdf() に置き換え
  • page.GoToAsync() + page.PdfAsync()RenderUrlAsPdf() に置き換え
  • マージン文字列をミリメートル値に変換する
  • ヘッダー/フッターのプレースホルダー構文を変換する
  • すべてのブラウザ/ページ破棄コードを削除します
  • ブラウザプーリングインフラストラクチャを削除する
  • アプリケーションの起動時にライセンスの初期化を追加

移行後

  • PDF出力の視覚的な比較
  • メモリの安定性をテストする負荷(リサイクルしなくても安定した状態を保つ必要があります)
  • ページ番号付きのヘッダー/フッターのレンダリングを検証する
  • 必要に応じて新しい機能(セキュリティ、透かし、結合)を追加します

ご注意: PuppeteerSharp はその所有者の登録商標です。 このサイトは、PuppeteerSharp と提携、支持、またはスポンサーを受けていません。すべての製品名、ロゴ、およびブランドはそれぞれの所有者の財産です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。
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日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。