React中使用PDF.js渲染PDF时搜索高亮位置不准确的修复方案咨询
嘿,我之前在React里用PDF.js做搜索高亮的时候也踩过这个偏移的坑,太懂这种明明搜索到了但高亮跑偏的烦躁!结合你已经试过的方法,给你几个额外的排查方向:
确保缩放值完全同步
你提到调整过currentScaleValue,要注意PDFFindController内部使用的缩放值必须和PDFViewer的currentScale完全一致。如果是手动设置缩放,一定要在更新缩放后同步更新搜索控制器的缩放参数,比如调用findController.setCurrentScale(currentScale),不然控制器计算高亮位置时用的还是旧的缩放比例,自然就偏移了。检查Text Layer的渲染时机
你用了textLayerMode: scale,要确认Text Layer是在PDF页面完全渲染完成后才生成的。如果初始化PDFFindController的时候Text Layer还没挂载或者没计算好尺寸,控制器拿到的文本坐标就是错的。可以在pageRendered事件触发后再初始化或重置搜索控制器,比如:useEffect(() => { if (viewerRef.current && documentRef.current) { const viewer = viewerRef.current; const findController = new PDFFindController({ viewer, eventBus: viewer.eventBus, }); // 监听页面渲染完成事件,重置搜索状态 viewer.eventBus.on('pageRendered', () => { findController.reset(); }); } }, [documentRef]);避免用CSS缩放容器
如果你的PDF渲染容器用了CSS的transform: scale()或者zoom属性来调整大小,这会导致Text Layer的坐标系统和PDF画布的坐标系统错位,PDF.js的搜索高亮是基于Text Layer的坐标计算的,自然就不准了。一定要改用PDF.js自身的currentScale来控制缩放,不要用CSS来缩放整个容器。检查PDF.js版本兼容性
有些旧版本的PDF.js在React环境下的Text Layer计算有bug,比如某些v2.x的版本,尝试升级到最新的稳定版(比如v3.x系列),很多这类坐标偏移的问题都被修复了。确认Text Layer的容器样式
确保Text Layer的父容器没有设置position: absolute以外的定位,或者额外的padding/margin,这些都可能影响文本坐标的计算。PDF.js默认的Text Layer是绝对定位在PDF画布上方的,样式被改动的话很容易出问题。
备注:内容来源于stack exchange,提问作者Manu

