Skip to content

PDF 文本 (Text Page)

福昕 PDF SDK 提供 APIs 来提取,选择,搜索和检索 PDF 文档中的文本。PDF 文本内容存储在与特定页面相关的 TextPage 对象中。TextPage 类可用于检索 PDF 页面中文本的信息,例如单个字符,单个单词,指定字符范围或矩形内的文本内容等。它还可用于构造其他文本相关类的对象,用来对文本内容执行更多操作或从文本内容访问指定信息:

  • 在 PDF 页面的文本内容中搜索文本,使用 TextPage 对象来构建 TextSearch 对象。
  • 访问类似超文本链接的文本,使用 TextPage 对象来构建 PageTextLinks 对象。
  • 高亮 PDF 页面上的选中文本,构建一个 TextPage 对象来计算选中文本区域。

如何通过选择获取页面上的文本区域

js
import { FoxitRDKNative } from 'foxit_rdk';

class TextPageUnit {
  public getTextRectsBySelection(page: FoxitRDKNative.pdf.PDFPage, startPos: FoxitRDKNative.common.fxcrt.PointF,
    endPos: FoxitRDKNative.common.fxcrt.PointF): Array<FoxitRDKNative.common.fxcrt.RectF> | null {
    try {
      if (!page.IsParsed()) {
        class PauseCallBackImpl extends FoxitRDKNative.common.PauseCallback {
          NeedToPauseNow(): boolean {
            return false;
          }
        }

        const progressive = page.StartParse(FoxitRDKNative.pdf.PDFPage.e_ParsePageNormal, new PauseCallBackImpl(), false)
        let state = FoxitRDKNative.common.Progressive.e_ToBeContinued;
        while (state == FoxitRDKNative.common.Progressive.e_ToBeContinued) {
          state = progressive.Continue();
        }
      }

      // 从解析的PDF页面创建一个text page
      const textPage = new FoxitRDKNative.pdf.TextPage(page, FoxitRDKNative.pdf.TextPage.e_ParseTextNormal);
      if (textPage == null || textPage.IsEmpty()) {
        return null;
      }
      let startCharIndex = textPage.GetIndexAtPos(startPos.x, startPos.y, 5);
      let endCharIndex = textPage.GetIndexAtPos(endPos.x, endPos.y, 5);
      // getTextRectCount API 要求开始字符索引必须小于或等于结束字符索引
      startCharIndex = startCharIndex < endCharIndex ? startCharIndex : endCharIndex;
      endCharIndex = endCharIndex > startCharIndex ? endCharIndex : startCharIndex;
      const count = textPage.GetTextRectCount(startCharIndex, endCharIndex - startCharIndex);

      if (count > 0) {
        const array: Array<FoxitRDKNative.common.fxcrt.RectF> = new Array();
        for (let i = 0; i < count; i++) {
          const rectF = textPage.GetTextRect(i);
          if (rectF == null || rectF.IsEmpty()) {
            continue;
          }
          array.push(rectF);
        }
        // 返回的矩形是以PDF单位表示的,如果调用者需要在屏幕上高亮显示这些文本矩形,那么首先应该将这些矩形转换为设备单位
        return array;
      }
    } catch (e) {
      console.error(e);
    }
    return null;
  }
}