如何在pdf.js中获取用户选中的PDF文本?
实现pdf.js中提取用户选中的PDF文本
嘿,刚好我之前在自定义pdf.js的时候折腾过文本选择提取的功能,给你梳理个靠谱的实现方案,不管是打印到控制台还是弹窗显示都能搞定!
方法一:利用浏览器原生选择事件(简单易上手)
这个方法不需要深入pdf.js的内部API,直接监听浏览器的选择变化事件就行,还能过滤掉非PDF内容的选中(比如页面上的UI按钮):
// 监听全局选择变化事件 document.addEventListener('selectionchange', () => { const selection = window.getSelection(); // 没有选中内容就直接返回 if (!selection.rangeCount || selection.toString().trim() === '') return; // 判断选中的内容是否来自pdf.js的文本层(避免选中UI元素) const anchorParent = selection.anchorNode?.parentElement; if (anchorParent && anchorParent.classList.contains('textLayer')) { const selectedText = selection.toString().trim(); // 调用处理函数 handleSelectedContent(selectedText); } }); // 处理选中内容的函数 function handleSelectedContent(text) { // 打印到控制台 console.log('用户选中的PDF文本:', text); // 弹窗显示内容 alert('你选中的PDF内容:\n\n' + text); }
方法二:用pdf.js内置API(更精准可靠)
如果你需要更精准的控制(比如知道选中内容所在的页码、位置),可以直接用pdf.js viewer内置的事件和方法,这个方法只会抓取PDF内容的选中,完全不会涉及页面其他元素:
// 获取pdf.js的PDFViewer实例(前提是viewer已经初始化完成) const pdfViewer = window.PDFViewerApplication?.pdfViewer; if (!pdfViewer) { console.error('PDFViewer实例未找到,请确保viewer已加载完成'); return; } // 监听pdf.js的选择变化事件 pdfViewer.eventBus.on('selectionChanged', (event) => { // 通过内置方法获取选中的文本 const selectedText = event.source.getSelectedText(); if (selectedText.trim()) { console.log('选中的PDF文本:', selectedText); // 弹窗展示 confirm('要查看选中的内容吗?') && alert('选中内容:\n\n' + selectedText); } });
一些注意事项
- 如果你的PDF是扫描件(纯图片格式),pdf.js不会生成文本层,这种情况下没法提取选中的文本,建议提前做个判断提示用户。
- 自定义构建pdf.js的时候,要确保
PDFViewerApplication和eventBus是可访问的,不要把相关模块给剔除了。 - 最好在PDF加载完成后再绑定事件,比如监听
documentLoaded事件:window.PDFViewerApplication.eventBus.on('documentLoaded', () => { // 在这里绑定选择监听事件 });
内容的提问来源于stack exchange,提问作者Srikar Reddy




