更新
2014 年 2 月 27 日: この記事は当初、PDFBox を使用して PDF ファイルを解析することについてのみ説明していました。これは、IFilter と iTextSharp を使用するためのルーチンを含むように拡張されました。
この記事と対応する Visual Studio プロジェクトは、PDFBox の最新バージョン (1.8.4) に更新されました。すべての依存関係を含む完全なプロジェクトは、http://www.squarepdf.net/how-to-convert-pdf-to-text-in-net-sample-project/ からダウンロードできます (依存関係の削除は少し注意が必要です)。
PDF ファイルを解析する方法
.NET で PDF ファイルからテキストを抽出する主な方法は次のとおりです。
Microsoft の IFilter インターフェイスと Adobe の IFilter 実装。
残念ながら、これらの PDF 解析ソリューションはどれも完璧ではありません。これらの方法については以下で説明します。
Adobe PDF IFilter
IFilter インターフェイスを使用して PDF ファイルを解析するには、次のものが必要です:
Windows 2000 以降
Adobe Acrobat または Reader 7.0.5+ (またはスタンドアロン Adobe PDF IFilter [adobe.com])
IFilter COM カプセル化クラス [dotlucene.net]
サンプル コード:
using IFilter; // ... public static string ExtractTextFromPdf(string path) { return DefaultParser.Extract(path); }
短所:
IFilter インターフェイスを処理するために信頼性の低い COM 相互運用機能を使用します (IFilter COM と Adobe PDF IFilter を組み合わせるのは特に面倒です)。
ターゲット システムに Adobe IFilter を個別にインストールする必要があります。インデックス可能なソリューションを他の人に公開する必要がある場合、それは面倒です。
iTextSharp
iTextSharp (http://sourceforge.net/projects/itextsharp/) は、Java PDF 操作ライブラリ iText (http://itextpdf.com/) .NET 出力です。主に PDF を読み取ることよりも編集することに重点を置いていますが、確かに PDF からのテキストの抽出もサポートしています (少しやりすぎですが)。
ルーチン:
using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; // ... public static string ExtractTextFromPdf(string path) { using (PdfReader reader = new PdfReader(path)) { StringBuilder text = new StringBuilder(); for (int i = 1; i <= reader.NumberOfPages; i++) { text.Append(PdfTextExtractor.GetTextFromPage(reader, i)); } return text.ToString(); } }
クレジット: 会員番号 10364982
短所:
ライセンスが必要(AGPLライセンスが気に入らない場合)
PDFBox
PDFBoxは、別のJava PDFクラスライブラリです。オリジナルの Java Lucene と一緒に使用することもできます (LucenePDFDocument を参照)。
幸いなことに、PDFBox には IKVM.NET を使用して開発された .NET バージョンがあります (PDFBox ダウンロード ページにアクセスしてください)。
.NET で PDFBox を使用するには、引用符で囲む必要があります:
IKVM.OpenJDK.Core.dll
IKVM.OpenJDK.SwingAWT.dll
pdfbox-1.8.4.dll
そして、次のファイルを bin フォルダーにコピーします。
commons-logging.dllfontbox-1.8.4.dllIKVM.OpenJDK.Util.dllIKVM.Runtime.dll PDFBoxを使用してPDFを解析するのは非常に簡単です:using org.apache.pdfbox.pdmodel; using org.apache.pdfbox.util; // ... private static string ExtractTextFromPdf(string path) { PDDocument doc = null; try { doc = PDDocument.load(path) PDFTextStripper stripper = new PDFTextStripper(); return stripper.getText(doc); } finally { if (doc != null) { doc.close(); } } }