テキスト抽出
テキスト抽出
Aspose.PDF FOSS for .NET は PDF ページからテキストを抽出するためのいくつかのメカニズムを提供します。TextFragmentAbsorber は主要なツールで、ページ内容をスキャンし、位置、フォント、スタイル情報を含む構造化された TextFragment オブジェクトを返します。
基本的なテキスト抽出
TextAbsorber はページまたはドキュメントからすべてのテキストを単一の文字列として抽出します。
using var doc = Document.Open(pdfBytes);
var absorber = new TextAbsorber();
doc.Pages[1].Accept(absorber);
string pageText = absorber.Text;テキストフラグメントの抽出
TextFragmentAbsorber は構造化された結果を提供します。各 TextFragment には抽出されたテキスト、そのページ上の位置、フォントの詳細が含まれます。
using var doc = Document.Open(pdfBytes);
var absorber = new TextFragmentAbsorber();
doc.Pages[1].Accept(absorber);
foreach (var fragment in absorber.TextFragments)
{
Console.WriteLine($"Text: {fragment.Text}");
Console.WriteLine($"Position: ({fragment.Position.XIndent}, {fragment.Position.YIndent})");
Console.WriteLine($"Font: {fragment.TextState.Font.FontName}");
}正規表現による検索
TextFragmentAbsorberに正規表現パターンを渡して特定のテキストを検索します。
var absorber = new TextFragmentAbsorber(@"\d{3}-\d{2}-\d{4}");
doc.Pages.Accept(absorber); // Search all pages
foreach (var fragment in absorber.TextFragments)
{
Console.WriteLine($"Found: {fragment.Text}");
}テキスト セグメント
テキストが異なるフォントランにまたがる場合、各TextFragmentは複数のTextSegmentオブジェクトを含むことがあります。
foreach (var fragment in absorber.TextFragments)
{
foreach (var segment in fragment.Segments)
{
Console.WriteLine($"Segment: {segment.Text}, Font: {segment.TextState.Font.FontName}");
}
}フォント管理
FontRepository はフォントを検索し、ロードするためのメソッドを提供します。
var font = FontRepository.FindFont("Helvetica");テキスト段落の作成
TextParagraph は、ページへの挿入用に複数行のテキストブロックを構築することを可能にします。
var paragraph = new TextParagraph();
paragraph.AppendLine(new TextFragment("First line"));
paragraph.AppendLine(new TextFragment("Second line"));ヒントとベストプラクティス
- 位置とフォントデータが必要な場合は
TextFragmentAbsorberを使用し、プレーンテキスト抽出にはTextAbsorberを使用します。 - より高速な結果を得るために、単一ページで absorber を受け入れるか、文書全体を検索する場合は
doc.Pagesを使用します。 - 正規表現検索はデフォルトで大文字小文字を区別します — 大文字小文字を区別しないマッチングには
(?i)プレフィックスを使用してください。 - フォントが PDF に埋め込まれているかどうかを判断するには
TextState.Font.IsEmbeddedを確認してください。 - 大きな文書の場合、メモリ使用量を管理するためにページを1つずつ処理してください。
一般的な問題
| Issue | Cause | Fix |
|---|---|---|
| 抽出されたテキストが文字化けしています | PDF が非標準のエンコーディングまたは CID フォントマッピングを使用しています | フォントの埋め込みを確認してください。スキャンされた PDF の一部は OCR が必要です |
| テキストフラグメントが見つかりません | ページの内容が画像であり、テキストではありません | OCR ツールを使用して画像ページをテキストに変換してください |
| Regex が一致しません | パターンが PDF テキストレイアウトによって挿入される空白を考慮していません | 空白を正規化するか、より緩いパターンを使用してください |
TextState.Font が null です | PDF からフォントリソースが欠落しています | フォントプロパティを検査する際に null チェックを行ってください |
よくある質問
ページの特定の領域からテキストを抽出できますか?
はい。TextFragmentAbsorber.TextSearchOptions.Rectangle を設定して、検索をページの特定領域に限定します。
テキスト抽出は読み順を保持しますか?
ライブラリはテキストをコンテンツストリームの順序で返します。マルチカラムレイアウトの場合、フラグメントを位置でソートする必要があるかもしれません。
すべてのページから一度にテキストを抽出できますか?
はい。doc.Pages.Accept(absorber) を呼び出して、ドキュメント内のすべてのページを検索します。
API リファレンス概要
| Class / Method | Description |
|---|---|
TextAbsorber | すべてのテキストを単一の文字列として抽出します |
TextFragmentAbsorber | 位置と Font データを含む構造化テキストフラグメントを抽出します |
TextFragment | 位置、テキスト状態、セグメントを持つテキストラン |
TextFragment.Text | 抽出されたテキスト文字列 |
TextFragment.Position | ページ上の座標 |
TextFragment.TextState | Font、size、color の情報 |
TextFragment.Segments | フラグメント内のサブラン |
TextParagraph | 複数行テキストブロック用ビルダー |
TextState | Font 名、size、color、style プロパティ |
FontRepository | 静的 Font ルックアップとロード |
FontRepository.FindFont | 名前で Font を検索 |