C#でPDFを作成・編集・変換する方法|無料ライブラリ比較と実装サンプル付き

はじめに

C#でPDFを扱う方法を調べると、PDF作成、既存PDFの編集、HTMLからPDFへの変換、Word・ExcelからPDFへの変換など、目的によって最適なライブラリが大きく変わることに気づきます。

「C# PDF」と一口に言っても、空のPDFを作ってテキストや画像を描画したいのか、請求書や帳票をきれいに出力したいのか、既存PDFにロゴや透かしを追加したいのか、HTML画面をそのままPDF化したいのかで選ぶべき手段は異なります。

本記事では、C#でPDFを作成・編集・変換する方法を、無料ライブラリと有料ライブラリの比較、NuGetでの導入方法、実装サンプル、よくあるエラー対策までまとめて解説します。

1. C#でPDF操作を始める前に知っておきたい基礎

1-1. C#でPDFを作成・編集・変換したいユーザーの主な目的

C#でPDFを扱いたい目的は、大きく次のように分かれます。

請求書、見積書、納品書、検査成績書、レポートなどを自動生成したい場合は、PDFを新規作成できるライブラリが必要です。既存の申込書や契約書PDFに文字、画像、印影、透かしを追加したい場合は、PDF編集機能が必要です。Web画面やHTMLテンプレートをPDF化したい場合は、HTML to PDFに強いライブラリを選ぶ必要があります。

また、WordやExcelで作成された帳票をPDFに変換したい場合、PDFライブラリ単体ではなく、Office文書変換に対応したコンポーネントや外部変換エンジンが必要になるケースもあります。

1-2. PDF作成・編集・変換でよくある業務シーン

業務アプリでよくあるC# PDFの実装シーンは、次のようなものです。

販売管理システムで請求書PDFを作成する、予約システムで申込書PDFを出力する、ECサイトで領収書PDFをダウンロードさせる、社内ワークフローで承認済みPDFに透かしを付ける、複数のPDFを1ファイルに結合する、スキャン画像をPDF化する、HTMLメールやWebページをPDFとして保存する、といった用途です。

特にASP.NET CoreのWebアプリでは、PDFをサーバー側で生成し、ブラウザからダウンロードさせる実装がよく使われます。

1-3. C#でPDFを扱う方法は大きく分けて3種類

C#でPDFを扱う方法は、大きく分けると3種類あります。

1つ目は、PDFsharpやQuestPDFのような.NET向けPDFライブラリを使う方法です。NuGetで追加でき、C#コードだけでPDFを生成できるため、もっとも一般的です。

2つ目は、HTMLをPDFに変換するライブラリを使う方法です。IronPDFのようにChromiumベースのレンダリングを利用するライブラリでは、HTML、CSS、画像を使ってデザインした画面をPDF化しやすい特徴があります。IronPDFはHTMLからPDFを生成・編集するC#向けライブラリとして提供されており、NuGet上でも作成、変換、編集、保護に対応する商用ライブラリとして説明されています。

3つ目は、Office文書や画像変換に対応したドキュメント処理ライブラリを使う方法です。Word・ExcelからPDFに変換する場合は、PDF生成ライブラリだけでは不十分なことが多く、Syncfusion、Spire.PDF、Asposeなどの文書変換系ライブラリが候補になります。

1-4. 無料ライブラリと有料ライブラリの違い

無料ライブラリは、初期費用を抑えてPDF作成を始めやすい点が魅力です。たとえばPDFsharpはMIT Licenseで公開されており、NuGet上でも.NETでPDFを作成・変更できるオープンソースライブラリとして説明されています。

一方、有料ライブラリは、HTML変換、既存PDF編集、電子署名、フォーム、暗号化、OCR、Word・Excel変換、商用サポートなどが充実していることが多いです。商用システムでは、機能だけでなく、ライセンス、サポート、脆弱性対応、長期運用時の保守性も重要になります。

2. C#で使えるPDFライブラリの選び方

2-1. PDF作成・編集・変換のどれに対応しているか

最初に確認すべきなのは、ライブラリが「作成」「編集」「変換」のどこまで対応しているかです。

PDFをゼロから作成するだけならPDFsharpやQuestPDFが候補になります。既存PDFを読み込んでページを結合・分割したい場合はPDFsharp、iText 7、Spire.PDF、IronPDFなどが候補になります。HTMLからPDFへ変換したい場合はIronPDFやiTextのpdfHTML、Spire.PDFなどを検討します。

QuestPDFはC#コードでPDF文書を設計するコードファーストのPDF生成ライブラリで、請求書やレポートのような帳票生成に向いていますが、既存PDFの直接編集やHTML to PDFを主目的とするライブラリではありません。公式サイトでも、C#コードで保守しやすいPDF文書を設計できることが特徴として説明されています。

2-2. 商用利用できる無料ライセンスか

無料と書かれていても、商用利用の条件は必ず確認する必要があります。PDFsharpはMIT Licenseのオープンソースとして公開されていますが、QuestPDFは個人、非営利、FOSSプロジェクト、年間売上100万ドル未満の組織では無料というライセンスモデルです。

iText 7は高機能ですが、iText CoreはAGPLまたは商用ライセンスで提供されており、iText CommunityはAGPLライセンスで利用する形になります。商用クローズドソース製品で使う場合は、AGPLの条件を満たせるか、商用ライセンスが必要かを確認するべきです。

2-3. .NET Framework/.NET 6以降への対応状況

古い業務システムでは.NET Framework、最近のWebアプリやAPIでは.NET 6、.NET 8、.NET 9以降が使われることが多いため、対象フレームワークへの対応も重要です。

PDFsharpのNuGetパッケージは.NET 8、.NET 9、.NET 10などの互換情報が掲載されており、Windowsに依存せずLinuxやmacOSでも利用できると説明されています。

IronPDFもNuGet上で.NET 6以降、.NET Framework 4.6.2以降、Windows、macOS、Linux、Docker、Azure、AWSなどへの対応を掲げています。

2-4. 日本語フォント・文字化けへの対応

C#でPDFを作るときに最もつまずきやすいのが日本語フォントです。英数字だけなら簡単に表示できても、日本語ではフォント埋め込み、Unicode対応、実行環境のフォント有無が問題になります。

PDFsharpのCoreビルドでは、全プラットフォームで共通のフォント解決方法がないため、本番環境ではカスタムフォントリゾルバーを使うことが推奨されています。公式ドキュメントでも、Coreビルドでは独自のフォントリゾルバーを用意する必要があること、開発用にWindowsフォントを使うオプションはあるものの本番ではカスタムフォントリゾルバーが推奨されることが説明されています。

日本語PDFを安定して作るなら、Noto Sans JP、BIZ UDPGothic、IPAexフォントなど、利用許諾を確認したフォントファイルをアプリケーションに同梱し、PDFに埋め込む設計にするのが安全です。

2-5. HTMLからPDF変換できるか

帳票をHTMLとCSSでデザインしたい場合は、HTML to PDF対応が重要です。PDFsharpやQuestPDFは、C#コードでPDFを組み立てる用途に向いていますが、HTMLをそのまま高精度にPDF化する用途ではIronPDFのようなHTMLレンダリング系ライブラリが向いています。

IronPDFは、HTMLからPDFを生成する用途を前面に出しており、NuGet上のサンプルでもChromePdfRendererを使ってHTML文字列をPDFに変換するコードが紹介されています。

2-6. 既存PDFの編集・結合・分割に対応しているか

既存PDFのページ結合や分割は、PDFsharpでも比較的簡単に実装できます。一方、PDF内の既存テキストを正確に編集する、フォーム入力欄を操作する、電子署名を扱う、権限を設定する、PDF/Aに対応する、といった高度な処理ではiText 7、IronPDF、Syncfusion PDF Library、Spire.PDFなどを検討する必要があります。

Spire.PDFのFree版は作成・編集・変換など幅広い機能を試せますが、無料版には10ページ制限や変換時のページ制限があるため、業務利用では制限を確認する必要があります。

2-7. 導入しやすさ・サンプルコードの多さ

初心者がC#でPDFを扱うなら、NuGetで導入しやすく、サンプルコードが多いライブラリを選ぶのがおすすめです。PDFsharpはAPIがシンプルで、空のPDF作成、テキスト描画、画像挿入、結合、分割を学びやすいです。

帳票をきれいに作りたい場合は、QuestPDFのFluent APIが読みやすく、レイアウトをコードとして管理しやすいです。QuestPDF公式のQuick Startでも、Document.Createからページ、余白、ヘッダー、本文、フッターを定義してPDFを生成するサンプルが掲載されています。

3. C#向けPDFライブラリ比較表

ライブラリ主な用途無料利用商用利用時の注意HTML to PDF既存PDF編集初心者向け
PDFsharpPDF作成、結合、分割、簡易編集可能MIT License表記確認不向き一部対応
QuestPDF請求書、帳票、レポート生成条件付き無料組織規模・売上条件を確認不向き不向き
iText 7高度なPDF作成・編集AGPLAGPLまたは商用ライセンス拡張機能で対応
IronPDFHTML to PDF、編集、変換試用商用ライセンス
Spire.PDF作成、編集、変換の試用Free版あり無料版はページ制限あり
Syncfusion PDF Library業務アプリ向けPDF処理Community License条件あり条件外は有料

3-1. PDFsharp:無料でPDF作成・結合を始めやすい

PDFsharpは、C#でPDFを新規作成したい初心者におすすめしやすいライブラリです。MIT Licenseのオープンソースで、座標を指定して文字、線、画像を描画するスタイルです。NuGet上では、PDFをプログラムで作成・変更できる.NET向けライブラリとして説明されています。

ただし、複雑な帳票レイアウトをすべて座標指定で作ると、コードが読みにくくなりがちです。表や明細行が多い請求書では、後述するQuestPDFのほうが保守しやすい場合があります。

3-2. QuestPDF:帳票・請求書などのPDF生成に強い

QuestPDFは、C#のFluent APIでPDFレイアウトを組み立てるライブラリです。表、列、行、余白、ヘッダー、フッターなどをコードで構造化できるため、請求書やレポートのような帳票PDFに向いています。

公式サイトでは、C#コードで保守しやすいPDF文書を設計できること、PDF生成向けのレイアウトエンジンを備えていること、Windows、Linux、macOS、Dockerなどで利用できることが説明されています。

3-3. iText 7:高機能だがライセンス確認が必要

iText 7は、PDF作成、編集、電子署名、フォーム、PDF/Aなど高度なPDF処理に対応する強力なライブラリです。大規模な業務システムやPDF仕様に深く関わる処理では候補になります。

一方で、iText CoreはAGPLまたは商用ライセンスで提供されており、iText CommunityはAGPLライセンスで利用する形です。社内利用、SaaS、パッケージ製品、クローズドソース製品で利用する場合は、ライセンス条件を必ず確認してください。

3-4. IronPDF:HTMLからPDF変換に強い有料ライブラリ

IronPDFは、HTML、CSS、画像を使ってデザインした内容をPDF化したい場合に便利です。Webアプリの画面やRazorテンプレートをPDF化したい場合、C#コードで座標を細かく指定するよりも、HTMLテンプレートを作ってPDFに変換するほうが開発しやすいことがあります。

NuGet上では、HTMLからPDFを生成し、署名、セキュリティ、編集などを行える包括的なC# PDFライブラリとして紹介されており、商用ライセンス製品であることも明記されています。

3-5. Spire.PDF:作成・編集・変換を幅広く試せる

Spire.PDFは、PDF作成、読み込み、編集、結合、分割、HTML変換、画像変換など、幅広い機能を試せるライブラリです。FreeSpire.PDFは商用・個人利用で無料と説明されていますが、無料版には10ページ制限やPDFから画像などへの変換ページ制限があります。

小規模な検証や、数ページだけのPDFを扱う用途には便利ですが、業務システムで大量ページを扱う場合は有料版を含めて検討したほうが安全です。

3-6. Syncfusion PDF Library:業務アプリ向け機能が豊富

Syncfusion PDF Libraryは、PDF作成、編集、署名、フォーム、セキュリティ、圧縮など、業務アプリ向けの機能が豊富です。Syncfusionは商用製品ですが、一定条件を満たす個人や小規模組織向けにCommunity Licenseを提供しています。公式FAQでは、PDF Libraryは商用製品であり、年間総収益100万ドル未満、開発者5人以下、総従業員10人以下などの条件を満たす場合に無料Community Licenseが利用可能と説明されています。

3-7. 用途別おすすめライブラリ早見表

無料でシンプルにPDFを作成したいならPDFsharp、請求書や帳票をきれいに作りたいならQuestPDF、HTMLからPDFを作りたいならIronPDF、PDF仕様に深く関わる高度な編集をしたいならiText 7、幅広い変換機能を試したいならSpire.PDF、業務アプリ全体でドキュメント処理を統一したいならSyncfusion PDF Libraryが候補になります。

4. C#でPDFを作成する方法

4-1. PDF作成に必要なNuGetパッケージのインストール

PDFsharpを使う場合は、NuGetで次のように追加します。

Bash
dotnet add package PDFsharp

QuestPDFを使う場合は次のように追加します。

Bash
dotnet add package QuestPDF

IronPDFを使う場合は次のように追加します。

Bash
dotnet add package IronPdf

Visual Studioを使う場合は、「NuGetパッケージの管理」からライブラリ名を検索してインストールしても構いません。

4-2. PDFsharpで空のPDFを作成するサンプル

PDFsharpで空のPDFを作成する最小コードは次のとおりです。

C#
using PdfSharp.Pdf;

var document = new PdfDocument();
document.Info.Title = "C# PDF Sample";

var page = document.AddPage();
page.Width = 595;
page.Height = 842;

document.Save("sample.pdf");

このコードでは、PDFドキュメントを作成し、1ページ追加してsample.pdfとして保存しています。

4-3. テキストをPDFに出力する方法

PDFsharpでPDFにテキストを描画するには、XGraphicsXFontを使います。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf;

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 20, XFontStyleEx.Regular);

gfx.DrawString(
"Hello PDF from C#",
font,
XBrushes.Black,
new XPoint(50, 100)
);

document.Save("text.pdf");

PDFsharpは座標指定で描画するため、XPoint(50, 100)のように表示位置を指定します。

4-4. 日本語テキストをPDFに表示する方法

日本語を表示する場合は、日本語フォントを明示的に扱う設計にします。PDFsharp 6.2以降では、Coreビルドのフォント解決についてカスタムフォントリゾルバーの利用が説明されています。

次は、fonts/NotoSansJP-Regular.ttfをプロジェクトに配置して日本語を描画する例です。

C#
using PdfSharp.Drawing;
using PdfSharp.Fonts;
using PdfSharp.Pdf;

GlobalFontSettings.FontResolver = new JapaneseFontResolver();

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("NotoSansJP", 18, XFontStyleEx.Regular);

gfx.DrawString(
"C#でPDFに日本語を出力します",
font,
XBrushes.Black,
new XPoint(50, 100)
);

document.Save("japanese.pdf");

public sealed class JapaneseFontResolver : IFontResolver
{
private const string FaceName = "NotoSansJP#Regular";

public FontResolverInfo? ResolveTypeface(string familyName, bool bold, bool italic)
{
if (familyName.Equals("NotoSansJP", StringComparison.OrdinalIgnoreCase))
{
return new FontResolverInfo(FaceName, false, false);
}

return null;
}

public byte[]? GetFont(string faceName)
{
if (faceName == FaceName)
{
return File.ReadAllBytes("fonts/NotoSansJP-Regular.ttf");
}

return null;
}
}

本番環境では、Windowsにインストールされているフォントに依存せず、アプリケーションに同梱したフォントを使う方法が安定します。特にLinuxやDockerで動かす場合は、フォントファイルの配置漏れが文字化けや例外の原因になります。

4-5. 画像をPDFに挿入する方法

PDFsharpで画像を追加するには、XImage.FromFileで画像を読み込み、DrawImageで配置します。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf;

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
using var image = XImage.FromFile("logo.png");

gfx.DrawImage(image, new XRect(50, 50, 120, 60));

document.Save("image.pdf");

ロゴ、印影、QRコード、バーコードなどをPDFに挿入したい場合も、基本的には同じ考え方で実装できます。

4-6. 請求書・帳票PDFを作るときの実装ポイント

請求書や帳票PDFを作る場合は、単に文字を出力するだけでなく、レイアウトの保守性を意識する必要があります。

PDFsharpで作る場合は、座標、行間、列幅、改ページ位置を自分で管理します。明細行が少ない帳票なら問題ありませんが、行数が可変の帳票ではコードが複雑になります。

QuestPDFを使う場合は、列、行、表、余白、ヘッダー、フッターを構造的に定義できます。

C#
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

QuestPDF.Settings.License = LicenseType.Community;

Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(30);

page.Header()
.Text("請求書")
.FontSize(24)
.Bold();

page.Content()
.Column(column =>
{
column.Item().Text("株式会社サンプル 御中");
column.Item().Text("請求金額:¥110,000");
column.Item().Text("お支払い期限:2026年6月30日");
});

page.Footer()
.AlignCenter()
.Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
})
.GeneratePdf("invoice.pdf");

QuestPDFを使う場合は、ライセンス条件に応じてQuestPDF.Settings.Licenseを適切に設定します。

5. C#で既存PDFを編集する方法

5-1. 既存PDFを読み込む基本コード

PDFsharpで既存PDFを読み込むには、PdfReader.Openを使います。

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var document = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Modify);

document.Info.Title = "Edited PDF";
document.Save("edited.pdf");

PdfDocumentOpenMode.Modifyを指定すると、既存PDFを編集モードで開けます。

5-2. PDFにテキストを追記する方法

既存PDFの1ページ目に文字を追記する例です。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf.IO;

var document = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Modify);
var page = document.Pages[0];

using var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 14, XFontStyleEx.Regular);

gfx.DrawString(
"Approved",
font,
XBrushes.Red,
new XPoint(50, 50)
);

document.Save("stamped.pdf");

この方法は、既存の内容を直接書き換えるというより、ページ上に新しい描画要素を重ねるイメージです。

5-3. PDFに画像・ロゴ・透かしを追加する方法

PDFにロゴや透かしを追加する場合も、画像挿入と同じ考え方です。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf.IO;

var document = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Modify);

foreach (var page in document.Pages)
{
using var gfx = XGraphics.FromPdfPage(page);
using var logo = XImage.FromFile("logo.png");

gfx.DrawImage(logo, new XRect(40, 40, 100, 40));

var font = new XFont("Arial", 48, XFontStyleEx.Regular);
gfx.DrawString(
"CONFIDENTIAL",
font,
XBrushes.LightGray,
new XPoint(120, 400)
);
}

document.Save("watermark.pdf");

透かしを本格的に制御する場合は、透明度、回転、描画順序、レイヤーを考慮する必要があります。

5-4. 複数PDFを結合する方法

PDFsharpで複数PDFを結合する例です。

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var output = new PdfDocument();

foreach (var file in new[] { "a.pdf", "b.pdf", "c.pdf" })
{
var input = PdfReader.Open(file, PdfDocumentOpenMode.Import);

for (int i = 0; i < input.PageCount; i++)
{
output.AddPage(input.Pages[i]);
}
}

output.Save("merged.pdf");

結合だけならPDFsharpで十分対応できます。ページ数が多い場合は、メモリ使用量に注意してください。

5-5. PDFをページ単位で分割する方法

1ページずつPDFを分割する例です。

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var input = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Import);

for (int i = 0; i < input.PageCount; i++)
{
var output = new PdfDocument();
output.AddPage(input.Pages[i]);
output.Save($"page-{i + 1}.pdf");
}

帳票一括出力後に、顧客ごと、社員ごと、ページごとにPDFを分けたい場合に使えます。

5-6. PDFのページを削除・並び替えする方法

ページ削除はPages.RemoveAtで行えます。

C#
using PdfSharp.Pdf.IO;

var document = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Modify);

// 2ページ目を削除
document.Pages.RemoveAt(1);

document.Save("removed.pdf");

並び替えは、新しいPDFを作って必要な順番でページを追加する方法がシンプルです。

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var input = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Import);
var output = new PdfDocument();

output.AddPage(input.Pages[2]);
output.AddPage(input.Pages[0]);
output.AddPage(input.Pages[1]);

output.Save("reordered.pdf");

5-7. PDF編集で注意すべきレイアウト崩れと権限設定

PDF編集では、WordやHTMLのように「既存テキストを自然に再レイアウトする」ことは基本的に難しいです。PDFは印刷向けの固定レイアウト形式なので、既存文字の置換、折り返し、改ページの再計算はライブラリによって対応範囲が異なります。

また、PDFに編集禁止、コピー禁止、印刷制限、パスワード保護が設定されている場合、ライブラリで読み込めない、または期待通り編集できないことがあります。業務システムでは、PDFの権限設定や暗号化の扱いも事前に確認してください。

6. C#でPDFを変換する方法

6-1. HTMLをPDFに変換する方法

IronPDFでHTMLをPDFに変換する基本コードです。

C#
using IronPdf;

var renderer = new ChromePdfRenderer();

var html = """
<h1>請求書</h1>
<p>株式会社サンプル 御中</p>
<p>請求金額:¥110,000</p>
""";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("html.pdf");

HTML to PDFでは、CSS、フォント、画像パス、ページサイズ、余白、改ページ位置の指定が重要です。Web画面をそのままPDF化する場合でも、印刷用CSSを別途用意したほうが安定します。

6-2. 画像をPDFに変換する方法

画像をPDFに貼り付けるだけならPDFsharpで実装できます。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf;

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
using var image = XImage.FromFile("photo.jpg");

page.Width = image.PixelWidth;
page.Height = image.PixelHeight;

gfx.DrawImage(image, 0, 0, page.Width, page.Height);

document.Save("image-to-pdf.pdf");

複数画像を1つのPDFにまとめる場合は、画像ごとにページを追加します。

6-3. PDFを画像に変換する方法

PDFをPNGやJPEGに変換するには、PDFレンダリングに対応したライブラリが必要です。PDFsharpはPDFページを画像として高精度にレンダリングする用途には向いていません。

Spire.PDFやIronPDFなど、PDF to Imageに対応したライブラリを使うのが一般的です。FreeSpire.PDFのNuGet説明では、PDFから画像への変換機能が記載されていますが、無料版には変換ページ数の制限があります。

6-4. Word・ExcelからPDFへ変換する方法

WordやExcelからPDFへ変換する場合、Microsoft OfficeのCOM Automationをサーバーで使う方法は避けるべきです。Microsoftは、ASP.NET、DCOM、Windows NT Serviceなどの非対話型サーバー環境でOfficeアプリケーションを自動化することを推奨・サポートしていないと説明しています。

業務システムでWord・ExcelからPDF変換を行うなら、次の方法を検討します。

有料のドキュメント変換ライブラリを使う、LibreOfficeのheadless変換を別プロセスで使う、クラウド変換APIを使う、最初からPDF生成用テンプレートをC#側で再設計する、といった選択肢があります。

6-5. PDF変換で文字化け・余白ズレが起きる原因

PDF変換で文字化けが起きる原因は、フォントが実行環境にない、PDFにフォントが埋め込まれていない、日本語に対応していないフォントを指定している、文字エンコーディングや字形処理に対応していない、などです。

余白ズレは、HTMLの印刷CSSが不十分、ブラウザ表示用CSSをそのまま使っている、A4サイズや余白指定が曖昧、画像やWebフォントの読み込みが完了する前にPDF化している、などが原因になります。

6-6. WebアプリでPDF変換機能を実装する際の注意点

ASP.NET CoreなどのWebアプリでPDF変換を行う場合は、同時実行数、メモリ使用量、一時ファイルの削除、フォント配置、Docker環境の依存パッケージ、タイムアウト、セキュリティを考慮します。

HTML to PDFでは、外部URLの画像やCSSを読み込む場合にネットワーク遅延やアクセス権限の問題が起きることがあります。社内システムでは、HTML、CSS、画像、フォントをローカルまたはアプリケーション配下にまとめる設計が安定します。

7. C# PDF実装でよくあるエラーと解決策

7-1. 日本語が文字化けする

日本語が□や?になる場合は、フォントが日本語を含んでいない、フォントが埋め込まれていない、LinuxやDockerにフォントが存在しない、ライブラリ側でフォント解決ができていない可能性があります。

解決策は、日本語フォントファイルをアプリに同梱し、PDF生成時に明示的に指定することです。PDFsharpではカスタムフォントリゾルバー、QuestPDFではフォント登録やフォントファミリー指定を使います。

7-2. フォントが埋め込まれない

PDFを別PCで開いたときに文字が崩れる場合、フォントが埋め込まれていない可能性があります。フォント埋め込みに対応した設定を使い、利用フォントのライセンスで埋め込みが許可されているか確認してください。

フォントをアプリケーションに同梱する場合でも、そのフォントの再配布やPDF埋め込みが許可されている必要があります。

7-3. NuGetパッケージのバージョン違いで動かない

サンプルコードと自分の環境でAPI名が違う場合、NuGetパッケージのバージョン差が原因のことがあります。たとえばPDFsharpでは、古い記事のXFontStyleと新しいバージョンのXFontStyleExが異なる場合があります。

解決策は、公式ドキュメント、NuGetページ、GitHubのREADMEを確認し、自分が使っているバージョンに合わせてコードを修正することです。

7-4. .NET Frameworkと.NET Coreで挙動が違う

.NET FrameworkではWindowsフォントやGDI+に依存して動いていたコードが、.NET 6以降やLinux環境では動かないことがあります。PDF生成はファイルI/O、フォント、画像処理、ネイティブ依存パッケージの影響を受けやすいです。

新規開発では、最初から本番と同じOS、同じDockerイメージ、同じフォント配置で検証することをおすすめします。

7-5. Linux・Docker環境でPDF生成に失敗する

LinuxやDockerでPDF生成に失敗する場合は、フォント、libgdiplus、Chromium依存、画像処理ライブラリ、権限、一時ディレクトリが原因になりやすいです。

特にHTML to PDFでは、ライブラリが内部でChromiumを利用する場合があるため、Dockerイメージに必要な依存関係を含める必要があります。IronPDFはNuGet上でDockerやLinux対応を掲げていますが、実際のデプロイ時は公式の環境別手順を確認してください。

7-6. PDFファイルがロックされて上書きできない

PDFを上書き保存できない場合、FileStreamPdfDocumentを閉じていない可能性があります。usingを使ってファイルハンドルを確実に解放しましょう。

C#
using (var document = new PdfDocument())
{
document.AddPage();
document.Save("output.pdf");
}

同じファイルを読み込んで同じパスに保存する場合は、一度別ファイルに保存してから置き換える方法が安全です。

7-7. 商用利用時のライセンス違反を避ける方法

商用利用では、ライセンスを必ず確認してください。確認すべき項目は、商用利用可否、ソースコード公開義務、SaaS利用の扱い、再配布の可否、フォント埋め込み可否、無料版のページ数制限、開発者数や売上条件です。

特にAGPL系ライセンス、無料版に制限がある商用ライブラリ、Community Licenseは、条件を満たさないと後から問題になる可能性があります。

8. 用途別|C# PDFライブラリのおすすめ選定

8-1. 無料でPDFを作成したい場合

無料でC#からPDFを作成したいなら、まずPDFsharpを検討するとよいでしょう。MIT Licenseで使いやすく、空PDF作成、テキスト描画、画像挿入、結合、分割の基本を学びやすいです。

ただし、日本語フォント対応は最初にきちんと設計しましょう。

8-2. 請求書・帳票を作成したい場合

請求書、見積書、検査成績書、一覧表などを作るならQuestPDFが有力です。座標指定ではなく、列、行、表、余白を構造的に書けるため、帳票コードの保守性が高くなります。

ただし、QuestPDFはライセンス条件を確認して使う必要があります。公式サイトでは、個人、非営利、FOSSプロジェクト、年間売上100万ドル未満の組織で無料と説明されています。

8-3. HTMLからPDFを生成したい場合

HTMLからPDFを生成したい場合は、IronPDFのようなHTML to PDFライブラリが適しています。CSSで帳票デザインを作り、RazorテンプレートやHTMLテンプレートからPDF化したい場合に便利です。

HTML to PDFでは、印刷用CSS、フォント、画像パス、改ページ制御を丁寧に調整することが重要です。

8-4. 既存PDFを編集・結合・分割したい場合

既存PDFの結合、分割、ページ削除、簡単な追記ならPDFsharpで対応できます。透かし、ロゴ、ページ番号の追加も比較的実装しやすいです。

既存テキストの編集、フォーム処理、電子署名、権限設定、PDF/Aなどが必要な場合は、iText 7、IronPDF、Syncfusion PDF Library、Spire.PDFなどを検討しましょう。

8-5. 商用システムで安全に使いたい場合

商用システムでは、機能だけでなくライセンスとサポートが重要です。無料ライブラリを使う場合は、ライセンス表記、保守状況、脆弱性対応を確認します。

有料ライブラリを使う場合は、サポート契約、開発者数、サーバー数、SaaS利用、再配布可否、バージョンアップ費用まで確認しておくと安心です。

8-6. 初心者がまず選ぶべきライブラリ

C# PDF初心者がまず学ぶなら、シンプルなPDFsharpがおすすめです。PDFの基本構造、ページ追加、文字描画、画像挿入、結合、分割を理解できます。

帳票を実務で作ることが目的なら、最初からQuestPDFを学ぶのもよい選択です。座標指定より読みやすく、請求書やレポートの実装に向いています。

9. C#でPDFを扱う実装サンプル集

9-1. PDFを新規作成する最小コード

C#
using PdfSharp.Pdf;

var document = new PdfDocument();
document.AddPage();
document.Save("new.pdf");

9-2. PDFに日本語を出力するコード

C#
using PdfSharp.Drawing;
using PdfSharp.Fonts;
using PdfSharp.Pdf;

GlobalFontSettings.FontResolver = new JapaneseFontResolver();

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("NotoSansJP", 16, XFontStyleEx.Regular);

gfx.DrawString("日本語PDFサンプル", font, XBrushes.Black, new XPoint(50, 80));

document.Save("jp.pdf");

public sealed class JapaneseFontResolver : IFontResolver
{
private const string FaceName = "NotoSansJP#Regular";

public FontResolverInfo? ResolveTypeface(string familyName, bool bold, bool italic)
{
return familyName.Equals("NotoSansJP", StringComparison.OrdinalIgnoreCase)
? new FontResolverInfo(FaceName, false, false)
: null;
}

public byte[]? GetFont(string faceName)
{
return faceName == FaceName
? File.ReadAllBytes("fonts/NotoSansJP-Regular.ttf")
: null;
}
}

9-3. PDFに画像を追加するコード

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf;

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
using var image = XImage.FromFile("logo.png");

gfx.DrawImage(image, new XRect(40, 40, 120, 60));

document.Save("logo.pdf");

9-4. 複数PDFを結合するコード

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var output = new PdfDocument();

var files = Directory.GetFiles("pdfs", "*.pdf")
.OrderBy(x => x);

foreach (var file in files)
{
var input = PdfReader.Open(file, PdfDocumentOpenMode.Import);

for (int i = 0; i < input.PageCount; i++)
{
output.AddPage(input.Pages[i]);
}
}

output.Save("merged.pdf");

9-5. PDFをページごとに分割するコード

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

var input = PdfReader.Open("source.pdf", PdfDocumentOpenMode.Import);

for (int i = 0; i < input.PageCount; i++)
{
var output = new PdfDocument();
output.AddPage(input.Pages[i]);
output.Save($"source-page-{i + 1}.pdf");
}

9-6. HTMLをPDFに変換するコード

C#
using IronPdf;

var renderer = new ChromePdfRenderer();

var html = """
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
body { font-family: sans-serif; margin: 40px; }
h1 { font-size: 24px; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #333; padding: 8px; }
</style>
</head>
<body>
<h1>請求書</h1>
<table>
<tr><th>品目</th><th>金額</th></tr>
<tr><td>開発費</td><td>100,000</td></tr>
</table>
</body>
</html>
""";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice-html.pdf");

9-7. ASP.NET CoreでPDFをダウンロードさせるコード

ASP.NET CoreでPDFを生成してダウンロードさせる例です。

C#
using Microsoft.AspNetCore.Mvc;
using PdfSharp.Drawing;
using PdfSharp.Pdf;

[ApiController]
[Route("api/pdf")]
public class PdfController : ControllerBase
{
[HttpGet("download")]
public IActionResult Download()
{
using var stream = new MemoryStream();

var document = new PdfDocument();
var page = document.AddPage();

using var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 20, XFontStyleEx.Regular);

gfx.DrawString("PDF Download Sample", font, XBrushes.Black, new XPoint(50, 100));

document.Save(stream, false);

return File(
stream.ToArray(),
"application/pdf",
"sample.pdf"
);
}
}

Webアプリでは、サーバー上に一時ファイルを作らず、MemoryStreamでPDFを生成して返すと扱いやすいです。

10. C#でPDFを作成・編集・変換するときのFAQ

10-1. C#でPDFを無料作成できますか?

はい、できます。PDFsharpを使えば、無料でPDFの新規作成、テキスト描画、画像挿入、結合、分割などを実装できます。PDFsharpはMIT Licenseのオープンソースとして公開されています。

10-2. C#でPDFを編集できる無料ライブラリはありますか?

PDFsharpで既存PDFを読み込み、テキストや画像を重ねる、ページを結合・分割する、ページを削除する、といった編集は可能です。ただし、既存テキストをWordのように直接編集する用途には向いていません。

10-3. C#でHTMLをPDFに変換するにはどのライブラリがよいですか?

HTMLからPDFに変換したい場合は、IronPDFのようなHTML to PDF対応ライブラリが使いやすいです。CSSで帳票をデザインできるため、Webアプリとの相性がよいです。IronPDFは商用ライセンス製品であるため、業務利用ではライセンス確認が必要です。

10-4. PDFsharpとiText 7はどちらがおすすめですか?

シンプルなPDF作成、結合、分割を無料で始めたいならPDFsharpがおすすめです。電子署名、フォーム、PDF/A、高度なPDF編集などが必要ならiText 7が候補になります。

ただし、iText 7はAGPLまたは商用ライセンスの確認が必要です。クローズドソースの商用システムで使う場合は、ライセンス条件を慎重に確認してください。

10-5. C#でPDFの日本語文字化けを防ぐには?

日本語対応フォントを明示的に指定し、必要に応じてPDFに埋め込みます。Windowsのフォントに依存すると、LinuxやDocker環境で文字化けしやすくなります。

本番環境では、利用許諾を確認した日本語フォントをアプリケーションに同梱し、PDF生成ライブラリ側で明示的に読み込む方法が安全です。

10-6. 商用利用できるC# PDFライブラリはどれですか?

PDFsharpはMIT Licenseのため商用利用しやすいライブラリです。QuestPDFは一定条件下で無料利用できますが、組織規模や売上条件を確認する必要があります。IronPDF、Syncfusion PDF Library、iText 7の商用利用では、有料ライセンスやCommunity License条件を確認してください。

10-7. ASP.NET CoreでもPDF生成できますか?

はい、ASP.NET CoreでもPDF生成できます。PDFsharp、QuestPDF、IronPDFなどを使い、サーバー側でPDFを生成してFile()で返せば、ブラウザからPDFをダウンロードできます。

ただし、LinuxやDockerにデプロイする場合は、フォント、画像、ネイティブ依存関係、一時ファイルの権限を事前に確認してください。

まとめ

C#でPDFを作成・編集・変換する方法は、目的によって最適なライブラリが異なります。

無料でシンプルにPDFを作成したいならPDFsharp、請求書や帳票を保守しやすく作りたいならQuestPDF、HTMLからPDFを生成したいならIronPDF、既存PDFを高度に編集したいならiText 7やSyncfusion PDF Library、幅広い変換機能を試したいならSpire.PDFが候補になります。

C# PDF実装で失敗しやすいポイントは、日本語フォント、ライセンス、.NETバージョン、Linux・Docker環境、HTML変換時のレイアウト差です。最初に「PDFを新規作成したいのか」「既存PDFを編集したいのか」「HTMLやOffice文書から変換したいのか」を整理し、用途に合ったライブラリを選ぶことが重要です。