NET MAUIでXAMLをPDFに変換する方法 | IronPDF
Spire.PDFからIronPDFへの移行は、PDF生成をレガシーHTML経路から移動し、しばしばイメージベースのテキストを生成し、Chromiumパイプラインに移行して、選択可能で検索可能な真のテキストを生成します。 このガイドは、Spire.PDFのHTMLレンダリングのトレードオフと報告されたフォント埋め込みの問題を網羅した完全なステップバイステップの移行パスを提供します。
なぜSpire.PDFからIronPDFへ移行するのか
スパイアを理解する.PDF
Spire.PDFは、.NET開発者がPDFドキュメントを効率的に扱えるように設計された、堅牢な商用PDFライブラリです。 Spire.PDFは、特にレガシーアプリケーションにおいて、その特異な機能によりプログラミングコミュニティでその名を知られており、その統合機能はE-iceblueツールセットの他のコンポーネントとシームレスに連携しています。
しかし、Spire.PDFには、特にHTMLからPDFへの変換や最新のWeb標準のサポートなど、実際の使用に影響するいくつかの根本的な問題があります。
重要な技術的問題
| 問題 | インパクト | IronPDF ソリューション |
|---|---|---|
| レガシーHTML経路でしばしばイメージとしてレンダリングされるテキスト | PDFが検索できない、アクセスできない、テキストがコピーできない。 | リアルテキストレンダリング |
| レガシー経路でのIE/Edge LegacyまたはQtWebKit依存 | 古いレンダリング、最新のCSSの問題 | 最新のChromiumをバンドル |
| フォント埋め込みの問題が報告されています | ドキュメントが他のシステムで間違って見える | 信頼性の高いフォント処理 |
| 大きなデプロイメントフットプリント。 | メモリ使用量が高い | Chromiumランタイムをバンドル |
| レガシー経路でのCSSの制限 | 最新のレイアウトが正しく表示されない | CSS3をフルサポート |
核となる問題:画像ベースのPDF
Spire.PDFのレガシーHTML経路の報告された欠点の一つは、HTMLドキュメント内のテキストをイメージとしてレンダリングしがちなことです。 これにより、検索やテキストの操作が必要なアプリケーションにとって制限されるPDFが生成されます。
Spire.PDFのLoadFromHTML()メソッドをレガシーエンジンで使用する場合、テキストを実際のテキストではなくビットマップ画像としてレンダリングすることが多く、これらの問題を引き起こします。
- テキストは選択できません
- テキストは検索できません
- テキストはコピーできません
- スクリーンリーダーでは読めません(アクセシビリティ違反)。
- ファイルサイズは非常に大きくなります。
- ズームするとピクセル化する
Spire.PDFとIronPDFの比較
| フィーチャー | Spire.PDF | IronPDF |
|---|---|---|
| HTMLからPDFへのレンダリング。 | デフォルトでレガシーIE/QtWebKit; バージョン10.7.21以降のシステムChromeを必要とするオプトインChromeHtmlConverter |
Chromiumをバンドル(最新、追加インストール不要) |
| テキスト出力(HTML経路) | レガシー経路でしばしばイメージとしてレンダリング | 実際のテキスト(選択可能で検索可能) |
| フォントの扱い | レガシー経路で報告された問題 | 信頼性の高いフォント処理 |
| CSS3のサポート。 | レガシー経路で制限 | フル |
| フレックスボックス/グリッド | レガシー経路でサポートされない | サポート対象 |
| JavaScript(JavaScript | レガシー経路で制限 | 完全なES6 |
| PDFアクセシビリティ | レガシー経路で悪い(イメージベースの出力) | タグ付きテキスト出力 |
| APIデザイン。 | 多くのオーバーロード、手動ページ設定 | 単一のフルエントレンダラー |
| ライセンスについて | フリーミアム/商用 | 商用 |
最新 for .NET上で、IronPDFはSpire.PDFのHTMLからPDFへのトレードオフに対処し、テキストをイメージではなく実際の選択可能なテキストとしてレンダリングするので、生成されたPDFは検索可能でアクセス可能です。
始める前に
前提条件
- .NET環境: .NET Framework 4.6.2+ または.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGetアクセス: NuGetパッケージをインストールする機能
- IronPDFライセンス: IronPDFからライセンスキーを取得します。
NuGetパッケージの変更
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
ライセンス構成
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完全な API リファレンス
名前空間の変更
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
Imports IronPdf
Imports IronPdf.Editing
コア API マッピング
| Spire.PDF | IronPDF |
|---|---|
new PdfDocument() |
new ChromePdfRenderer() |
pdf.LoadFromHTML() |
renderer.RenderHtmlAsPdf() |
pdf.LoadFromFile() |
PdfDocument.FromFile() |
pdf.SaveToFile() |
pdf.SaveAs() |
pdf.Close() |
不要 |
pdf.Pages.Add() |
renderer.RenderHtmlAsPdf() |
pdf.InsertPageRange() |
PdfDocument.Merge() |
page.Canvas.DrawString() |
TextStamper + ApplyStamp() |
PdfFont |
HTMLのCSSスタイリング |
PdfBrush |
HTMLのCSSスタイリング |
コード移行の例
例1: HTMLからPDFへの変換
翻訳前 (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim htmlLayoutFormat As New PdfHtmlLayoutFormat()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
pdf.LoadFromHTML(htmlString, False, True, True)
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
翻訳後(IronPDF):。
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
pdf.SaveAs("output.pdf")
End Sub
End Class
この例は、HTMLレンダリングの基本的な違いを示しています。 Spire.PDFは、テキストをビットマップ画像としてレンダリングすることがよくあるPdfHtmlLayoutFormatオブジェクトを使用しています。 その結果、ユーザーがテキストを選択、コピー、検索できないPDFが出来上がりました。
IronPDFは、RenderHtmlAsPdf()で、完全に選択可能で、検索可能かつアクセスしやすい本来のテキストを生成します。 IronPDFでは自動クリーンアップのためにディスポーズパターンを使用しており、Close()呼び出しは不要です。包括的な例についてはHTML to PDFドキュメントをご覧ください。
例2: 複数のPDFをマージする
翻訳前 (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
Imports Spire.Pdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 As New PdfDocument()
pdf1.LoadFromFile("document1.pdf")
Dim pdf2 As New PdfDocument()
pdf2.LoadFromFile("document2.pdf")
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1)
pdf1.SaveToFile("merged.pdf")
pdf1.Close()
pdf2.Close()
End Sub
End Class
翻訳後(IronPDF):。
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Spire.PDFでは、new PdfDocument() + Close()を呼び出す必要があります。
IronPDFはよりシンプルなPdfDocument.Merge()メソッドを使用します。 Close()呼び出しは不要です。 詳しくは、チュートリアルをご覧ください。
例3: PDFにテキストを追加する
翻訳前 (Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim page As PdfPageBase = pdf.Pages.Add()
Dim font As New PdfFont(PdfFontFamily.Helvetica, 20)
Dim brush As PdfBrush = New PdfSolidBrush(Color.Black)
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, New PointF(50, 50))
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
翻訳後(IronPDF):。
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper = New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalOffset = 50,
.HorizontalOffset = 50
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
Spire.PDFは、特定の座標にテキストを配置するためにpage.Canvas.DrawString()を用いたキャンバスベースの描画モデルを使用しています。
IronPDFは、ApplyStamp()でそれを適用します。 このアプローチは、より宣言的で保守が容易です。
画像としてのテキスト問題
これが重要な理由
Spire.PDFが画像ベースのレンダリングを使用してHTMLをPDFに変換する場合、ドキュメントは本質的な機能を失います:
1. テキスト検索なし:ユーザーは Ctrl+F を使用してテキストを検索できません。 文書管理システムは、コンテンツにインデックスを付けることができません。
2. テキストの選択/コピー不可:引用、参照、またはデータをコピーしようとするユーザーは、テキストを選択できません (画像です)。
3. アクセシビリティ違反:画像ベースの PDF は、WCAG 2.1 準拠、Section 508 準拠 (米国政府)、ADA 要件、およびスクリーン リーダーの互換性を満たしていません。
4. 大きなファイルサイズ:古いHTML経路からのイメージベースの出力は、同じ内容に対してIronPDFが生成するテキストベースの出力よりも桁違いに大きなファイルを生成する可能性があります。
検出:あなたのPDFは画像ベースですか?
Spire.PDFで作成したドキュメントを開き、以下のテストをお試しください:
1.テキストの選択:テキストをクリックしてドラッグします。 何もハイライトがない場合 → IMAGE-BASED
- Ctrl+F 検索:ページ上の任意の単語を検索します。 該当するものがない"場合 → IMAGE-BASED 3.コピー/貼り付け:テキストを選択してメモ帳にコピーします。 何も貼り付けられない場合 → IMAGE-BASED
レガシーHTMLエンジンの問題
Spire.PDFのレンダリングエンジン
Spire.PDFのLoadFromHTML(...)は歴史的に2つのパスを提供していました。Windows Internet Explorer / Edge Legacy WebBrowserコントロールによってバックアップされた非プラグインパスと、別途ダウンロードされたQT/WebKitプラグインパスです。 Spire.PDF 10.7.21(2024年中頃)では、ChromeHtmlConverterという第三のオプションが追加され、ローカルにインストールされたGoogle Chromeを利用します。ただし、これはオプトインであり、元のLoadFromHTML APIはレガシーエンジンがデフォルトです。 IE/Edge Legacyは2022年にMicrosoftによって非推奨となり、レガシー経路上の最新CSSは信頼できず、JavaScriptサポートは部分的であり、レンダリングはシステム間で異なる場合があります。
スパイアで失敗するモダン CSS.PDF
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
IronPDFは最新のChromiumレンダリングを使用しているため、これらのCSS機能はすべて正しく動作します。
移行後の新機能
IronPDFに移行した後は、Spire.PDFでは提供できない機能を得ることができます:
選択可能で、検索可能なテキスト
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>")
pdf.SaveAs("contract.pdf")
' Result:
' ✅ Text is fully selectable
' ✅ Text is searchable with Ctrl+F
' ✅ Text can be copied to clipboard
' ✅ Screen readers work perfectly
' ✅ File size is compact
' ✅ Zooming is crystal clear
最新の CSS サポート
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
Dim renderer = New ChromePdfRenderer()
Dim html = "
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' All modern CSS features render correctly!
HTMLベースの透かし
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.ApplyWatermark("
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>")
移行チェックリスト
移行前
- コードベース内のすべての Spire.PDF の使用状況を一覧表示する
- 既存のPDFのテキスト選択可能性をテストする(重大な問題の検出)
- ドキュメント
LoadFromHTML()呼び出し(これが優先的に修正されるべきです) - IronPDFからIronPDFライセンスキーを取得します
コードの更新
Spire.PDFNuGetパッケージを削除(無料版を使用している場合はFreeSpire.PDFも合わせて)IronPdfNuGetパッケージをインストール- 名前空間のインポートを更新します(
using Spire.Pdf;→using IronPdf;) RenderHtmlAsPdf()に置き換える(重要な修正)new PdfDocument()+PdfDocument.FromFile()に置き換えるPdfDocument.Merge()に置き換えるTextStamper+ApplyStamp()に置き換えるSaveAs()に置き換えるClose()呼び出しをすべて削除(IronPDFでは不要)- アプリケーションの起動時にライセンスの初期化を追加
テスティング
- 生成されたPDFでテキストが選択可能であることを確認する(CRITICAL TEST)
- CSS レンダリングの改善を検証 (Flexbox/Grid が動作するようになりました)
- ファイルサイズが小さいことを確認する
- スクリーンリーダーでアクセシビリティをテストする
- パフォーマンス比較

