PDF は文書の共有や保存に広く使われている形式だが、その内容を再利用したり編集したりする場面では扱いにくいことがある。特に技術文書やマニュアルを Markdown 形式で管理したい場合、PDF から手作業でテキストをコピーするのは現実的ではない。
本記事では、C# で Spire.PDF for .NET を使用して PDF ファイルを Markdown(.md)形式に変換する手順を解説する。変換された Markdown ファイルには、元の PDF のテキスト構造や見出し情報がある程度保持される。
環境準備
Spire.PDF for .NET は NuGet パッケージとして提供されている。Visual Studio のパッケージマネージャーコンソール、または .NET CLI からインストールできる。
# Package Manager Console
PM> Install-Package Spire.PDF
# .NET CLI
dotnet add package Spire.PDF
Free Spire.PDF for .NET には制限がある。PDF ドキュメントのロードは 10 ページまで、各種形式へのエクスポートは最初の 3 ページのみが処理される。これを超えるページ数を扱う場合は商用ライセンスの確認が必要となる。
PDF を Markdown に変換するコード
PDF から Markdown への変換は、PdfDocument クラスの SaveToFile() メソッドを使用して行う。この機能は Spire.PDF for .NET のバージョン 10.6.7 以降でサポートされている。
以下が基本的な変換コードである。
using System;
using Spire.Pdf;
namespace PDFToMarkdown
{
class Program
{
static void Main(string[] args)
{
// PdfDocument インスタンスを生成
PdfDocument pdf = new PdfDocument();
// 変換元の PDF ファイルをロード
pdf.LoadFromFile("Sample.pdf");
// Markdown 形式で保存
pdf.SaveToFile("output/PDFToMarkdown.md", FileFormat.Markdown);
// リソースを解放
pdf.Close();
Console.WriteLine("変換が完了しました。");
}
}
}
処理の流れは次の通りである。まず PdfDocument のインスタンスを生成し、LoadFromFile() メソッドで変換元の PDF をロードする。次に SaveToFile() メソッドの第 2 引数に FileFormat.Markdown を指定して呼び出すことで、Markdown ファイルとして出力される。処理後は Close() を呼び出してリソースを解放することが推奨される。
ストリームを使用した変換
ファイルを直接読み込む方法以外に、ストリームを使用した変換もサポートされている。LoadFromStream() メソッドでストリームから PDF を読み込み、SaveToStream() メソッドで Markdown のストリームに変換する。
using System.IO;
using System.Net.Http;
using Spire.Pdf;
namespace PDFToMarkdownByStream
{
class Program
{
static async Task Main(string[] args)
{
// PdfDocument インスタンスを生成
PdfDocument pdf = new PdfDocument();
using (HttpClient client = new HttpClient())
{
// URL から PDF をバイト配列としてダウンロード
byte[] pdfBytes = await client.GetByteArrayAsync("http://example.com/Sample.pdf");
using (MemoryStream inputStream = new MemoryStream(pdfBytes))
{
// ストリームから PDF をロード
pdf.LoadFromStream(inputStream);
using (MemoryStream outputStream = new MemoryStream())
{
// Markdown ファイルストリームに変換
pdf.SaveToStream(outputStream, FileFormat.Markdown);
outputStream.Position = 0; // 後続の読み取りのために位置をリセット
// ファイルに書き出すなど、用途に応じて処理
File.WriteAllBytes("output.md", outputStream.ToArray());
}
}
}
// リソースを解放
pdf.Close();
}
}
}
ストリームを使用する方法は、ネットワーク経由で取得した PDF データを直接変換する場合や、メモリ上で処理を完結させたい場合に適している。
変換品質に関する注意点
PDF から Markdown への変換は、PDF の内部構造を解析してテキストや見出し情報を抽出し、Markdown の構文に再構築する処理である。変換結果は元の PDF の構造に依存する。
レイアウトの再現性:PDF は固定レイアウト形式であり、テキストの位置情報を基に文書が構成されている。Markdown はフロー形式のため、元の PDF の複雑な段組みや表組みが完全に再現されるとは限らない。特に複数列のレイアウトや、テキストボックスを多用したデザインの PDF では、変換後に手動での整形が必要になる場合がある。
見出しの検出:Markdown の見出し(# 記号)は、PDF 内のフォントサイズやスタイル情報を基に推定される。元の PDF で見出しとして明確に定義されていないテキストは、正しく見出しとして認識されない可能性がある。
画像の扱い:デフォルトでは PDF 内の画像は Markdown ファイルに埋め込まれない。画像を含む PDF を変換する場合、画像データは失われる点に留意されたい。
Free Spire.PDF for .NET の制限
Free Spire.PDF for .NET には以下の制限がある。
- PDF ドキュメントのロード:10 ページまで
- 各種形式へのエクスポート:最初の 3 ページのみ
これらの制限はファイルの読み込みおよび変換時に適用される。制限を超えるドキュメントを扱う場合は商用ライセンスの購入が必要となる。
まとめ
本記事では、Spire.PDF for .NET の PdfDocument.SaveToFile() メソッドを使用して、PDF ファイルを Markdown 形式に変換する手順を示した。基本的な変換は数行のコードで実装でき、ファイルパスを直接指定する方法とストリームを経由する方法の両方が利用できる。
PDF から Markdown への変換は、固定レイアウト形式からフロー形式への変換であるため、元の PDF の構造が複雑な場合は変換結果にばらつきが生じる可能性がある。変換後は必ず内容を確認し、必要に応じて手動での調整を行うことが望ましい。