文本搜索
福昕 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() 返回 TextSearchMatch 或 null。TextSearchMatch 可读取页码、字符范围、矩形区域和所在语句。
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 不同。