文本提取

文本提取

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
  • 在单页上接受吸收器以获得更快的结果,或在 doc.Pages 上搜索整个文档。
  • 正则表达式搜索默认区分大小写 — 使用 (?i) 前缀进行不区分大小写的匹配。
  • 检查 TextState.Font.IsEmbedded 以确定字体是否嵌入在 PDF 中。
  • 对于大型文档,请一次处理一页以管理内存使用。

常见问题

IssueCauseFix
提取的文本乱码PDF 使用了非标准编码或 CID 字体映射检查字体嵌入;某些扫描的 PDF 需要 OCR
未找到文本片段页面内容是图像,而非文本首先使用 OCR 工具将图像页面转换为文本
正则表达式未返回匹配项模式未考虑 PDF 文本布局插入的空白规范化空白或使用更宽松的模式
TextState.Font 为 nullPDF 中缺少字体资源检查字体属性时进行 null 检查

常见问题

我可以从页面的特定区域提取文本吗?

是的。设置 TextFragmentAbsorber.TextSearchOptions.Rectangle 将搜索限制在页面的特定区域。

文本提取是否保留阅读顺序?

库返回的文本按内容流顺序。对于多列布局,您可能需要按位置对片段进行排序。

我可以一次提取所有页面的文本吗?

是的。调用 doc.Pages.Accept(absorber) 在文档中搜索每一页。


API 参考摘要

类 / 方法描述
TextAbsorber将所有文本提取为单个字符串
TextFragmentAbsorber提取带有位置和字体数据的结构化文本片段
TextFragment包含位置、文本状态和段落的文本运行
TextFragment.Text提取的文本字符串
TextFragment.Position页面上的坐标
TextFragment.TextState字体、大小和颜色信息
TextFragment.Segments片段内的子运行
TextParagraph多行文本块的构建器
TextState字体名称、大小、颜色和样式属性
FontRepository静态字体查找和加载
FontRepository.FindFont按名称查找字体

另见

 中文