Guides
页面文本提取
ComPDF Flutter SDK 提供页面文本接口,用于从指定 PDF 页面中提取文本内容。你可以获取整页文本、矩形区域内的文本、页面文本行集合,也可以根据某一行的位置信息获取对应行文本。
获取整页文本
使用 getAllText() 获取当前页面的全部文本。
dart
final CPDFPage page = document.pageAtIndex(0);
final String text = await page.getAllText();
print('Page text: $text');如果页面没有文本层,例如扫描件图片 PDF,结果通常为空字符串。
获取矩形区域内文本
使用 getTextInRect(rect) 获取页面指定矩形范围内的文本。
dart
final CPDFPage page = document.pageAtIndex(0);
const CPDFRectF rect = CPDFRectF(
left: 40,
top: 760,
right: 560,
bottom: 680,
);
final String text = await page.getTextInRect(rect);
print('Text in rectangle: $text');rect 使用 CPDFRectF 结构,坐标为页面坐标:
dart
const CPDFRectF rect = CPDFRectF(
left: 40,
top: 760,
right: 560,
bottom: 680,
);获取页面文本行
使用 getTextLines() 获取当前页面的文本行集合。
dart
final CPDFPage page = document.pageAtIndex(0);
final List<CPDFTextLine> lines = await page.getTextLines();
print('Line count: ${lines.length}');每个文本行使用 CPDFTextLine 表示:
dart
class CPDFTextLine {
final int pageIndex;
final int lineIndex;
final int location;
final int length;
final CPDFRectF rect;
}字段说明:
| 字段 | 说明 |
|---|---|
pageIndex | 行所在页面索引,从 0 开始 |
lineIndex | 行在当前页面文本行集合中的索引,从 0 开始 |
location | 行文本在页面文本中的起始字符位置 |
length | 行文本字符长度 |
rect | 行在页面坐标系中的矩形范围。它使用与 CPDFReaderWidgetController.setDisplayPageIndex(rectList: ...) 一致的 CPDFRectF 格式 |
获取指定行文本
使用 getTextByLine(line) 获取某个文本行对应的实际文本。
dart
final CPDFPage page = document.pageAtIndex(0);
final List<CPDFTextLine> lines = await page.getTextLines();
if (lines.isNotEmpty) {
final String firstLineText = await page.getTextByLine(lines.first);
print('First line: $firstLineText');
}传入的 line 应来自同一页面的 getTextLines() 返回结果。如果将其他页面的 line 传给当前页面,接口会返回平台错误。
在 CPDFReaderWidget 中高亮文本行
当你使用 CPDFReaderWidget 时,可以将 CPDFTextLine.rect 传给 setDisplayPageIndex(rectList:),在阅读器视图中高亮对应文本行。
dart
final int pageIndex = await controller.getCurrentPageIndex();
final CPDFPage page = controller.document.pageAtIndex(pageIndex);
final List<CPDFTextLine> lines = await page.getTextLines();
if (lines.isNotEmpty) {
final CPDFTextLine firstLine = lines.first;
final String text = await page.getTextByLine(firstLine);
await controller.setDisplayPageIndex(
pageIndex: firstLine.pageIndex,
rectList: [firstLine.rect],
);
print('Highlighted text: $text');
}这个能力适用于需要将提取结果与页面位置进行对照的场景。
完整示例
下面示例演示如何一次性读取整页文本、矩形区域文本、页面行数量和第一行文本。
dart
import 'package:compdfkit_flutter/document/cpdf_document.dart';
import 'package:compdfkit_flutter/page/cpdf_page.dart';
import 'package:compdfkit_flutter/page/cpdf_text_line.dart';
import 'package:compdfkit_flutter/util/cpdf_rectf.dart';
Future<void> extractPageText(String filePath) async {
final CPDFDocument document = await CPDFDocument.createInstance();
await document.open(filePath);
final CPDFPage page = document.pageAtIndex(0);
final String allText = await page.getAllText();
const CPDFRectF rect = CPDFRectF(
left: 40,
top: 760,
right: 560,
bottom: 680,
);
final String rectText = await page.getTextInRect(rect);
final List<CPDFTextLine> lines = await page.getTextLines();
final String firstLineText =
lines.isNotEmpty ? await page.getTextByLine(lines.first) : '';
print('All text length: ${allText.length}');
print('Rectangle text: $rectText');
print('Line count: ${lines.length}');
print('First line: $firstLineText');
}注意事项
- 扫描件或无文本层 PDF 可能返回空字符串或空数组。
getTextInRect(rect)和CPDFTextLine.rect使用页面坐标,不是屏幕坐标。CPDFTextLine.rect可以直接传给CPDFReaderWidgetController.setDisplayPageIndex(rectList: ...),用于高亮对应文本行。getTextByLine(line)应使用同一页面getTextLines()返回的 line。- 页面索引无效时,接口会返回平台错误。
- 如果需要搜索关键词,请继续使用现有
CPDFTextSearcher。