Skip to content
全新发布

PDF SDK 与 AI 文档处理

在 GitHub 获取完整的私有化部署SDK 包及 AI 智能文档处理能力,一键部署,快速构建您的文档处理工作流。

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