文本提取
文本提取
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 中。 - 对于大型文档,请一次处理一页以管理内存使用。
常见问题
| Issue | Cause | Fix |
|---|---|---|
| 提取的文本乱码 | PDF 使用了非标准编码或 CID 字体映射 | 检查字体嵌入;某些扫描的 PDF 需要 OCR |
| 未找到文本片段 | 页面内容是图像,而非文本 | 首先使用 OCR 工具将图像页面转换为文本 |
| 正则表达式未返回匹配项 | 模式未考虑 PDF 文本布局插入的空白 | 规范化空白或使用更宽松的模式 |
TextState.Font 为 null | PDF 中缺少字体资源 | 检查字体属性时进行 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 | 按名称查找字体 |