pdf.js实现pdf检索对应文本和高亮功能

 更新时间:2025年09月19日 10:27:32   作者:前端初见  
PDF.js是一个强大的JavaScript库,可以在浏览器中渲染PDF文件,无需依赖任何第三方插件,这篇文章主要介绍了pdf.js检索对应文本和高亮的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

需求场景

本文主要针对网页端 PDF 本地预览场景,支持通过关键字对 PDF 进行检索查询,当点击检索结果列表中的对应关键字时,可同步在预览界面中触发内容搜索 —— 不仅能精准跳转到匹配内容所在的 PDF 页码,还能对目标文字进行高亮显示。此外,方案还涵盖了 iframe 嵌入预览、文字高亮等核心功能的实现细节,并针对性解决了基于 pdf.js 开发时常见的跨域问题,为网页端 PDF 预览与检索需求提供了完整技术参考。

技术栈:pdf.js+vue3

1、使用pdf.js+解决pdf.js跨域

pdf.js下载地址

将下载的pdf.js压缩包解压并放入到项目中的public文件夹下,如下

在项目的 public/pdfjs/web/viewer.mjs 文件中,搜索关键词 “file origin does not match viewer’s”,找到该关键词所在的异常抛出代码段,并将其注释掉。若不进行此注释操作,会触发跨域错误,导致 PDF 文件无法正常加载预览。

2、预览方案

pdf.js 提供了多种 PDF 预览方案(如基于 canvas 渲染的方案),本文选用 iframe 嵌入预览方式:先将 pdf.js 部署为独立的预览网站,在生产环境中,只需通过 iframe 传入目标 PDF 文件的地址(即 fileUrl),即可快速实现 PDF 预览功能。需要注意的是,此处的 fileUrl 不仅可以是常规的文件地址,也可以是通过 URL.createObjectURL() 方法生成的文件流临时地址。

 <iframe    ref="pdfFrame" width="100%" height="100%" :src="`/pdfjs/web/viewer.html?file=${fileUrl}`" frameborder="0" id="myIframe"></iframe>

3、检索方案

封装一个handleSearch方法传入关键字文案,进行检索查询

  • 入参:接收 query(string类型,即待搜索的关键字文案),并处理空值(默认转为空字符串)。
  • 核心逻辑
    • 通过 pdfFrame.value.contentWindow 获取iframe中pdf.js预览实例的窗口对象;
    • 拿到预览实例的 findBar(搜索工具栏)对象,若存在则配置搜索参数(设置关键字、开启全量高亮、关闭大小写敏感);
    • 触发 find(执行搜索)和 highlightallchange(应用高亮)事件,完成检索与高亮;
    • 异常捕获:通过try-catch处理搜索过程中的错误,打印错误日志便于排查。
      通过关联pdf.js的原生 findBar 能力,封装成简洁的检索方法,同时通过加载状态控制和异常处理,保证搜索功能的稳定性与可用性。
/**
 * 接收关键字文案作为参数
 * @param {string} query - 要搜索的文案
 */
 const handleSearch= (query) => {
  const searchText = query ||''
  try {
    // 获取PDF Viewer的相关对象
    const frameWindow = pdfFrame.value.contentWindow;
    const findBar = frameWindow.PDFViewerApplication.findBar;
    if (findBar) {
      // 设置搜索参数
      findBar.findField.value = searchText;
      findBar.highlightAll.checked = true; // 高亮所有匹配项
      findBar.caseSensitive.checked = false; // 不区分大小写
      
      // 搜索和高亮
      findBar.dispatchEvent(new Event('find'));
      findBar.dispatchEvent(new Event('highlightallchange'));
    }
  } catch (error) {
    console.error('PDF搜索失败:', error);
  }
};

const pdfFrame = ref(null);
const isPdfLoaded = ref(false);
// 监听iframe加载完成
onMounted(() => {
  const frame = pdfFrame.value;
  //监听 iframe 加载状态,确保在 PDF 加载完成后才执行搜索操作
  if (frame) {
    frame.onload = () => {
      isPdfLoaded.value = true;
      console.log('PDF viewer loaded successfully');
    };
  }
});

使用

handleSearch('你要查询的文案')

4、实现效果

总结

到此这篇关于pdf.js实现pdf检索对应文本和高亮功能的文章就介绍到这了,更多相关pdf.js检索对应文本和高亮内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript将数字转换整数金额大写的方法

    javascript将数字转换整数金额大写的方法

    这篇文章主要介绍了javascript将数字转换整数金额大写的方法,通过自定义函数中的数组替换实现数字转换整数金额大写的功能,非常具有实用价值,需要的朋友可以参考下
    2015-01-01
  • 通过Tabs方法基于easyUI+bootstrap制作工作站

    通过Tabs方法基于easyUI+bootstrap制作工作站

    本教程给大家介绍如何制作easyUI+bootstrap工作站,主要学习tabs方法,本文介绍非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2016-03-03
  • trim原型函数看js正则表达式的性能

    trim原型函数看js正则表达式的性能

    如果你看到别人写trim函数是用循环而不用正则表达式来写,请不要取笑,也许,他们就是高手。如果你很自信你的trim函数效率很高,请看完本文再下结论。
    2008-12-12
  • javascript 实现划词标记划词搜索功能

    javascript 实现划词标记划词搜索功能

    在页面中加上这串代码就行了,同时还有搜索功能。
    2009-10-10
  • 在js里怎么实现Xcode里的callFuncN方法(详解)

    在js里怎么实现Xcode里的callFuncN方法(详解)

    下面小编就为大家带来一篇在js里怎么实现Xcode里的callFuncN方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • JavaScript判断DIV内容是否为空的方法

    JavaScript判断DIV内容是否为空的方法

    整体思路是这样的:判断div内部是否为空,如果为空,给出无数据提示;否则显示正常页面,下面给大家分享js判断div内容是否为空的方法,对判断div内容是否为空的相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • JS实用技巧断点调试过程

    JS实用技巧断点调试过程

    这段文章详细介绍了JavaScript调试技巧,包括单步调试、函数调试、断点调试和事件调试,帮助初学者快速定位和解决问题,文章通过具体操作步骤和示例代码,深入浅出地讲解了调试的关键步骤和技巧
    2026-06-06
  • 浅谈Javascript嵌套函数及闭包

    浅谈Javascript嵌套函数及闭包

    这篇文章其实是要讲闭包的一些初级应用,但是为了将闭包,我们还是从嵌套函数开始说吧,纵使所有的JavaScript函数都可以说是闭包,但是只有当一个嵌套函数被导出到它所定义的作用域之外时,这种闭包才是有趣的。
    2010-11-11
  • Bootstrap php制作动态分页标签

    Bootstrap php制作动态分页标签

    这篇文章主要为大家详细介绍了Bootstrap php制作动态分页标签的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • IE6,IE7下js动态加载图片不显示错误

    IE6,IE7下js动态加载图片不显示错误

    ie6,7下js动态加载图片不显示错误,碰到这类问题的朋友可以参考下。
    2010-07-07

最新评论