C# Document完全ガイド|C#でWord・PDF文書を作成・編集する方法を初心者向けに解説
はじめに
「C# Document」と検索している人の多くは、C#を使ってWord文書やPDF文書を作成したい、既存の文書を編集したい、帳票や請求書を自動生成したい、WordをPDFに変換したい、といった目的を持っているはずです。
C#では、標準機能だけでWordやPDFを高度に操作するというより、目的に合ったDocument操作ライブラリを使って文書処理を実装するのが一般的です。たとえば、Word文書を扱うならOpen XML SDKやDocX、PDFを扱うならPDFsharp、iText、QuestPDFなどが候補になります。
この記事では、C# Documentの基本から、Word文書の作成・編集、PDF文書の作成・編集、WordからPDFへの変換、ライブラリ比較、実践サンプルコード、エラー対策までを初心者向けにわかりやすく解説します。
1. C# Documentとは?検索ユーザーが知りたい基本を初心者向けに解説
1-1. C#で扱う「Document」の意味
C#における「Document」とは、一般的に文書ファイルや文書オブジェクトを指します。ただし、「C# Document」という名前の単一機能が.NETに標準搭載されているわけではありません。
実際には、次のような意味で使われます。
Word文書を表すDocument、PDF文書を表すDocument、HTMLやXMLのドキュメント、テキストファイル、帳票、契約書、見積書、請求書、レポートなどです。
たとえばOpen XML SDKでは、Wordファイルを操作するときにWordprocessingDocumentやDocumentといったクラスを使用します。Open XML SDKは、Office文書のOpen XMLパッケージやスキーマ要素を操作しやすくするためのSDKとして提供されています。Microsoft Learn+1
つまり、C# Documentとは「C#で文書データを作成・読み込み・編集・保存する処理全般」と考えると理解しやすいです。
1-2. Word文書・PDF文書・テキスト文書の違い
C#でDocumentを扱う場合、まず文書形式の違いを理解することが重要です。
Word文書は、主に.docx形式で保存される編集可能な文書です。見出し、段落、表、画像、ヘッダー、フッター、スタイルなどを保持できます。社内文書、契約書、報告書、テンプレート文書の自動生成に向いています。
PDF文書は、表示や印刷時のレイアウトを固定しやすい文書形式です。請求書、領収書、帳票、マニュアル、申込書など、相手に渡したときに見た目を崩したくない文書に向いています。
テキスト文書は、.txtや.csvのようなシンプルな文字データです。レイアウトや装飾はほとんど扱えませんが、ログ出力、データ連携、設定ファイルなどに向いています。
C# Document操作では、編集しやすさを重視するならWord、配布や印刷を重視するならPDF、単純なデータ保存ならテキスト、というように使い分けます。
1-3. C#で文書作成・編集を行う主な用途
C#でDocumentを操作する代表的な用途には、次のようなものがあります。
業務システムで請求書や見積書を自動生成する、顧客情報をテンプレートWordに差し込む、契約書を自動作成する、レポートをPDFで出力する、複数のPDFを結合する、Word文書をPDFに変換する、社内帳票を一括出力する、電子申請用の文書を生成する、といったケースです。
手作業で文書を作成すると、入力ミスやレイアウト崩れが起きやすくなります。C#で文書生成を自動化すれば、データベースの内容をもとに、同じ形式の文書を正確に大量出力できます。
1-4. C# Documentでできること一覧
C# Document操作では、ライブラリを使うことで次のような処理ができます。
Word文書の新規作成、既存Word文書の読み込み、段落や見出しの追加、表の挿入、画像の挿入、文字列の検索と置換、ヘッダー・フッター編集、テンプレート差し込み、PDF文書の新規作成、PDFへのテキスト描画、PDFへの画像追加、PDFページの追加・削除、複数PDFの結合、PDFへの注釈追加、WordからPDFへの変換などです。
ただし、すべてのライブラリが同じ機能を持っているわけではありません。Word作成に強いライブラリ、PDF生成に強いライブラリ、変換に強いライブラリなど、それぞれ得意分野があります。
2. C#でDocumentを扱う前に知っておきたい基礎知識
2-1. .NET環境とC#プロジェクトの準備
C#でDocument操作を始めるには、まず.NETの開発環境を用意します。一般的には、Visual Studio、Visual Studio Code、JetBrains Riderなどを使用します。
初心者にはVisual Studioがわかりやすいです。コンソールアプリ、Windowsフォームアプリ、WPFアプリ、ASP.NET Coreアプリなど、目的に応じてプロジェクトを作成できます。
たとえば、文書作成の基本を試すだけなら、まずはコンソールアプリで十分です。
C#dotnet new console -n DocumentSample
cd DocumentSample
その後、NuGetで必要なライブラリを追加します。
C#dotnet add package DocumentFormat.OpenXml
NuGetとは、.NET向けのパッケージ管理システムです。Document操作に必要なライブラリの多くはNuGetから追加できます。
2-2. Document操作に必要なライブラリの種類
C#でDocumentを扱うライブラリは、大きく分けると次の種類があります。
Word文書用ライブラリには、Open XML SDK、DocX、Microsoft Office Interop、Aspose.Words、Syncfusion DocIOなどがあります。
PDF文書用ライブラリには、PDFsharp、MigraDoc、iText、QuestPDF、Aspose.PDF、Syncfusion PDFなどがあります。
WordからPDFへの変換に対応したライブラリには、Microsoft Office Interop、Aspose.Words、Syncfusion DocIO、Xceed Words for .NETなどがあります。Xceed Words for .NETは、WordやOfficeをインストールせずにWord文書を作成・操作でき、WordからPDFへの変換機能も提供していますが、PDF変換では対応要素の確認が必要です。Xceed
ライブラリを選ぶときは、「Wordを作りたいのか」「PDFを作りたいのか」「既存ファイルを編集したいのか」「変換したいのか」を先に決めることが重要です。
2-3. Word文書とPDF文書で必要な処理の違い
Word文書は、文書構造を編集するイメージです。段落、Run、Text、Table、Image、Styleなどの要素を追加・変更して文書を組み立てます。
一方、PDF文書は、ページ上の座標に文字や図形を配置するイメージに近いです。PDFは完成形の見た目を保持するための形式なので、Wordのように「この段落を自然に編集する」という処理が難しい場合があります。
そのため、実務では次のような流れがよく使われます。
まずWordテンプレートを作成し、C#で文字列を差し替え、最後にPDFに変換する方法です。この流れなら、文書の編集しやすさとPDFの配布しやすさを両立できます。
2-4. 無料ライブラリと有料ライブラリの選び方
無料ライブラリは、学習や小規模開発に向いています。Open XML SDK、PDFsharp、QuestPDFなどは、C# Document操作を学ぶうえで有力な候補です。PDFsharpは.NET向けのPDF処理ライブラリで、GDI+に似た描画処理でPDFページを作成できますが、基本的なテキストレイアウトが中心で、自動改ページなどは用途に応じた設計が必要です。PDFsharp & MigraDoc Docs
有料ライブラリは、実務で安定性や変換精度を重視する場合に向いています。特にWordからPDFへの変換、複雑な表、画像、フォント、ヘッダー・フッター、ページ番号、差し込み印刷、電子署名などを扱う場合は、商用ライブラリのほうが開発コストを抑えられることがあります。
選定時は、価格だけでなく、ライセンス、商用利用可否、サーバー利用可否、日本語対応、PDF変換精度、保守体制、Linux対応、Docker対応なども確認しましょう。
3. C#でWord文書を作成する方法
3-1. Word文書作成に使える代表的なライブラリ
C#でWord文書を作成する代表的なライブラリは、Open XML SDK、DocX、Microsoft Office Interop、商用ライブラリです。
Open XML SDKは、.docxの内部構造であるOpen XMLを直接扱うライブラリです。Microsoft公式のSDKで、Word、Excel、PowerPoint文書をプログラムから作成・操作できます。低レベルな操作が必要になるため、初心者には少し難しく感じるかもしれませんが、Officeをインストールせずに使える点が大きなメリットです。GitHub
DocXは、Open XML SDKよりも簡単なAPIでWord文書を操作できるライブラリです。XceedのDocXは、Microsoft WordやOfficeをインストールせずにWordファイルを操作できることが特徴です。GitHub
Microsoft Office Interopは、インストール済みのWordアプリケーションをC#から操作する方法です。Wordそのものを動かすため再現性は高いですが、サーバー環境では推奨されません。
3-2. 新規Wordファイルを作成する基本手順
Open XML SDKでWord文書を新規作成する基本手順は次の通りです。
まずNuGetでDocumentFormat.OpenXmlを追加します。
C#dotnet add package DocumentFormat.OpenXml
次に、WordprocessingDocumentを作成し、MainDocumentPartを追加し、Bodyに段落を追加します。
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
string filePath = "sample.docx";
using WordprocessingDocument wordDoc =
WordprocessingDocument.Create(filePath, DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
mainPart.Document = new Document(new Body());
Body body = mainPart.Document.Body!;
Paragraph paragraph = new Paragraph(
new Run(
new Text("C#でWord文書を作成しました。")
)
);
body.Append(paragraph);
mainPart.Document.Save();
このコードを実行すると、sample.docxというWordファイルが作成されます。
3-3. 見出し・本文・段落を追加する方法
Word文書では、文章は主に段落として追加します。Open XML SDKではParagraph、Run、Textを組み合わせて本文を作成します。
C#Paragraph title = new Paragraph(
new Run(
new Text("請求書")
)
);
Paragraph bodyText = new Paragraph(
new Run(
new Text("下記の通りご請求申し上げます。")
)
);
body.Append(title);
body.Append(bodyText);
見出しスタイルを厳密に設定したい場合は、スタイル定義を追加したうえで、段落にParagraphStyleIdを指定します。初心者の場合は、まず段落と本文の追加から始め、慣れてからスタイル設定に進むとよいでしょう。
3-4. 表・画像・箇条書きを挿入する方法
表を挿入する場合は、Table、TableRow、TableCellを使います。
C#Table table = new Table();
TableRow headerRow = new TableRow();
headerRow.Append(
new TableCell(new Paragraph(new Run(new Text("商品名")))),
new TableCell(new Paragraph(new Run(new Text("数量")))),
new TableCell(new Paragraph(new Run(new Text("金額"))))
);
TableRow dataRow = new TableRow();
dataRow.Append(
new TableCell(new Paragraph(new Run(new Text("開発費")))),
new TableCell(new Paragraph(new Run(new Text("1")))),
new TableCell(new Paragraph(new Run(new Text("100,000円"))))
);
table.Append(headerRow);
table.Append(dataRow);
body.Append(table);
画像を挿入する場合は、ImagePartを追加し、画像ファイルを読み込み、Drawing要素を作成する必要があります。Open XML SDKでは画像挿入のコードがやや長くなるため、初心者はまずテキストと表の追加から学ぶのがおすすめです。
箇条書きについても、番号定義やスタイル設定が必要になります。簡単に箇条書き風に見せるだけなら、先頭に「・」を付けた段落を追加する方法でも対応できます。
C#body.Append(new Paragraph(new Run(new Text("・Word文書の作成"))));
body.Append(new Paragraph(new Run(new Text("・PDF文書の作成"))));
body.Append(new Paragraph(new Run(new Text("・文書の自動出力"))));
3-5. 作成したWord文書を保存する方法
Open XML SDKでは、MainDocumentPart.Document.Save()を呼び出すことで文書内容を保存できます。また、usingブロックを抜けるとファイルが閉じられます。
C#mainPart.Document.Save();
保存時に注意したいのは、ファイルがすでにWordで開かれている場合です。Wordで開いているファイルに上書き保存しようとすると、アクセス権限エラーやファイルロックエラーが発生することがあります。
安全に保存したい場合は、出力先ファイル名を変える、既存ファイルを閉じてから実行する、一時ファイルに保存してから置き換える、といった対策を行います。
4. C#でWord文書を編集する方法
4-1. 既存のWordファイルを読み込む方法
既存のWordファイルを編集するには、WordprocessingDocument.Openを使用します。第2引数にtrueを指定すると編集可能な状態で開けます。
C#using DocumentFormat.OpenXml.Packaging;
string filePath = "template.docx";
using WordprocessingDocument wordDoc =
WordprocessingDocument.Open(filePath, true);
var body = wordDoc.MainDocumentPart!.Document.Body;
Open XML SDKでは、既存のWord処理ドキュメントを開いてテキストを追加する方法がMicrosoft Learnでも解説されています。Microsoft Learn
4-2. 文書内のテキストを検索・置換する方法
テンプレート文書の文字列を置換する場合、Text要素を検索して置き換える方法があります。
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
string filePath = "template.docx";
using WordprocessingDocument wordDoc =
WordprocessingDocument.Open(filePath, true);
var texts = wordDoc.MainDocumentPart!
.Document
.Descendants<Text>();
foreach (var text in texts)
{
if (text.Text.Contains("{{CustomerName}}"))
{
text.Text = text.Text.Replace("{{CustomerName}}", "山田太郎");
}
}
wordDoc.MainDocumentPart.Document.Save();
ただし、Word文書では1つの文字列が複数のRunやTextに分割されることがあります。その場合、単純なReplaceでは置換できません。実務では、プレースホルダーが分割されないようにテンプレートを作る、コンテンツコントロールを使う、DocXや商用ライブラリを使う、といった方法が有効です。
4-3. 表や画像を編集する方法
表を編集する場合は、文書内のTable要素を取得し、行やセルを追加・変更します。
C#var table = wordDoc.MainDocumentPart!
.Document
.Body!
.Descendants<Table>()
.FirstOrDefault();
if (table != null)
{
TableRow newRow = new TableRow();
newRow.Append(
new TableCell(new Paragraph(new Run(new Text("追加項目")))),
new TableCell(new Paragraph(new Run(new Text("10"))))
);
table.Append(newRow);
}
画像を編集する場合は、画像パーツを差し替える処理が必要です。既存の画像を単純に置換するだけなら、画像パーツのストリームを上書きする方法があります。ただし、画像サイズ、配置、リレーションIDなどを理解する必要があるため、初心者には少し難易度が高い処理です。
4-4. ヘッダー・フッターを編集する方法
ヘッダーやフッターは、本文とは別のパーツとして管理されています。Open XML SDKでは、HeaderPartやFooterPartを操作します。
たとえば、フッターに会社名やページ番号を入れる場合、フッターパーツを作成し、セクションプロパティに関連付けます。
実務では、ヘッダー・フッターを含むテンプレートWordを先に作成しておき、C#側では本文や差し込み部分だけを置換する方法が簡単です。すべてをコードでゼロから組み立てるより、テンプレート方式のほうが保守しやすくなります。
4-5. 編集後のWord文書を別名保存する方法
既存ファイルを直接編集すると、元ファイルが上書きされます。テンプレートを使う場合は、元ファイルをコピーしてから編集するのが安全です。
C#string templatePath = "template.docx";
string outputPath = "output.docx";
File.Copy(templatePath, outputPath, true);
using WordprocessingDocument wordDoc =
WordprocessingDocument.Open(outputPath, true);
// output.docxを編集する
この方法なら、テンプレートファイルを壊さずに、顧客別・日付別の文書を生成できます。
5. C#でPDF文書を作成する方法
5-1. PDF作成に使える代表的なライブラリ
C#でPDF文書を作成する代表的なライブラリには、PDFsharp、MigraDoc、iText、QuestPDF、商用PDFライブラリなどがあります。
PDFsharpは、PDFページに文字や図形を描画するタイプのライブラリです。単純なPDF作成やPDF結合に向いています。PDFsharp & MigraDoc Docs
iTextは、Javaと.NET向けに提供されているPDF SDKで、PDFの作成、操作、編集に対応した高機能なライブラリです。iTextpdf+1
QuestPDFは、C#のコードで保守しやすいPDFレイアウトを設計できるライブラリです。公式サイトでは、クリーンでメンテナンスしやすいC#コードで文書を設計できるPDF生成ライブラリとして紹介されています。questpdf.com+1
5-2. 新規PDFファイルを作成する基本手順
PDFsharpでPDFを作成する基本手順は、PDFドキュメントを作成し、ページを追加し、文字を描画して保存する流れです。
まずNuGetでPDFsharpを追加します。
C#dotnet add package PDFsharp
基本コードは次のようになります。
C#using PdfSharp.Pdf;
using PdfSharp.Drawing;
PdfDocument document = new PdfDocument();
document.Info.Title = "C# PDF Sample";
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Arial", 20);
gfx.DrawString("Hello PDF from C#", font, XBrushes.Black,
new XRect(0, 0, page.Width, page.Height),
XStringFormats.Center);
document.Save("sample.pdf");
このコードを実行すると、中央に文字が表示されたPDFが作成されます。
5-3. テキスト・画像・表をPDFに追加する方法
PDFにテキストを追加する場合は、座標を指定して文字を描画します。
C#gfx.DrawString("請求書", new XFont("Arial", 24), XBrushes.Black,
new XPoint(50, 80));
画像を追加する場合は、画像ファイルを読み込んで描画します。
C#XImage image = XImage.FromFile("logo.png");
gfx.DrawImage(image, 50, 100, 120, 60);
表を作る場合は、線と文字を組み合わせて描画します。
C#gfx.DrawRectangle(XPens.Black, 50, 180, 400, 30);
gfx.DrawString("商品名", new XFont("Arial", 12), XBrushes.Black,
new XPoint(60, 200));
gfx.DrawRectangle(XPens.Black, 50, 210, 400, 30);
gfx.DrawString("開発費", new XFont("Arial", 12), XBrushes.Black,
new XPoint(60, 230));
複雑な表や自動改ページを扱う場合は、PDFsharpだけで実装するより、MigraDocやQuestPDFのようなレイアウト機能を持つライブラリを検討するとよいでしょう。
5-4. フォントやレイアウトを調整する方法
PDFで日本語を扱う場合、フォント設定が非常に重要です。英数字だけならArialなどでも表示できますが、日本語を出力する場合は日本語フォントを指定し、ライブラリ側で埋め込みやフォント解決を適切に設定する必要があります。
日本語が文字化けする場合は、次の点を確認します。
日本語対応フォントを使っているか、フォントが実行環境に存在するか、PDFにフォントを埋め込んでいるか、LinuxやDocker環境で同じフォントが使えるか、ライブラリが日本語描画に対応しているかを確認しましょう。
レイアウトについては、余白、ページサイズ、行間、文字サイズ、表の幅、改ページ位置を明確に設計します。請求書や帳票のようなPDFでは、画面表示だけでなく印刷時の見え方も確認することが重要です。
5-5. 作成したPDFを保存・出力する方法
PDFを保存するには、Saveメソッドを使用します。
C#document.Save("output.pdf");
WebアプリでPDFをダウンロードさせる場合は、ファイルに保存せず、メモリストリームに出力してレスポンスとして返す方法もあります。
C#using MemoryStream stream = new MemoryStream();
document.Save(stream, false);
byte[] pdfBytes = stream.ToArray();
ASP.NET Coreでは、このバイト配列をFileメソッドで返すことで、PDFダウンロードを実装できます。
6. C#でPDF文書を編集する方法
6-1. 既存PDFを読み込む方法
PDFsharpで既存PDFを読み込む場合は、PdfReader.Openを使います。
C#using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
PdfDocument document = PdfReader.Open("input.pdf", PdfDocumentOpenMode.Modify);
編集用に開く場合はModify、結合やコピー用に開く場合はImportを使います。
6-2. PDF内のテキストを追加・編集する方法
PDFに新しいテキストを追加することは比較的簡単です。
C#PdfPage page = document.Pages[0];
XGraphics gfx = XGraphics.FromPdfPage(page);
gfx.DrawString("承認済み", new XFont("Arial", 16), XBrushes.Red,
new XPoint(400, 100));
document.Save("edited.pdf");
ただし、既存PDF内の文字をWordのように直接編集するのは簡単ではありません。PDFは見た目を固定する形式であり、テキストが段落構造として保持されているとは限らないためです。
既存文字の置換が必要な場合は、元データからPDFを再生成する、Wordテンプレートを編集してPDFに再変換する、高機能なPDF編集ライブラリを使用する、といった方法が現実的です。
6-3. ページの追加・削除・結合を行う方法
PDFにページを追加する場合は、AddPageを使用します。
C#PdfPage newPage = document.AddPage();
ページを削除する場合は、Pages.RemoveAtを使います。
C#document.Pages.RemoveAt(0);
複数PDFを結合する場合は、各PDFをImportモードで読み込み、ページを出力用PDFに追加します。
C#string[] files = { "a.pdf", "b.pdf", "c.pdf" };
PdfDocument output = new PdfDocument();
foreach (string file in files)
{
using PdfDocument input = PdfReader.Open(file, PdfDocumentOpenMode.Import);
for (int i = 0; i < input.PageCount; i++)
{
output.AddPage(input.Pages[i]);
}
}
output.Save("merged.pdf");
6-4. 画像や注釈を追加する方法
PDFに画像を追加する場合は、ページ上に画像を描画します。
C#PdfPage page = document.Pages[0];
XGraphics gfx = XGraphics.FromPdfPage(page);
XImage stamp = XImage.FromFile("stamp.png");
gfx.DrawImage(stamp, 400, 50, 100, 100);
document.Save("stamped.pdf");
注釈やスタンプを追加したい場合は、ライブラリが注釈機能に対応しているかを確認しましょう。単純に「承認済み」「社外秘」などの文字や画像を重ねるだけなら、描画処理で対応できます。
6-5. PDF編集時の注意点
PDF編集で注意したいのは、PDFは「再編集しやすい文書」ではなく「表示・印刷結果を固定する文書」だという点です。
そのため、既存PDFのテキスト置換、段落の再流し込み、表の再編集などは難しいことがあります。PDFを直接編集するより、元になるWord、HTML、データベース、テンプレートからPDFを再生成する設計にしたほうが安定します。
また、PDFによってはパスワード保護、印刷制限、編集制限、電子署名が設定されている場合があります。このようなPDFを扱う場合は、権限や法的な扱いにも注意が必要です。
7. C#でWordをPDFに変換する方法
7-1. WordからPDFへ変換する基本的な流れ
C#でWordをPDFに変換する基本的な流れは、Wordファイルを読み込み、PDF形式で保存するというものです。
代表的な方法は次の3つです。
Microsoft Office InteropでWordを起動してPDF保存する方法、商用ライブラリでWordをPDFに変換する方法、クラウドAPIや外部変換サービスを使う方法です。
デスクトップアプリで、利用者のPCにWordがインストールされている前提ならInteropでも対応できます。一方、Webアプリやサーバー処理では、Office Interopではなく、サーバー対応のライブラリを使うのが基本です。
7-2. 変換に対応したライブラリの選び方
WordからPDFへの変換では、変換精度が重要です。特に、表、画像、ヘッダー、フッター、ページ番号、脚注、縦書き、改ページ、フォント、図形、SmartArtなどを含む文書では、ライブラリによって結果が変わります。
選ぶときは、次の点を確認しましょう。
Officeなしで動作するか、サーバー利用に対応しているか、日本語フォントに対応しているか、レイアウト再現性が高いか、商用利用できるライセンスか、LinuxやDockerで動作するか、複数ファイルの一括変換に耐えられるか、エラー時のログが取りやすいかです。
WordからPDFへの変換は、単なるファイル形式変換ではなく、レイアウトエンジンの品質が結果に直結します。無料ライブラリだけで難しい場合は、有料ライブラリも検討する価値があります。
7-3. レイアウト崩れを防ぐポイント
WordからPDFへの変換でレイアウト崩れを防ぐには、テンプレート設計が重要です。
まず、使用フォントを統一します。変換環境に存在しないフォントを使うと、代替フォントに置き換わり、文字幅が変わってレイアウトが崩れます。
次に、余白、表幅、画像サイズ、改ページ位置を固定します。Word上で見た目が整っていても、変換ライブラリが解釈しにくい複雑な配置を使うと崩れることがあります。
また、テキストボックスや図形を多用しすぎないことも大切です。帳票テンプレートでは、表をベースにレイアウトを作ると比較的安定します。
7-4. 複数ファイルを一括変換する方法
複数のWordファイルをPDFに変換する場合は、フォルダ内の.docxファイルを列挙して順番に処理します。
C#string inputFolder = @"C:\Docs";
string outputFolder = @"C:\Pdfs";
foreach (string wordFile in Directory.GetFiles(inputFolder, "*.docx"))
{
string fileName = Path.GetFileNameWithoutExtension(wordFile);
string pdfPath = Path.Combine(outputFolder, fileName + ".pdf");
// ConvertWordToPdf(wordFile, pdfPath);
}
実務では、1件ずつ例外処理を行い、失敗したファイルだけログに残す設計にします。大量変換では、すべての処理を1回のtry-catchで囲むのではなく、ファイル単位で成功・失敗を記録することが重要です。
7-5. 変換処理でよくあるエラーと対処法
WordからPDFへの変換でよくあるエラーには、フォントが見つからない、ファイルが開けない、パスにアクセスできない、Wordがインストールされていない、変換ライブラリが特定の要素に対応していない、メモリ不足になる、などがあります。
対処法としては、フォントを変換環境にインストールする、ファイルパスを絶対パスにする、出力フォルダの権限を確認する、変換前にファイルの存在をチェックする、テンプレートを簡素化する、サーバー対応ライブラリを使う、ログを詳しく出力する、といった方法があります。
8. C# Document操作でよく使うライブラリ比較
8-1. Open XML SDKの特徴
Open XML SDKは、Microsoft Office形式のWord、Excel、PowerPoint文書を操作するための代表的なライブラリです。Open XML SDKはOffice文書の低レベル操作に対応しており、強く型付けされた.NET APIを使って文書を扱えます。NuGet+1
メリットは、Microsoft公式であること、Officeのインストールが不要であること、.docxを直接操作できることです。
デメリットは、文書構造の理解が必要で、初心者にはコードが複雑になりやすいことです。画像、スタイル、ヘッダー、フッター、箇条書き、表の詳細設定などを行うには、Open XMLの仕組みを理解する必要があります。
8-2. Microsoft Office Interopの特徴
Microsoft Office Interopは、C#からWordやExcelなどのOfficeアプリケーションを操作する方法です。Wordを実際に起動して処理するため、Wordの機能を利用しやすく、PDF保存も比較的簡単です。
ただし、サーバー環境では注意が必要です。Microsoftは、ASP.NET、DCOM、NT Serviceなどの非対話型環境からOfficeアプリケーションを自動化することを推奨・サポートしていません。Officeが不安定になったり、デッドロックしたりする可能性があるためです。マイクロソフト サポート+1
そのため、Interopは個人利用のデスクトップアプリや社内の限定的なツールでは候補になりますが、Webアプリ、API、Windowsサービス、バッチサーバーでは避けるのが基本です。
8-3. DocXの特徴
DocXは、Open XML SDKよりも簡単な記述でWord文書を操作しやすいライブラリです。段落追加、表作成、画像挿入、ヘッダー・フッター編集などを比較的直感的に扱えます。
初心者がC#でWord文書を作成したい場合、Open XML SDKの低レベルな構造に苦戦することがあります。そのような場合、DocXのような高レベルAPIを使うと、コードが読みやすくなります。
ただし、ライブラリのバージョンやライセンス、対応機能は必ず確認しましょう。商用利用やPDF変換が必要な場合は、無料版だけで対応できるかを事前に検証することが重要です。
8-4. PDFsharp・iText系ライブラリの特徴
PDFsharpは、シンプルなPDF作成やPDF結合に向いています。座標指定で文字や画像を描画する処理が得意です。一方、複雑なレイアウトや自動改ページには工夫が必要です。PDFsharp & MigraDoc Docs
iTextは、高機能なPDFライブラリで、PDFの作成、編集、結合、フォーム、電子署名、PDF/Aなど幅広い用途に対応できます。機能が豊富な分、ライセンス条件の確認が重要です。iTextpdf+1
QuestPDFは、C#のFluent APIで文書レイアウトを組み立てられるため、請求書や帳票のようなPDF生成に向いています。コードの可読性を重視したい場合に検討しやすいライブラリです。questpdf.com
8-5. 商用ライブラリを使うメリット・デメリット
商用ライブラリのメリットは、機能が豊富で、サポートがあり、WordからPDFへの変換精度が高いことです。帳票、契約書、請求書、申込書などを業務システムで安定して生成する場合、商用ライブラリのほうが結果的に開発コストを抑えられることがあります。
デメリットは、ライセンス費用がかかることです。また、開発者数、サーバー数、配布形態、SaaS利用などによって料金体系が変わる場合があります。
実務では、無料ライブラリでプロトタイプを作り、要件が複雑なら商用ライブラリを検討する流れが現実的です。
8-6. 初心者におすすめのライブラリ選定基準
初心者がC# Document操作を始めるなら、目的別に選ぶとわかりやすいです。
Word文書を作成したいなら、まずOpen XML SDKまたはDocXを検討します。Microsoft公式の仕組みを学びたいならOpen XML SDK、簡単なAPIで始めたいならDocXが向いています。
PDFを作成したいなら、シンプルな描画はPDFsharp、帳票レイアウトをコードで組みたいならQuestPDF、PDF機能を広く扱いたいならiTextが候補です。
WordからPDFへの変換を重視するなら、変換精度が重要になるため、商用ライブラリも含めて比較しましょう。
9. C# Document操作の実践サンプルコード
9-1. Word文書を新規作成するサンプルコード
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
string filePath = "invoice.docx";
using WordprocessingDocument wordDoc =
WordprocessingDocument.Create(filePath, DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
mainPart.Document = new Document(new Body());
Body body = mainPart.Document.Body!;
body.Append(new Paragraph(new Run(new Text("請求書"))));
body.Append(new Paragraph(new Run(new Text("株式会社サンプル 御中"))));
body.Append(new Paragraph(new Run(new Text("下記の通りご請求申し上げます。"))));
Table table = new Table();
TableRow header = new TableRow();
header.Append(
new TableCell(new Paragraph(new Run(new Text("項目")))),
new TableCell(new Paragraph(new Run(new Text("金額"))))
);
TableRow row = new TableRow();
row.Append(
new TableCell(new Paragraph(new Run(new Text("システム開発費")))),
new TableCell(new Paragraph(new Run(new Text("100,000円"))))
);
table.Append(header);
table.Append(row);
body.Append(table);
mainPart.Document.Save();
このサンプルでは、請求書風のWord文書を作成しています。実務では、宛名、金額、日付などをデータベースから取得して差し込む形にすると便利です。
9-2. Word文書の文字列を置換するサンプルコード
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
string templatePath = "template.docx";
string outputPath = "output.docx";
File.Copy(templatePath, outputPath, true);
using WordprocessingDocument wordDoc =
WordprocessingDocument.Open(outputPath, true);
var texts = wordDoc.MainDocumentPart!
.Document
.Descendants<Text>();
foreach (var text in texts)
{
text.Text = text.Text.Replace("{{CompanyName}}", "株式会社サンプル");
text.Text = text.Text.Replace("{{CustomerName}}", "山田太郎");
text.Text = text.Text.Replace("{{Amount}}", "100,000円");
}
wordDoc.MainDocumentPart.Document.Save();
この方法は、テンプレート内のプレースホルダーが1つのText要素に収まっている場合に有効です。置換できない場合は、Word側でプレースホルダーを入力し直す、装飾を途中で変えない、コンテンツコントロールを使うなどの対策を行います。
9-3. PDF文書を新規作成するサンプルコード
C#using PdfSharp.Pdf;
using PdfSharp.Drawing;
PdfDocument document = new PdfDocument();
document.Info.Title = "Invoice PDF";
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont titleFont = new XFont("Arial", 24);
XFont bodyFont = new XFont("Arial", 12);
gfx.DrawString("INVOICE", titleFont, XBrushes.Black, new XPoint(50, 80));
gfx.DrawString("Customer: Sample Company", bodyFont, XBrushes.Black, new XPoint(50, 130));
gfx.DrawString("Amount: 100,000 JPY", bodyFont, XBrushes.Black, new XPoint(50, 160));
document.Save("invoice.pdf");
日本語を出力する場合は、日本語フォントの設定が必要です。文字化けする場合は、フォントの存在や埋め込み設定を確認しましょう。
9-4. 複数PDFを結合するサンプルコード
C#using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
string[] pdfFiles =
{
"part1.pdf",
"part2.pdf",
"part3.pdf"
};
PdfDocument outputDocument = new PdfDocument();
foreach (string file in pdfFiles)
{
using PdfDocument inputDocument =
PdfReader.Open(file, PdfDocumentOpenMode.Import);
for (int i = 0; i < inputDocument.PageCount; i++)
{
outputDocument.AddPage(inputDocument.Pages[i]);
}
}
outputDocument.Save("merged.pdf");
PDF結合は、契約書の本体と別紙、請求書と明細、申請書と添付資料をまとめる処理などでよく使われます。
9-5. WordをPDFに変換するサンプルコード
Microsoft Office Interopを使う場合、WordがインストールされたWindows環境で次のように変換できます。
C#using Word = Microsoft.Office.Interop.Word;
string inputPath = Path.GetFullPath("input.docx");
string outputPath = Path.GetFullPath("output.pdf");
Word.Application app = new Word.Application();
try
{
Word.Document doc = app.Documents.Open(inputPath);
doc.ExportAsFixedFormat(
outputPath,
Word.WdExportFormat.wdExportFormatPDF
);
doc.Close(false);
}
finally
{
app.Quit();
}
この方法はWordアプリケーションを使用するため、サーバーサイド処理には向いていません。WebアプリやバッチサーバーでWordからPDFへ変換する場合は、Officeに依存しないライブラリを選ぶのが安全です。Microsoftも、非対話型のサーバー環境からOfficeアプリケーションを自動化することを推奨・サポートしていません。マイクロソフト サポート
10. C# Document操作で発生しやすいエラーと解決策
10-1. ファイルが開けない・保存できない場合
ファイルが開けない、保存できない場合は、まずパスを確認します。相対パスを使っている場合、実行時のカレントディレクトリが想定と違うことがあります。
対策として、Path.GetFullPathで絶対パスを確認しましょう。
C#Console.WriteLine(Path.GetFullPath("sample.docx"));
また、出力先フォルダが存在しない場合も保存に失敗します。
C#Directory.CreateDirectory("output");
さらに、対象ファイルをWordやPDFビューアで開いたままにしていると、ファイルロックで保存できないことがあります。編集前にファイルを閉じるか、別名で保存しましょう。
10-2. 日本語フォントが文字化けする場合
PDFで日本語が文字化けする場合、原因の多くはフォントです。日本語に対応していないフォントを指定している、実行環境にフォントがない、PDFにフォントが埋め込まれていない、といったケースがあります。
Windows環境では表示できても、LinuxやDocker環境では同じフォントが存在しないことがあります。サーバー環境でPDFを生成する場合は、使用する日本語フォントを明確に決め、環境ごとに利用できるように設定しましょう。
Word文書の場合も、変換先の環境にフォントがないとPDF変換時にレイアウトが崩れることがあります。
10-3. PDF変換時にレイアウトが崩れる場合
PDF変換時にレイアウトが崩れる場合は、フォント、余白、表幅、画像サイズ、改ページ、テキストボックスの使用状況を確認します。
特に日本語文書では、フォントの置き換えによって文字幅が変わり、行末やページ区切りがずれることがあります。
対策として、テンプレートで使うフォントを統一する、変換環境に同じフォントを入れる、複雑な図形配置を避ける、表ベースのレイアウトにする、変換ライブラリを変更して比較する、といった方法があります。
10-4. ライブラリの参照エラーが出る場合
DocumentFormat.OpenXmlやPdfSharpなどの名前空間が見つからない場合は、NuGetパッケージが追加されていない可能性があります。
C#dotnet add package DocumentFormat.OpenXml
dotnet add package PDFsharp
Visual Studioを使っている場合は、NuGetパッケージマネージャーから対象パッケージをインストールします。
また、古いサンプルコードと現在のライブラリバージョンでAPIが変わっている場合もあります。エラーが出たら、使用しているライブラリのバージョンと公式ドキュメントを確認しましょう。
10-5. Officeがインストールされていない環境で動かない場合
Microsoft Office Interopを使ったコードは、基本的にOfficeがインストールされた環境で動作します。そのため、サーバーやDocker、Linux環境では動かないことがあります。
OfficeなしでWord文書を作成・編集したい場合は、Open XML SDK、DocX、商用ライブラリなどを使用します。
OfficeなしでPDFを作成したい場合は、PDFsharp、QuestPDF、iTextなどを検討します。
サーバー環境でDocument操作を行う場合は、「Officeをインストールして自動操作する」のではなく、「Officeに依存しないライブラリで文書を生成する」設計にするのが基本です。
11. C# Document操作を実務で使うときの注意点
11-1. サーバー環境でOffice Interopを避けるべき理由
サーバー環境でOffice Interopを避けるべき理由は、安定性、同時実行性、セキュリティ、保守性に問題が出やすいためです。
Officeアプリケーションは、ユーザーが画面上で操作することを前提に設計されています。サーバー上で非対話的に動かすと、ダイアログが表示されたまま処理が止まる、Wordプロセスが残る、同時実行で競合する、権限エラーが出る、といった問題が起きる可能性があります。
Microsoftの公式情報でも、Officeアプリケーションのサーバーサイドオートメーションは推奨・サポートされていないと説明されています。マイクロソフト サポート+1
11-2. ライセンス確認の重要性
C# Document操作でライブラリを使う場合、ライセンス確認は必須です。
無料で使えるように見えるライブラリでも、商用利用、SaaS利用、社内配布、再配布、サーバー利用では条件が変わる場合があります。
特にiTextなどの高機能ライブラリや商用ライブラリを使う場合は、ライセンス形態を事前に確認しましょう。後からライセンス違反が判明すると、システム改修や契約見直しが必要になる可能性があります。
11-3. 大量ファイル処理時のパフォーマンス対策
大量のWordやPDFを処理する場合は、メモリ使用量とファイルI/Oに注意します。
1万件のPDFを一括生成するような処理では、すべてをメモリに保持せず、1件ずつ生成して保存する設計にします。処理後はusingで確実にリソースを解放しましょう。
また、並列処理を行う場合は、ライブラリがスレッドセーフかどうかを確認します。無理に並列化すると、ファイルロックやメモリ不足が起きることがあります。
ログには、処理対象ファイル、出力先、処理時間、エラー内容を記録しておくと、障害対応がしやすくなります。
11-4. セキュリティとファイル権限の注意点
Document操作では、ユーザーがアップロードしたファイルを扱うことがあります。この場合、ファイル名、拡張子、サイズ、保存先、アクセス権限に注意が必要です。
アップロードファイルをそのまま任意のパスに保存すると、意図しないファイル上書きやパストラバーサルのリスクがあります。ファイル名はサーバー側で安全な名前に変換し、保存先ディレクトリを限定しましょう。
また、Word文書にはマクロが含まれる場合があります。ライブラリによってはマクロを実行しないものもありますが、ユーザーから受け取った文書を扱う場合は、セキュリティ要件を明確にしておく必要があります。
11-5. 保守しやすいDocument処理コードの書き方
Document処理のコードは、最初は簡単でも、要件追加によって複雑になりやすいです。
保守しやすくするには、文書生成ロジックを1つのクラスにまとめる、テンプレートとデータを分離する、ファイルパスを設定ファイルで管理する、置換キーを定数化する、エラー処理とログ出力を共通化する、といった設計が有効です。
また、Document生成結果は目視確認が必要になりがちです。単体テストでは、ファイルが作成されること、ページ数、主要テキスト、ファイルサイズなどを確認し、最終的なレイアウトはサンプル出力で確認する運用にするとよいでしょう。
12. C# Documentに関するよくある質問
12-1. C#だけでWord文書を作成できますか?
はい、C#だけでWord文書を作成できます。ただし、標準ライブラリだけで高度なWord文書を作るのは難しいため、Open XML SDKやDocXなどのライブラリを使うのが一般的です。
Officeをインストールしなくても、.docxファイルを作成・編集できるライブラリがあります。サーバー環境では、Office Interopではなく、Officeに依存しないライブラリを選ぶのがおすすめです。
12-2. C#でPDFを直接編集できますか?
はい、C#でPDFを直接編集することは可能です。PDFsharpやiTextなどを使えば、ページの追加、結合、文字や画像の追加などができます。
ただし、既存PDF内の文章をWordのように自由に編集するのは難しい場合があります。PDFは表示・印刷用の固定レイアウト形式なので、元データから再生成する設計のほうが安定するケースが多いです。
12-3. 無料で使えるDocument操作ライブラリはありますか?
あります。Word文書ならOpen XML SDK、PDF文書ならPDFsharpやQuestPDFなどが候補になります。
ただし、無料ライブラリでもライセンス条件は必ず確認してください。商用利用、SaaS提供、再配布、社内システム利用などで条件が変わる場合があります。
12-4. WordをPDFに変換するにはOfficeが必要ですか?
Office Interopを使ってWordをPDFに変換する場合は、Wordがインストールされている必要があります。
一方、商用ライブラリや一部のDocumentライブラリを使えば、OfficeをインストールせずにWordからPDFへ変換できる場合があります。
サーバー環境では、Office Interopではなく、Officeに依存しない変換ライブラリを使うのが基本です。
12-5. 初心者はどのライブラリから使うべきですか?
Word文書を作成したい初心者は、まずOpen XML SDKまたはDocXから始めるとよいでしょう。Microsoft公式の仕組みを理解したいならOpen XML SDK、簡単なAPIで実装したいならDocXが向いています。
PDF文書を作成したい初心者は、シンプルなPDFならPDFsharp、帳票や請求書のようなレイアウトをきれいに作りたいならQuestPDFを検討するとよいでしょう。
WordからPDFへの変換や複雑な業務帳票を扱う場合は、最初から商用ライブラリを含めて比較するのがおすすめです。
まとめ
C# Documentとは、C#でWord、PDF、テキストなどの文書を作成・編集・変換する処理全般を指します。Word文書を扱う場合はOpen XML SDKやDocX、PDF文書を扱う場合はPDFsharp、iText、QuestPDFなどが代表的な選択肢です。
Wordは編集しやすい文書形式であり、テンプレート差し込みや契約書作成に向いています。PDFは見た目を固定しやすく、請求書、帳票、配布資料に向いています。
初心者は、まず「Wordを作りたいのか」「PDFを作りたいのか」「既存文書を編集したいのか」「WordをPDFに変換したいのか」を明確にしましょう。そのうえで、目的に合ったライブラリを選ぶことが重要です。
実務でC# Document操作を使う場合は、サーバー環境でOffice Interopを避ける、ライセンスを確認する、日本語フォントを正しく設定する、大量処理時のパフォーマンスを考慮する、テンプレートとデータを分離する、といった点に注意しましょう。
C#でDocument操作を身につけると、請求書、見積書、契約書、レポート、PDF帳票などの自動生成が可能になります。手作業の文書作成を減らし、業務効率化やシステムの品質向上につなげられる重要な技術です。

