もしこれまでに Microsoft Office Interop を使って C# で Word を PDF に変換したことがあるなら、その大変さはよくご存じかもしれません。
COM 依存による問題、サーバー環境で不安定な Office 自動化、さらにドキュメント変換のためだけに Microsoft Office をフルインストールしなければならない――。
この方法はローカル環境では動作しても、本番環境ではすぐに問題が表面化します。
- Office 自動化は サーバーサイドアプリケーションには非推奨
- 依存関係が重い
- パフォーマンスや安定性の問題 が発生しやすい
では、より良い方法はあるのでしょうか?
本記事では、Spire.Doc for .NET を使用して、Microsoft Office をインストールせずに C# で Word を PDF に変換する方法を紹介します。
Spire.Doc は、Word ドキュメントをプログラムから操作するために設計された軽量な .NET ライブラリです。
なぜ Word → PDF 変換に Spire.Doc for .NET を使うのか?
コードを書く前に、まず「なぜ Spire.Doc なのか?」という疑問に答えておきましょう。
Office 自動化とは異なり、Spire.Doc は マネージド .NET API を通じて直接 Word ドキュメントを操作 できます。
以下は代表的なアプローチの比較です。
| 機能 | Spire.Doc | Word Interop | LibreOffice Headless |
|---|---|---|---|
| Office のインストール | ✅ 不要 | ❌ 必須 | ✅ 不要 |
| Linux / Docker 対応 | ✅ 対応 | ❌ 非対応 | ✅ 対応(CLI 経由) |
| 変換精度 | ✅ 高い | ✅ 高い | ⚠️ 状況による |
| サーバーサイド利用 | ✅ 安全 | ❌ 非推奨 | ⚠️ サブプロセス依存 |
| オフライン環境対応 | ✅ 対応 | ✅ 対応 | ✅ 対応 |
| レイテンシ | ✅ インプロセス | 🐢 遅い(COM) | 🐢 プロセス起動が必要 |
| コストモデル | 買い切りライセンス | Office ライセンス | 無料 |
比較すると傾向は明確です。
Word Interop は、すでに Office がインストールされているデスクトップアプリでは便利ですが、Microsoft 自身もサーバーサイド用途には 非推奨 としています。
LibreOffice headless は無料で優秀な選択肢ですが、高負荷環境では変換ごとに新しいプロセスを起動する必要があり、運用上の課題が発生しがちです。
その点、Spire.Doc はサーバーサイド自動化に最適です。
- 単一の NuGet パッケージ
- 完全マネージド .NET
- 外部プロセス不要
- Office 不要
- ネットワーク通信不要
そのため、モダンな .NET アプリケーション に適した信頼性の高いソリューションとなっています。
💡 ヒント:
Spire.Doc for .NET には評価・小規模用途向けの無料版があります。本番利用やフル機能を利用するには商用ライセンスが必要です。
🚀 Linux コンテナ上で .NET アプリケーションを動かす場合は、libgdiplus パッケージをインストールしてください。
これはドキュメント描画に必要な GDI+ 互換レイヤーを提供します。
セットアップ:Spire.Doc をインストールする
インストールは NuGet から数秒で完了します。
PM> Install-Package Spire.Doc
インストール後、すぐに Word ドキュメントの変換を開始できます。
基本変換:C# で Word を PDF に変換
まずは最もシンプルな例として、.docx ファイルを PDF に変換してみましょう。
using Spire.Doc;
namespace ConvertWordToPdf
{
class Program
{
static void Main(string[] args)
{
Document doc = new Document();
// Word ドキュメントを読み込む
doc.LoadFromFile("C:\\Users\\Tommy\\Desktop\\Sample.docx");
// PDF として保存
doc.SaveToFile("C:\\Users\\Tommy\\Desktop\\Sample.pdf", FileFormat.PDF);
// リソースを解放
doc.Dispose();
}
}
}
これだけです。
このコードは次の 3 ステップを実行しています。
- Word ドキュメントをメモリへ読み込む
- ドキュメントレイアウトをレンダリングする
- レンダリング結果を PDF として出力する
Word → PDF 変換の高度な設定
デフォルト設定でも十分実用的ですが、本番環境では出力をより細かく制御したいケースも多くあります。
Spire.Doc では、さまざまな PDF 出力オプションを設定できます。
Stream ベース変換 — Web API レスポンス向け
PDF をダウンロードさせる API を作成する場合、一度ディスクへ保存するのは非効率です。
Spire.Doc は任意の Stream に直接出力できるため、HTTP レスポンスへそのままストリーミングできます。
using Spire.Doc;
[HttpPost("convert")]
public async Task ConvertToPdf(IFormFile wordFile)
{
if (wordFile == null || wordFile.Length == 0)
{
HttpContext.Response.StatusCode = 400;
await HttpContext.Response.WriteAsync("No file uploaded.");
return;
}
// レスポンスのContent-Typeとファイル名を先に設定
HttpContext.Response.ContentType = "application/pdf";
var fileName = Path.GetFileNameWithoutExtension(wordFile.FileName) + ".pdf";
HttpContext.Response.Headers["Content-Disposition"]
= $"attachment; filename=\"{fileName}\"";
using var inputStream = wordFile.OpenReadStream();
using var doc = new Document();
// 一時ファイル不要で直接読み込み
doc.LoadFromStream(inputStream, FileFormat.Docx);
// HttpResponse.Body に直接書き出し
doc.SaveToStream(HttpContext.Response.Body, FileFormat.PDF);
}
主なポイント
-
doc.LoadFromStream(inputStream, FileFormat.Docx);- アップロードストリームから直接 Word 文書を読み込み、一時ファイル不要。 -
doc.SaveToStream(outputStream, FileFormat.PDF);- 変換した PDF をメモリストリームに直接書き込み。 -
outputStream.Position = 0;- 返却前にストリーム位置をリセット。 -
return File(outputStream, "application/pdf", fileName);- PDF を HTTP レスポンスに直接ストリーミング。
⚠️ MemoryStream と大容量ファイルについて
50MB 以下なら問題ありませんが、大容量ファイルを高頻度で処理する場合は注意が必要です。
非常に大きな MemoryStream は LOH(Large Object Heap)に負荷をかけるため、必要に応じて FileStream を利用した一時ファイル方式も検討してください。
PDF 出力オプション — ページサイズ・画質・フォント埋め込み
Spire.Doc では ToPdfParameterList を使って、PDF 出力を細かく調整できます。
using Spire.Doc;
using Spire.Pdf;
namespace ConvertWordToPdf
{
class Program
{
static void Main(string[] args)
{
Document doc = new Document();
try
{
// Word ドキュメントを読み込む
doc.LoadFromFile(@"C:\Users\Tommy\Desktop\Sample.docx");
// PDF 出力パラメータ
ToPdfParameterList pdfParams = new ToPdfParameterList();
// 1. ページサイズ
pdfParams.PdfPageSize = PdfPageSize.A4;
// 2. 画像品質
pdfParams.ImageQuality = 80;
// 3. フォント埋め込み
pdfParams.IsEmbeddedAllFonts = true;
// PDF 出力
doc.SaveToFile(@"C:\Users\Tommy\Desktop\Sample.pdf", pdfParams);
System.Console.WriteLine("カスタムオプションでPDFが正常に作成されました!");
}
}
}
}
コード解説
-
ToPdfParameterList- ページサイズ、画質、フォント埋め込みなどの PDF 出力設定を構成するオブジェクト。 -
PdfPageSize.A4- 出力ページの寸法(A4, Letter, Legalなど)を設定します。 -
ImageQuality = 80- 画像圧縮を制御します(0~100)。80は品質とファイルサイズのバランスが取れています。 -
IsEmbeddedAllFonts = true- すべてのフォントを埋め込み、クロスプラットフォームでの表示の一貫性を確保します。
バッチ変換 — フォルダ内の Word を一括変換
レポート生成パイプライン、定期的なエクスポート、または移行ジョブでは、通常、複数のファイルを処理する必要があります。以下は、1つのファイルのエラーがバッチ全体を中断しないように基本的なエラー分離を行った、本番環境に対応できるパターンです。
using Spire.Doc;
using System.IO;
class Program
{
static void Main()
{
string sourceDir = @"C:\Users\Tommy\Desktop\WordFiles";
string targetDir = @"C:\Users\Tommy\Desktop\PDFFiles";
Directory.CreateDirectory(targetDir);
foreach (string file in Directory.GetFiles(sourceDir, "*.docx"))
{
Document doc = new Document();
doc.LoadFromFile(file);
string pdfFile = Path.Combine(targetDir,
Path.GetFileNameWithoutExtension(file) + ".pdf");
doc.SaveToFile(pdfFile, FileFormat.PDF);
doc.Dispose();
Console.WriteLine($"変換完了: {Path.GetFileName(file)}");
}
}
}
主な用途
- ドキュメントアーカイブ
- 自動レポート生成
- 契約書処理パイプライン
主なポイント
-
Directory.CreateDirectory(targetDir);- ファイルを保存する前に出力フォルダが存在することを確認します。 -
Directory.GetFiles(sourceDir, "*.docx")- バッチ処理のためにソースフォルダからすべての Word 文書を取得します。 -
Path.Combine(targetDir, ...)- ファイル名を保持したまま出力ファイルパスを構築します。 -
Path.GetFileNameWithoutExtension(file) + ".pdf"- 元の拡張子を置き換えて PDF ファイル名を生成します。 - ファイルごとに
Documentを生成することで、大量処理時のメモリ肥大化を防止。
実践例:ASP.NET Core Web API
最も一般的なサーバーサイド構成です。
クライアントが .docx を POST → API が .pdf を返却します。
以下は、本番環境に対応した完全なコントローラーです。
using Microsoft.AspNetCore.Mvc;
using Spire.Doc;
[Route("api/[controller]")]
[ApiController]
public class WordToPdfController : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Post(IFormFile file)
{
using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
using var doc = new Document();
doc.LoadFromStream(ms, FileFormat.Docx);
using var pdf = new MemoryStream();
doc.SaveToStream(pdf, FileFormat.PDF);
pdf.Position = 0;
return File(pdf, "application/pdf", "output.pdf");
}
}
よくある利用シーン
- ドキュメント生成サービス
- SaaS レポートシステム
- 請求書自動処理
コード解説
-
[Route("api/[controller]")]と[ApiController]- API エンドポイントを定義し、自動モデル検証を有効にする標準の ASP.NET Core 属性。 -
await file.CopyToAsync(ms);- 処理のためにアップロードされたファイルをメモリストリームに非同期的にコピーします。 -
ms.Position = 0;- 読み取りまたは返却前にストリーム位置を先頭にリセットします。 -
doc.LoadFromStream(ms, FileFormat.Docx);- ディスクに保存せずに、メモリストリームから Word 文書を直接読み込みます。 -
doc.SaveToStream(pdf, FileFormat.PDF);- 変換して PDF をメモリストリームに書き込みます。 -
return File(pdf, "application/pdf", "output.pdf");- PDF をダウンロード可能なファイルとしてクライアントに直接ストリーミングします。
Word → PDF 変換でよくある問題
本番環境で C# による Word から PDF への変換を実装する際、開発者が遭遇するよくある問題がいくつかあります。
Linux サーバーでフォントが不足する
Linux 環境ではフォント不足によりレイアウト崩れが発生することがあります。
以下で基本フォント設定を追加できます。
sudo apt install fontconfig
テンプレートによっては追加フォントのインストールも必要です。
大容量ドキュメントによるメモリ消費
高解像度画像を含む大きな Word は大量のメモリを消費します。
対策例:
- 画像解像度を下げる
- ストリームベース処理にする
- 大量ファイルを分割バッチ処理する
レイアウト差異
埋め込みオブジェクトなど、一部の複雑な Word 機能は PDF 出力時に微妙な差異が出ることがあります。
実運用前に、実際のドキュメントで十分にテストすることをおすすめします。
まとめ
Word から PDF への変換が必要な C# アプリケーションを構築している場合:
- サーバー環境では Microsoft Office Interop を避ける
- Spire.Doc for .NET のような専用ライブラリを利用する
- ストリーム処理やバッチ処理を活用してスケーラブルに設計する
わずか数行のコードで、Microsoft Office をインストールすることなく、信頼性の高い Word から PDF への変換を .NET アプリケーションに統合できます。


