フッターコンテンツにスキップ
製品比較

IronPDFを使用して.NET 10でHTMLをPDFに変換する方法

すべての始まりとなった C# PDF ライブラリ問題

IronPDF

2016年当時、Iron Softwareのコンサルティングチームは、HTMLからPDFへの変換の悪夢に溺れかけていました。 私たちは、フォーチュン500に名を連ねるクライアントのために、ドキュメント生成の近代化を依頼されました。 どの"ソリューション"も、最初は有望に思えたのですが、ダイナミックなコンテンツ、CSS3レイアウト、JavaScriptを多用したページなど、現実世界の複雑さに直面したとたん、ライブラリは無言で失敗するか、見事にクラッシュしました。

ジェフ・フリッツは、最近の.NETカンファレンスで、この言葉を完璧に要約しています:

.NETにおけるPDF生成の状況は、放棄されたプロジェクトと中途半端なソリューションの墓場でした。

彼は誇張していませんでした。 私たちは、ほとんどメンテナンスされていないものから、派手な企業向けセールス・デッキを持つものまで、市場に出回っているほとんどすべてのライブラリをテストしてきたため、直接的に知っていました。 試行錯誤を何カ月も繰り返し、髪をかきむしるようなフラストレーションを感じた後、既存のソリューションでは現代の要件を満たせないことが痛切にわかりました。

IronPDFの物語はここから始まりました。私たちが試したあらゆる代替手段の失敗によって、必要性から生まれました。

なぜ既存のソリューションは失敗したのか (そして今も失敗している)

単刀直入に言いますと、私たちがIronPdfを作ったのは、他のすべてが壊れていたからです。 失敗は技術的なものばかりではありませんでした; このような翻訳には、法律的な問題や、建築的な問題、時には単なる狂気も含まれます。

以下は、私たちがコンサルティング業務で遭遇したもので、これらの"ソリューション"がなぜ私たちをより良いものを作るように駆り立てたかを示す実際のコードです。

偉大なる C# PDF ライブラリのおとり商法

開発者がアプリケーション全体を構築した後にライセンスを変更したライブラリから始めましょう:

iTextSharp - 本当は無料ではない"無料"ライブラリ</a

2009年、iTextSharpはフリーでオープンソースのPDFライブラリとして宣伝されました。 当時はLGPLライセンスで配布されており、開発者にとっては妥当な選択だと思われました。 しかし、2012年までにライセンス条項はAGPLに変更された。 AGPLの下では、開発者は、アプリケーション全体をオープンソースにするか、商用ライセンスにお金を払うか、という難しい選択を迫られていました。

2025年になると、iTextの商用ライセンスは数千ドル(サーバー1台あたり約2500ドル)になります。 このため、多くの開発者が"AGPLの罠"と呼んでいる、iTextSharpを使用し、完全なソースコードを公開するか、多額のライセンス料を支払うかのどちらかを選択しなければならない状況が生まれました。

ライセンスの問題に加えて、iTextはネイティブのHTMLからPDFへの変換をすぐに提供しません。 単純なRenderHtml(html)メソッドはありません。 その代わり、開発者はXMLWorkerやpdfHTMLアドオンのような追加コンポーネントに依存しなければなりません。

このような制限のあるライセンスとビルトインHTML-to-PDFサポートの欠落の組み合わせが、今日多くのチームがiTextSharpを避けている理由です。

iTextSharpだけではありません。 QuestPDFはもう1つの罠でした。"最高のC# PDFライブラリ"としてオンライン上で大々的に宣伝されていますが、HTMLからPDFへの変換にはまったく対応していません。 開発者は、単に設計されていないワークフローに無理矢理入れようと何日も費やしました。

QuestPDF - あなたが思っているようなことはできないライブラリ</a

QuestPDFは、C#用の最高のPDFライブラリの1つとして、オンライン、特にRedditコミュニティでよく宣伝されています。 しかし、必ずしも明らかではない重要な制限があります:QuestPDFはHTML-to-PDFを全くサポートしていません。

QuestPDFは、HTMLをレンダリングする代わりに、流暢なAPIを使用してプログラムで文書を作成することを開発者に要求します。 例えば、ページ、コンテナ、テキストブロックをC#コードで直接定義します。 既存のHTMLを単純に変換するのではなく、手作業でPDFを作成するようなものです。

ライセンスも考慮しなければなりません。 いわゆる"コミュニティライセンス"はAGPLであり、プロジェクト全体をオープンソース化するか、商用ライセンスを購入する必要があります。 商用価格はおよそ699ドルから7,999ドルで、HTMLからPDFへのレンダリングが含まれていないライブラリとしては高く感じるかもしれません。

このような制限があるため、QuestPDFは、.NETでのシンプルで信頼性の高いHTMLからPDFへの変換を特に求めている開発者には適切なソリューションではないかもしれません。

wkhtmltopdfの災害(2016-2024)

WkHtmlToPdfを本番で使用することは、悪名高い苦痛でした。 どのラッパーを使っても、同じイライラするパターンに従っているようでした:

1.謎のバイナリをサーバーにコピーします。 2.適切なネイティブ依存関係がインストールされていることを望みます。 3.本番で予測不可能なクラッシュが起こるのをご覧ください。

ラッパーがあったとしても、信頼性は保証されているとは言い難い。 開発者は、次のようなエラーに頻繁に遭遇します:

  • *"DLL 'wkhtmltox'をロードできません。
  • *"アドレス 0x00000000 でアクセス違反が発生しました。
  • "アプリケーションが動作を停止しました"
  • "Qt:OLE を初期化できませんでした (エラー 80010106) "

このような失敗には、しばしば手作業が必要でした。 場合によっては、プロセスを再稼働させるためにアプリケーションプールを再起動するという、脆弱で持続不可能な解決策を講じることもありました。

この不安定さと厄介なデプロイプロセスが相まって、WkHtmlToPdfは本格的なプロダクションワークロードには危険な選択となった。

2024年、wkhtmltopdfはついに放棄された。 その上に構築されたすべてのC# PDFライブラリは、即座に技術的負債となりました:

  • TuesPechkin - 最終更新2015年、マルチスレッドの主張はフィクションです。
  • Rotativa-MVCオンリーで、2025年にまだ枯れたバイナリを出荷している。
  • DinkToPdf - 本当はなかった".NET Core互換"フォーク。
  • Haukcode.DinkToPdf - 枯れた亜種の亜種
  • NReco.PdfGenerator-放棄されたソフトウェアのラッピングに150ドル以上を請求する
  • OpenHtmlToPdf - 名前からして違いますが、そうではありません。

wkhtmltopdfラッパーを使用してHTMLをC#でPDF化しようとする開発者は、ファイルのパーミッション、相対URL、バイナリの依存関係を常に管理しなければなりませんでした。 Webページ全体のPDFドキュメントの生成は不安定で、HTML要素内の改ページも予測できませんでした。

"Chromeを使えばいい"という悪夢

その後、ブラウザの自動化が登場しました。 "Puppeteerを使えばいい!"と言われました。 PuppeteerSharpとPlaywrightは技術的にはPDFを生成できますが、本物のC# PDFライブラリではありません。 これらのツールは、重いブラウザバイナリを必要とし、複雑なデプロイメントを必要とし、PDF/AやPDF/UAのようなコンプライアンス機能がありません。

実際の翻訳はこんな感じです:

// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Chromeへの依存度が高いことに加え、開発者は動的コンテンツ、CSSのサポート、HTMLからPDFへの変換のための印刷CSSといった課題に直面しました。 この方法でウェブページを自動化すると、ページ区切りが正しくなかったり、メモリのフットプリントが大きかったり、PDFのページサイズが予測できなかったりすることがよくありました。

価値がなかった商用 C# PDF ライブラリ

私たちは、あらゆる市販のC# HTML to PDFライブラリを評価しました。 紙の上では、これらのライブラリは有望に見えましたが、実際には、どれも隠れたコストや制限、時代遅れの技術を伴っていました。 500~5000ドルでよくあるのはこんな感じです:

GemBox.Document(ジェムボックス・ドキュメント) - 段落カウンタ

GemBox.Documentは無料と宣伝していますが、20段落までです。ただし、20段落までです。キャッチフレーズは、すべてのテーブルセルも段落としてカウントされることです。 つまり、5×5のテーブルのような単純なものを作成する場合、それはすでに25段落であり、ライセンス料を支払う必要があります。

GemBox.Documentのフルバージョンは約680ドルで、これは基本的なHTMLからPDFへの変換のためだけです。 フリー層の制限が厳しく、フルライセンスのコストがかかるため、このライブラリを使用してプロジェクトを拡張することはすぐに難しくなります。

SelectPdf – "クロスプラットフォーム"の嘘

SelectPdfはしばしばクロスプラットフォームのHTMLからPDFへのソリューションとして紹介されますが、実際にはWindows上でのみ動作します。 499ドルから始まるライセンスを購入した開発者は、ライブラリがLinuxやmacOSと互換性がないことにすぐに気づく。

また、無料版には大きな制限があります。 最大5ページまでしか作成できません; 6ページ目から、出力全体に大きな"BUY A LICENSE"の透かしが押されています。

このような制限があるため、SelectPdfは、真のクロスプラットフォームサポートを期待する開発者や、すぐに有料版の壁にぶつかることなくライブラリをテストしたい開発者にとっては、危険な選択となります。

EO.Pdf - レガシーな荷物

EO.Pdfは、長年にわたって大きな負債を背負ってきたライブラリであるため、799ドルという高価格になっている。 もともとは、レンダリングエンジンとしてInternet Explorerに依存していました。最近では、Chromeの使用に切り替えましたが、126MBという大きなフットプリントが伴います。 クロスプラットフォームのサポートが謳われていますが、EO.Pdfは依然としてWindows中心です。

技術的には、HtmlToPdf.ConvertHtml(html, pdfStream)メソッドは機能しますが、コストと制限を考えると、EO.Pdfは最新のHTML機能を扱うための費用対効果の高いソリューションとは考えられません。

HiQPdf-3ページの不思議

HiQPdfは無料版であることをアピールしていますが、実際にはかなり制限されています。 4ページ目に到達するとすぐに、文書全体に大きな透かしが入ります。

制限を解除したい場合は、約595ドルからの商用ライセンスを購入する必要があります。

実際には、このため、無料版は非常に小さな文書にのみ役立ちます。 ページ数が多くなると、すぐに制限ページ数に達してしまい、開発者は有料アップグレードを余儀なくされます。

Spire.PDF – 画像が実際にはPDFでないとき

Spire.PDFはHTMLからPDFへの変換を宣伝していますが、実際にはスクリーンショットを撮るだけでHTMLを"変換"することがよくあります。 その結果、テキストを選択できない大きなPDF(時には10MB)になります。 なぜPDFを検索できないのですか?答えは簡単です。PDFは事実上、画像として埋め込まれているだけで、実際のテキストではないからです。

メソッドLoadFromHTMLは、いくつかのブールパラメータを取りますが、それらの目的は不明確であり、公式ドキュメントはほとんどガイダンスを提供しません。 多くの場合、説明を得る唯一の方法は営業に連絡することです。

このアプローチにより、Spire.PDFは、検索可能、コピー可能、または適切に構造化されたPDFを必要とするすべての人にとって問題となります。

ABCpdf - ライセンスの迷路

ABCpdfは"無料ライセンス"を宣伝していますが、実際には登録が必要で、期限があり、透かしが追加されます。 フルバージョンは、Geckoエンジン(Firefoxの古いバージョン)またはTrident(Internet Explorer)に依存しています。 驚くべきことに、2025年になっても、レンダリングのオプションとしてInternet Explorerが提供されています。

ABCpdfを使用する場合、HTMLコンテンツを追加すると、これらの古いレンダリングエンジンに制約されることになります。 たとえば、AddImageHtml(html)を呼び出すと、選択に応じて、IEまたは時代遅れのFirefoxエンジンのいずれかを使用してレンダリングされます。

ExpertPdf - 高価であることのエキスパート

ExpertPdfの価格は550ドルから1,200ドルと高額です。そのコストで何が得られるのか?基本的に古いバージョンのChromeのラッパーであり、2018年以降更新されていないドキュメントである。

Winnovative - イノベーションは2016年に停止しました

WinnovativeのHTML-to-PDFコンバータは、2016年のWebKitエンジンをベースにしています。その名前とは裏腹に、ライブラリは最新のウェブ標準に追いついていません。 価格は、オバマ大統領時代にさかのぼる技術で750ドルから1,600ドルです。

このコンバータは、CSSグリッドや最新のJavaScript機能をサポートしていません。 PDFを作成することはできますが、現在のHTMLからPDFへのソリューションと比較すると明らかに時代遅れです。

PDFmyURL - ライブラリですらない

PDFmyURLは真のC#ライブラリではありません; これは本質的には単なるAPIラッパーです。 あなたがそれを使用するとき、あなたは他人のサーバー上であなたの文書を処理するために支払うことになり、あなたの文書が機密である場合、それは懸念される可能性があります。最低コストは月額39ドルです。

機能的には、C#でPDFmyURLを使うということは、そのウェブサービスにHTTPリクエストをするということです。 例えば、同社のAPIエンドポイントにURLを送信し、応答としてPDFを受信します。 PDFを生成することができますが、スタンドアロンのC# PDFライブラリではなく、ネットワークアクセスを必要とするWebサービスです。

GrabzIt(グラブイット) - PDFではなくスクリーンショット

GrabzItは、もともとウェブサイトのスクリーンショットを撮るために設計されました。 PDFの生成は、中核的な機能というよりは、むしろ後付けです。 このサービスはキャプチャごとに課金され、真のC# HTML to PDFソリューションは提供しません。

PDF Duo .NET - 謎のライブラリ

PDF Duo .NETは、余分なDLLなしで動作すると主張しています。 実際には、開発者コミュニティではほとんど知られておらず、使用されていません。 ドキュメントはほとんど存在せず、サポートフォーラムにはわずかな投稿があるだけで、すべて2019年にさかのぼります。

これらのライブラリが技術的に機能する場合でも、実用的な制限があります:

  • ほとんどの無料版は、大きな制約(ページ制限、透かし、制限機能)があります。
  • ライセンスには、余分なコストや制限条項が隠されていることがよくあります。
  • エンジンは時代遅れで(IE、古いChrome、WebKit 2016)、最新のHTML/CSSでは失敗します。
  • クロスプラットフォームのサポートは、誤解を招くか不完全です。
  • 大規模なデプロイメントには、回避策と余分なデバッグが必要です。

要するに、市販のライブラリは紙の上では魅力的に見えますが、実運用では技術的負債を生み、チームは多額の出費を強いられるか、最終的にはIronPDFのような "ただ動く "ライブラリに乗り換えなければなりません。

すべてを犠牲にする"無料"C# PDF ソリューション

無料"が無料でないこともあります。 C#のオープンソースまたは"トライアル"PDFライブラリの多くには、開発者の時間の損失、不完全なHTMLからPDFへのサポート、または微妙なライセンスの罠など、隠れたコストがあります。 あなたはお金を節約していると思うかもしれませんが、現実には数ヶ月のデバッグと回避策が必要です。

HtmlRenderer.PdfSharp - 2005年へようこそ

HtmlRenderer.PdfSharpは非常に古いCSSのみをサポートしています。 ブッシュは大統領でした。 フレックスボックス、グリッドレイアウト、border-radiusのような最新のCSS機能はサポートしていません。 これらを使用しようとすると失敗します。

コンテンツをレイアウトするには、1999年にウェブページがどのように構築されていたかに似た、旧式のテーブルベースのレイアウトに頼らなければなりません。Bootstrapのような最新のHTMLフレームワークやライブラリは使えませんし、JavaScriptは完全にサポートされていません。

現代的なHTMLをレンダリングしようとすると、ライブラリがクラッシュしたり、正しくない結果が出たりする可能性があり、現代のWeb-PDF変換のニーズには適しません。

PDFsharp- 誰もが混乱するライブラリ</a

PdfSharpは、プログラムでPDFを作成するための強固なライブラリです。 ただし、HTMLをPDFに変換することはありません。 HTMLからPDFへの機能が必要な場合は、HtmlRenderer.PdfSharpのような追加ライブラリを使用する必要があります。問題は、HtmlRenderer.PdfSharpは2019年以降更新されていないため、古くなっているか信頼できない可能性があることです。

PdfSharpでは、主に図形、テキスト、グラフィックを手動で描画します。 例えば、新しいPDFドキュメントを作成し、ページを追加し、その上に文字列や図形を描くことはできますが、これはHTMLコンテンツをPDFにレンダリングすることとは大きく異なります。

HTMLDOC - ドットコム時代から

HTMLDOCはGPLライセンスであるため、ライセンス的には"バイラル"です。 ライブラリの最後の有意義な更新は2001年であるため、現代の標準に追いついていません。 CSSを適切に扱えず、コマンドライン経由でしか動作しない。ドキュメントにはNetscapeの記述があります。

PDFを生成するには、htmldoc --webpage -f output.pdf input.htmlのようなコマンドを実行します。 言い換えれば、今日のHTMLDOCの使用は、1990年代後半に逆戻りしたようなものです。

これらの "無料 "ライブラリは、小規模なプロジェクトでhtmlをpdfに変換する際には魅力的に見えるかもしれませんが、扱う際にはしばしば失敗します:

  • 完全なウェブコンテンツ:動的なHTMLページ、モダンなCSS、JavaScriptスニペット。
  • PDFコンプライアンス: PDF/A、PDF/UA、アクセシビリティのサポートはありません。
  • ファイルパーミッションとフォームフィールド: 制限されているか、存在しません。
  • クロスプラットフォーム展開:Windowsでしか動作しないものや、Internet Explorerのエンジンに依存しているものもあります。

これらのツールでウェブページ全体をレンダリングしようとすると、HTMLコンテンツが部分的になったり、レイアウトが崩れたり、検索可能で構造化されたドキュメントではなく、本質的にスクリーンショットのようなPDFになったりすることがよくあります。 開発者は、"無料"には、デバッグに何時間も費やしたり、手作業で回避策を講じたり、出力に一貫性がなかったりという隠れた代償が伴うことにすぐに気づきます。

IronPDFはこれらの問題を解決するために特別に開発され、HTMLファイル、文字列、ダイナミックなウェブコンテンツからPDFドキュメントを生成する堅牢なメソッドを提供し、適切なCSSサポート、改ページ処理、.NETアプリケーションへのシームレスな統合を行います。

Bootstrapおよび最新のCSSフレームワークの互換性

HTML-to-PDFライブラリを選択する際に重要なのは、Bootstrapや最新のCSSフレームワークをサポートしているかどうかです。 多くのウェブアプリケーションは、レスポンシブデザインのBootstrapに依存しており、これらのインターフェイスを変更せずにPDFに変換する能力は、ウェブアプリケーションの外観に合ったレポート、請求書、ドキュメントを作成するために不可欠です。

IronPDF: モダンなフレームワークの完全サポート

  • Bootstrap 5:完全なフレックスボックスレイアウトシステム、CSSグリッド、ユーティリティクラス、すべてのコンポーネントライブラリ
  • Bootstrap 4:完全なカードシステム、ナビゲーション、フレックスユーティリティ、レスポンシブブレークポイント
  • Tailwind CSS:すべてのユーティリティファーストのクラスは正確にレンダリングされます。
  • 基礎:完全なグリッドシステムとコンポーネントのサポート
  • 最新のCSS3:Flexbox、CSS Grid、カスタムプロパティ、アニメーション、トランジション、トランスフォーム、フィルター

実世界での検証IronPdfはBootstrapホームページとすべての公式サンプルをピクセルパーフェクトに忠実にレンダリングすることに成功しています。

コード例:機能比較ショーケース

using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4 fw-bold mb-3'>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4 class='card-title'>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙️</div>
                        <h4 class='card-title'>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4 class='card-title'>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4 class='mb-0'>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5 class='mb-0'>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5 class='mb-0'>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5 class='alert-heading'>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4 fw-bold mb-3'>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4 class='card-title'>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙️</div>
                        <h4 class='card-title'>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4 class='card-title'>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4 class='mb-0'>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5 class='mb-0'>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5 class='mb-0'>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5 class='alert-heading'>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

アウトプット:Bootstrap 5のカードコンポーネント、レスポンシブグリッドシステム、バッジユーティリティ、カラーユーティリティ、ストライピング付きテーブルコンポーネント、アラートコンポーネントを含む包括的な機能比較PDF。

ほとんどの C# HTML-to-PDF ライブラリ:Bootstrap のサポートは限られているか、またはサポートされていません。

C#のHTML-to-PDFライブラリの大半は、Bootstrapの制限が大きいカテゴリに分類されます:

WebKitベースのライブラリ(WkHtmlToPdf、NReco、DinkToPdf、HiQPdf):

  • フレックスボックスをサポートしていません(Bootstrap 4/5はフレックスボックスに大きく依存しています)。
  • CSSグリッドなし
  • Bootstrap 3最大(テーブルベースのレイアウトのみ)
  • 最終更新日:2016年-セキュリティ上の脆弱性があり、最新のCSS機能はありません。

カスタムエンジンライブラリ(EvoPdf、Aspose、Spire、SelectPdf、iText7):

  • 約90%のCSS3をサポートしていますが、重要な部分でギャップがあります。
  • フレックスボックスの部分実装
  • 限定的なCSSグリッド
  • 各Bootstrapコンポーネントの広範なテストが必要です。

HTMLサポートなし(PDFSharpCore、XFINIUM.PDF、アドオンなしのGemBox):

  • ネイティブHTMLレンダリングエンジンなし
  • マニュアルPDFの作成が必要
  • Bootstrap 該当なし

開発への影響:Chromium以外のエンジンを使用しているチームは、簡略化された"PDF-safe"レイアウトを作成するか、並列のCSSファイルを維持しなければならず、開発時間が大幅に増加し、WebアプリケーションとPDF出力間のデザインの一貫性が低下します。

包括的な Bootstrap フレームワークのガイダンスと CSS3 レンダリングの詳細については、Bootstrap & Flexbox CSS Guide を参照してください。

実験的プロジェクトと放棄されたプロジェクト

C#のHTMLからPDFへのライブラリの中には、当初は期待されたものの、すぐに技術的に行き詰まったり、過度に複雑なインフラストラクチャを必要としたりするものもあります。 これらのツールは"現代的"に見えるかもしれませんが、実際には、HTMLコンテンツや完全なWebページからPDFドキュメントを生成しようとする開発者に隠れた複雑さをもたらします。

ゴテンバーグ - マイクロサービスの悪夢

Gotenbergは、キャッチフレーズで使いやすさをアピールしています:"Dockerコンテナを実行するだけ!"しかし実際には、本番環境で使用するにはもっと多くのことが必要になることが多い:Docker、Kubernetes、サービス・ディスカバリー、ロード・バランシング、ネットワーク・ポリシーなどだ。

最初は単純なC#のHTMLからPDFへの変換作業だったものが、すぐに分散システムの問題に発展することがあります。 Gotenbergが稼働していること、ネットワークが正常に機能していること、Dockerコンテナが安定していることを確認する必要があります。 操作の複雑さが加わるため、単純なPDF変換になるはずの翻訳には、大きな負荷がかかります。

WebView2コントロール - Windows専用の罠

MicrosoftのWebView2コントロールは魅力的に聞こえますが、Windowsでしか動作しない、Edge WebView2ランタイムが必要、デスクトップ環境のないサーバーでは機能しない、セキュリティサンドボックスの問題があるなど、大きな制限があります。

WebView2をラップするWestwind.WebView.HtmlToPdfのようなライブラリは、追加の依存関係とともに同じ制限を継承します。

Chromeヘッドレス - プロセス.スタートホラー

一部の開発者は、Process.Start("chrome", "--headless --print-to-pdf")を使ってChromeをヘッドレスモードで実行し、実際にPDFを生成しようとしています。

このアプローチには、いくつかの重大な問題があります:

  • コマンドインジェクションの脆弱性
  • Chromeの自動アップデートは、予期せずすべてを破壊する可能性があります。
  • 組み込みのエラー処理なし
  • システム上に散在する一時ファイル
  • Chromeがサーバーにインストールされている必要があります。

全体として、ChromeのヘッドレスPDF生成のために直接Process.Startに依存することは、本番環境にとって危険で壊れやすいと考えられています。

Selenium WebDriver - PDFジェネレータではなくテストツール

Seleniumはテスト用に設計されており、PDFを生成するためのものではありません。 PDF生成に使うのは、ブルドーザーで卵を割るようなものです。

ChromeDriverやdriver.Navigate().GoToUrl("data:text/html," + html)のようなものを使って、ブラウザのインスタンスをHTMLコンテンツにナビゲートすることはできますが、SeleniumはPDFを直接生成することはできません。 PDF出力に似たことをするには、Chrome DevTools Protocolを使用する必要がありますが、これは複雑さを増し、しばしばメモリリークを引き起こします。

Selenium.WebDriver.ChromeDriverパッケージはSelenium用のChromeドライバを提供するだけで、PDF生成ソリューションではありません。

これらの実験的なプロジェクトは、見捨てられた、あるいは実験的なツールを使ってhtmlからpdfへの変換を試みることが、なぜ多くの場合、価値があるよりも面倒なのかを示しています:

  • Gotenberg:単純なpdf変換タスクであるはずのものに、Dockerとオーケストレーションが必要です。 ウェブページ全体やhtmlファイルの管理は、分散システムの問題になります。
  • WebView2:Windows専用で、デスクトップ環境に依存し、サーバーサイドのpdf生成には適していません。
  • Chrome Headless via Process.Start:セキュリティリスク、一時ファイル、プラットフォーム依存性を紹介します。
  • Selenium WebDriver:ブラウザの自動化のために設計されており、PDFドキュメントの作成はできません。 開発者は、テストツールをpdfコンバータとして扱おうとして時間を無駄にすることがよくあります。

これらのライブラリを使ってHTML要素のレンダリング、PDFドキュメントの操作、PDFファイルの生成を試みると、しばしばデプロイに失敗したり、レイアウトが崩れたり、検索不能なPDFが生成されたりします。 IronPdfはこのような頭痛の種を解消するために設計され、HTMLをPDFに変換し、ダイナミックコンテンツを扱い、すべてのプラットフォームで完全なCSSサポートを提供する堅牢な方法を提供します。

"新興"C# PDF ライブラリ (ネタバレ: 彼らは準備ができていない)

2025年になっても、新しいC# PDFライブラリが次々と登場しています。そのほとんどは世界を約束するものだが、現実は異なる。 これらの "新興 "ソリューションは、GitHub上ではエキサイティングに見えますが、本番環境では使用できないことがよくあります。

PeachPDF - ベーパーウェア

PeachPDFは"コミュニティ用に開発中"と説明されていますが、実際にはまだ存在していません。 GitHubのリポジトリをチェックすると、最後のコミットは8ヶ月前で、3つしかありません。 PDFライブラリのエコシステムにはすでに多くの確立された選択肢があり、このような中途半端なプロジェクトはほとんど必要ありません。

Playwright - マイクロソフトのブラウザー自動化

Playwrightは、基本的にMicrosoft版のPuppeteerです。 これは、同じ課題の多くを共有しています。 例えば、ブラウザのバイナリを必要とするため、オーバーヘッドが大きくなります。 HTMLからPDFへの変換が主な焦点ではありません。

Playwrightを使用すると、通常、300MB以上のChromiumブラウザのバイナリを管理する必要があり、プロジェクトがさらに複雑になります。

Syncfusion PDF Library - スイート・タックス。

SyncfusionのHTML-to-PDF機能が必要な場合は、事実上、同社の全製品を購入する必要があります。 最低コストは、開発者1名につき995ドルです。 Linuxでは、1つの機能を得るために147MBの追加ファイルが追加されます。 つまり、1つの機能しか欲しくなかったとしても、結局は70の機能へのアクセスを購入することになるのです。

Aspose.PDF - 誰でも使えるエンタープライズ価格。

Aspose.PDFは1,199ドルから始まり、最高11,997ドルまで可能です。小規模なチームや個人の開発者にとって、この価格設定は法外かもしれません。ドキュメントは充実していますが、高度な専門知識を前提としているため、新規参入者がすぐに使い始めるのは困難です。

単純な作業であっても、複雑なAPIを操作しなければならないことがあります。 例えば、新しいドキュメントを作成したり、ページを追加したりするには、複数のステップが必要で、より簡単なライブラリに比べて不必要に複雑に感じることがあります。

これらの新しいソリューションは、しばしば簡単な"HTMLからPDFへのC#コンバータ"として販売されていますが、実際には複雑なセットアップや手作業、高価なスイートの購入が必要です。 クロスプラットフォーム互換性、堅牢なPDF生成、または完全なCSSサポートを約束しますが、実際の.NETアプリケーションでテストすると、ギャップが見られます:

  • ブラウザのバイナリは手動でダウンロードし、管理する必要があります。
  • 動的なコンテンツや最新のHTML要素では、PDF生成に失敗します。
  • CSSとJavaScriptのレンダリングは不完全なことがよくあります。
  • ドキュメントは最小限または古いものです。

これらのライブラリを採用しようとする開発者は、トラブルシューティングに何日も費やし、堅牢なメソッドコールを提供し、ウェブページ全体のレンダリングを確実に処理するIronPDFのような確立されたソリューションに戻ることがよくあります。

より良い選択肢をお探しですか? Aspose.PDFとの比較開発者がIronPDFに乗り換える理由をご覧ください。

なぜ私たちはIronPDFを違った形で構築したのか

C#のHTMLからPDFへの変換で起こりうるあらゆる失敗を経験した後、私たちは2025年の開発者にとって重要な原則に基づいてIronPDFを設計しました。私たちのゴールはシンプルです。プラットフォームの癖、ライセンスの罠、サポートされていない機能などを気にすることなく、htmlコンテンツから信頼性の高いPDF変換を行うことです。

1.It Just Works™

IronPdfはPDFを生成するための簡単で信頼できる方法を提供します。 外部のバイナリをコピーしたり、Chromeをインストールしたりする必要はなく、プラットフォーム固有のコードを気にする必要もありません。

IronPdfを使うと、ChromePdfRendererを作成し、HTMLを渡すだけでPDFが返ってきます。 複雑な設定や依存関係なしに、期待通りに実際に動作します。

using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdfを使えば、HTMLからPDFへの変換は数行で完了します。 HTMLファイル、HTML文字列、または動的にレンダリングされたWebページから、相対URLやファイルパーミッション、CSSサポートの欠落を気にすることなくPDFファイルを生成できます。 HTMLスニペットまたは画像付きHTMLコード全体のWebページをレンダリングする際、すべてが確実に動作します。

もっと例が必要ですか? HTMLからPDFへの変換チュートリアルを確認するか、実際のコードサンプルをご覧ください。

2. 他の追随を許さない法的コンプライアンス

IronPDFは次のことを完全にサポートする唯一のライブラリです。

  • Section 508(米国のアクセシビリティ基準)
  • PDF/A(アーカイブのためのISO 19005)
  • PDF/UA(アクセシビリティのためのISO 14289)

PDFアソシエーションのメンバーとして、私たちは単に基準を満たすだけではなく、それ以上を達成します。 これは、政府機関が私たちを信頼する理由です。

public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

これは、HTMLページから作成されたPDFドキュメントが、フォームフィールド、ファイル権限、及びアクセシビリティの厳しい基準を満たすことを意味します。これは、しばしばPDFコンバーターライブラリやHTMLレンダリングツールが失敗する部分です。

他のライブラリに苦労していますか? 直接的な比較をご覧ください:

  1. これはマーケティングのフラフではありません。 PuppeteerとPlaywrightは、PDF/AまたはPDF/UAに準拠したドキュメントを実際には生成できません。 24. 彼らはChromeの印刷からPDFへの機能を使用しており、これらの機能が欠けています。 ホワイトハウスがアクセス可能なPDFを必要とする時、彼らは無料のライブラリを使用せず、その代わりにIronPDFを使用します。

3. 近代的な開発のために構築

私たちのハイレベルAPIは、開発者が動的なコンテンツから僅か数行でPDFドキュメントを生成できるようにします。

public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

開発者は、HTMLをPDF形式に簡単に変換して、CSSサポート、ページ内/外の改ページ、印刷用CSSオプションを使ってWebページをレンダリングできます。 APIは相対URL、画像ファイル、及びHTML要素を処理し、PDFページサイズ、カスタムヘッダー、ファイル権限に完全なコントロールを提供します。

4. 本物のOCR統合

IronPDFは、OCR機能を備えたPDFドキュメントの操作をサポートします。

public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

他のPDFコンバーターツールとは異なり、IronPDFはスキャンされた画像ファイルやHTMLコンテンツからPDFドキュメントを生成し、構造化されたデータを自動的に抽出することを可能にし、複雑な.NETアプリケーションでのPDF生成を簡素化します。

詳細はこちら:PDFをマージする。|デジタル署名。|PDFからテキストを抽出する

5. 実際に動作するデプロイメント

IronPDFの展開環境

  • .NET Core 2.0以上 プラットフォーム依存、バイナリインストール、またはサーバー構成を気にせずに、HTMLコンテンツからPDFドキュメントを生成できます。

  • Windows Server
  • Linuxディストリビューション(Ubuntu、Debian、Alpine)
  • macOS
  • Dockerコンテナ
  • Azure Functions
  • AWS Lambda
  • Kubernetes

複数の.NETターゲットもサポートしています。

この互換性により、IronPDF はさまざまな .NET 環境で PDF を生成するための多用途のソリューションになります。

    • .NET Core 2.0以降
    • .NET 5, 6, 7, 8, 9, 10

このライブラリを使用するのは簡単です。 レンダラーを作成し、HTMLコンテンツでRenderHtmlAsPdfAsyncを呼び出してPDFを取得するだけです。 要するに: どこでも確実に動作します。

デプロイメントガイドを参照してください:Dockerのデプロイを参照してください。|Azure 関数。|AWS Lambda.|Linuxのインストール

我々が組み込んだ技術的利点

1. 本当のChromiumレンダリング

Chromiumレンダリング vs. IE/WebKit PDF生成

IronPDFは、2016年のWebKitやInternet Explorerではなく、最新のChromiumを内部で使用しており、完全なCSS3、JavaScript、HTML要素のサポートを確保しています。

public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この堅牢な手法は、改ページ内/後ルールに従ってPDFファイルの適切なページブレイクを維持し、画像ファイルは正しく埋め込まれ、指定されたURLからHTMLストリングまたはHTMLファイルが確実に変換されることを保証します。 開発者は、たった数行のコードでHTMLをPDF文書に簡単に変換できます。

2. 毎月の更新

IronPDFは毎月更新を送り出し、PDF生成ツールを進化するWeb標準に同期させます。

  • 2025年10月: .NET 10サポートを初日に
  • 2025年9月: AI統合APIの強化
  • 2025年8月: HTMLからPDFへのレンダリングが30%速く
  • 2025年7月: Apple Siliconネイティブサポート

競合他社と比較してください:

  • DinkToPdf: 最終更新日 2020年6月
  • HtmlRenderer: 最終更新日 2019年
  • TuesPechkin: 最終更新日 2015年

3. 実際のサポート

IronPDFはあなたを取り残しません。 support@ironsoftware.comにメールすると、実際の開発者が対応します。 フォーラムやチャットボットは使わずに、HTMLからPDFプロセス、PDFコンバーターAPI、PDFファイルのファイル権限を知る誰かが対応します。

AI革命

これは他のPDFライブラリが考慮しなかったものです: 完全なAI統合。 IronPDFはAIコーディングアシスタントと完璧に連携するように設計されており、開発者が即座にPDFファイルに変換可能なHTMLドキュメントを生成できるようにします。 27. これは特にウェブページ、HTMLスニペット、または動的HTMLコンテンツのHTMLからPDFへの変換に便利で、CSSサポート、相対URL、およびページブレーク設定を保持します。

public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このアプローチにより、開発者はAIが生成したHTMLコンテンツからフォームフィールドや画像、カスタムヘッダーを含むPDFドキュメントをたった数行のコードで生成できます。 28. IronPDFはHTMLからPDFへの変換、OCR、およびAI抽出をシームレスに処理し、あらゆる.NETアプリケーションに準備された完全に操作可能でアクセス可能なプロフェッショナルなPDFファイルを生成します。

なぜ開発者がIronPDFを選ぶのか

IronPDFを使用すると、開始は非常に早く簡単です:パッケージをインストールし、わずか3行のコードを書くだけでPDFを生成します。これらはすべて約5分で行えます。

対照的に、他のHTMLからPDFへのソリューションでは、パッケージのインストール、必要なバイナリのダウンロード、ファイルパスの設定、プラットフォームの違いの処理、クラッシュのデバッグ、その他の複雑な作業を行うという、はるかに長いセットアッププロセスが必要になることが多いです。 多くの開発者にとって、これには最大2週間かかる可能性があり、これによりIronPDFの簡便さと信頼性を求めて切り替えることが多いです。

開発者はIronPDFを評価しています。なぜならPDF生成を迅速で信頼性があり、また容易にしているからです。 APIはシンプルで、HTMLファイルまたはHTMLコンテンツからPDFを生成するのに、たった数行のコードが必要です。 エンドユーザーは、適切なフォームフィールド、画像、およびフルWebページの一貫したレンダリングを提供するアクセス可能で構造化されたPDFを受け取ることができます。 IronPDFは、プラットフォーム特有の問題、複雑な設定、または壊れたサードパーティツールに対処する煩わしさを取り除きます。

自分で試してみてください

それについて読むのを止めて— IronPDFでPDF生成のシンプルさを体験してください:

// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDFを使用すれば、あらゆるHTMLコンテンツまたは動的に生成されたWebコンテンツを数行でプロフェッショナルなPDFドキュメントに変換できます。 このライブラリは、HTMLからPDFへの変換、ページサイズ変更、CSSサポート、相対URL、画像などを処理します—複雑なセットアップなしに。

  1. 請求書、レポート、または完全なウェブページをPDF文書として作成する場合でも、IronPDFはVisual Studioおよび.NETアプリケーションにシームレスに統合されます。 HTML要素の信頼できるレンダリング、適切なドキュメント構造、ファイル権限およびフォームフィールドの完全なコントロールを保ちつつ、コードをシンプルでメンテナンス可能に保ちます。

助けが必要ですか?IronPDFのサポートチームは、平均23秒以内に応答し、実際のエンジニアが24/7体制で利用可能です。チャットボットやスクリプトはなく、ライブラリを知っている専門家だけが対応します。

開始リソース:

結論

私たちは他のライブラリでフラストレーションを感じている開発者のためにIronPDFを構築しました:古いコード、"無料"ソリューションがもたらすデバッグの数週間、プラットフォーム特有の問題、そしてサポートへの未回答の質問。

8年後、NuGetでの1000万ダウンロードを超えて、IronPDFは唯一のHTMLからPDFへのライブラリとして:

  • 毎月の改良と.NETサポートで更新
  • Windows、Linux、macOS、Dockerで一貫して動作
  • フォーラムやチャットボットではなく、実際の開発者サポートを提供
  • 近代的なAIコーディングツールとシームレスに統合
  • OCRおよびPDF操作機能を含む
  • Section 508、PDF/A、およびPDF/UAのコンプライアンス基準を満たす
  1. 見てください、私たちは理解しています - 誰もPDFライブラリにお金を払いたくありません。 しかし、これが現実です:どちらにしても支払うことになります。 一度$799をIronPDFに支払うか、デバッグで数週間を費やして、結局IronPDFを購入します。

私たちはIronPDFをもう1つの選択肢としてではなく、解決策として構築しました。 We built it to be the solution. 10百万回のダウンロードとNASA、テスラ、ホワイトハウスのようなクライアントがいる理由があります - 開発者は"無料"のオプションを試し、数週間無駄にしてから私たちのところに来ます。 PDF生成の戦いを終わらせる準備はできましたか?

IronPDF:適切なソリューションを最初に。未来の自分(そしてユーザー)はあなたに感謝するでしょう。

よくある質問

IronPDFが他のC#のHTMLからPDFライブラリと比べて際立っているのはなぜですか?

IronPDFは、他のソリューションに比べてセットアップが簡単で、複数のパッケージのインストール、追加のバイナリのダウンロード、ファイルパスの設定を減少させます。このシンプルさは、プラットフォームの違いを回避し、デバッグを最小限に抑えます。

HTMLからPDFへのライブラリにおいてセットアップの容易さが重要なのはなぜですか?

セットアップの簡単さは、開発者の時間を節約し、統合の複雑さを軽減します。IronPDFはこのプロセスを大幅に簡素化します。

IronPDFはプラットフォームの違いをどのように処理しますか?

IronPDFはプラットフォームの違いをシームレスに管理し、開発者が異なるオペレーティングシステム間で互換性の問題を手動で設定またはデバッグする必要を排除します。

他のHTMLからPDFへのソリューションで直面する一般的な課題は何ですか?

他のソリューションは、多くの場合、追加のパッケージのインストール、ファイルパスの設定、およびプラットフォーム固有の問題の処理を含む長いセットアップを必要とし、デバッグと保守に費やす時間が増加する可能性があります。

IronPDFはデバッグプロセスをどのように改善しますか?

IronPDFはセットアップと実行中のクラッシュや複雑さの可能性を減少させ、他のHTMLからPDFライブラリに比べてデバッグセッションの回数を減少させます。

IronPDFは大規模アプリケーションに適していますか?

はい、IronPDFは効率的に大規模アプリケーションを処理するように設計されており、エンタープライズレベルのプロジェクトに不可欠な堅牢なパフォーマンスと信頼性のある変換プロセスを提供します。

IronPDFを使用した場合、開発者はどのような利点を得られますか?

開発者は、IronPDFの迅速な統合、セットアップの複雑さの軽減、および信頼性のあるHTMLからPDFへの変換機能から利益を得ることができ、ソフトウェア開発の時間とリソースを節約します。

IronPDFは複雑なHTML構造を処理できますか?

IronPDFは、スタイル、レイアウト、対話型要素を高忠実度で維持しながら、複雑なHTML構造をPDF形式に正確に変換することができます。

IronPDFはクロスプラットフォーム互換性をどう確保しますか?

IronPDFはクロスプラットフォーム対応に設計されており、開発者が追加の設定を行わなくても様々なオペレーティングシステムで一貫して動作することを保証します。

IronPDFがHTMLからPDFへの変換に信頼できる選択肢である理由は何ですか?

IronPDFの信頼性は、その使いやすさ、堅牢な性能、および高品質や速度を損なうことなく複雑なHTMLドキュメントを処理する能力に由来します。

カーティス・チャウ
テクニカルライター

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

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。