Skip to content

文本搜索

福昕 PDF SDK(Web)提供两类文本搜索接口:PDFDoc.getTextSearch() / PDFPage.getTextSearch() 返回搜索对象,可逐条查找;PDFDoc.searchText() 在指定页面范围内一次性搜索一个或多个关键字。

如果使用 UIExtension,搜索面板通常已内置在 UI 中,用户可以直接通过工具栏打开搜索并浏览结果。本文介绍通过 API 实现文本搜索。需要顺序提取全文/区域文本字符级几何时,请参阅 文本提取;需要查找并替换页面文本时,请参阅 PDF 编辑模块 中的 Adv Edit 查找替换 API。

搜索接口

任务接口
文档内逐条搜索PDFDoc.getTextSearch()
单页逐条搜索PDFPage.getTextSearch()
读取逐条搜索结果TextSearchMatch
指定页范围批量搜索PDFDoc.searchText()

使用搜索对象逐条查找

PDFDoc.getTextSearch(pattern, flags) 返回 DocTextSearch。它适合实现搜索面板、上一个/下一个结果、从指定页开始搜索、逐条高亮等交互。

javascript
const pdfDoc = pdfViewer.getCurrentPDFDoc();
const textSearch = pdfDoc.getTextSearch('Foxit', 1 | 2);

const match = await textSearch.findNext();

if (match) {
    console.log(match.getPageIndex());
    console.log(match.getSentence());
    console.log(match.getRects());
}

DocTextSearch 常用接口如下:

接口说明
findNext()查找下一个匹配结果。
findPrev()查找上一个匹配结果。
setCurrentPageIndex(index)设置当前搜索页。
setStartPageIndex(index)设置搜索起始页。
setEndPageIndex(index)设置搜索结束页。
destroy()销毁搜索对象。

findNext()findPrev() 返回 TextSearchMatchnullTextSearchMatch 可读取页码、字符范围、矩形区域和所在语句。

javascript
const match = await textSearch.findNext();

if (match) {
    const pageIndex = match.getPageIndex();
    const rects = match.getRects();
    const sentence = match.getSentence();
    const startCharIndex = match.getStartCharIndex();
    const endCharIndex = match.getEndCharIndex();
}

如果只需要搜索单页,可以先获取 PDFPage,再使用 PDFPage.getTextSearch(pattern, flags)

javascript
const page = await pdfDoc.getPageByIndex(0);
const pageTextSearch = await page.getTextSearch('Foxit', 0);

const match = await pageTextSearch.findNext();

if (match) {
    console.log(match.getRects());
}

pageTextSearch.destroy();

搜索结束后,如果不再使用搜索对象,建议调用 destroy() 释放相关资源。

搜索标志

getTextSearch(pattern, flags) 使用位标志控制匹配规则,可通过按位或组合:

标志说明
0普通搜索。
1区分大小写。
2全词匹配。
4连续匹配。例如在 CCC 中搜索 CC 时,可匹配多次。

批量搜索文本

PDFDoc.searchText(pages, words, options) 用于在指定页面中一次性搜索一个或多个关键字。它更适合业务自动化、批量定位、敏感词查找,或与注释、密文脱敏等功能联动。

javascript
const pdfDoc = pdfViewer.getCurrentPDFDoc();

const result = await pdfDoc.searchText(
    [0, 1],
    ['Foxit', 'PDF'],
    {
        wholeWordsOnly: true,
        caseSensitive: false
    }
);

console.log(result);

返回结果按页面索引分组,每个匹配项通常包含匹配文本和对应的矩形区域。

javascript
{
    0: [
        {
            word: 'Foxit',
            rects: [
                { left: 100, right: 145, top: 720, bottom: 700 }
            ]
        }
    ],
    1: []
}

PDFDoc.searchText() 使用对象参数控制搜索选项:

选项说明
wholeWordsOnly是否只匹配完整单词。
caseSensitive是否区分大小写。

如何选择

  • 需要实现“上一个/下一个”、搜索面板、逐条高亮或从指定页开始搜索时,使用 PDFDoc.getTextSearch()
  • 只搜索单页时,使用 PDFPage.getTextSearch()
  • 需要一次性获取多个关键字在多个页面中的矩形结果时,使用 PDFDoc.searchText()
  • 需要做敏感词定位、批量标记、密文脱敏联动时,优先使用 PDFDoc.searchText()

与密文脱敏联动

搜索结果中的矩形区域可用于在页面上创建密文标记。处理敏感词时,通常先调用 PDFDoc.searchText() 获取匹配位置,再按 密文脱敏 文档说明,使用密文标记与 applyRedaction 等接口完成标记并应用脱敏。

javascript
const result = await pdfDoc.searchText([0], ['secret'], {
    wholeWordsOnly: true,
    caseSensitive: false
});

const page = await pdfDoc.getPageByIndex(0);
const rects = result[0].flatMap(item => item.rects);

if (rects.length > 0) {
    await page.markRedactAnnot(rects);
}

注意事项

  • 页面索引从 0 开始。
  • 搜索结果取决于 PDF 中是否包含可解析文本;扫描件通常需要 OCR 后才能搜索文本。
  • 大文档全文搜索可能耗时较长。使用 searchText() 时建议限制页码范围;使用 getTextSearch() 时可按需逐条查找。
  • 搜索结果中的矩形使用 PDF 坐标,和 Viewer 中的 device pixels 不同。