You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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的时候,要确保PDFViewerApplicationeventBus是可访问的,不要把相关模块给剔除了。
  • 最好在PDF加载完成后再绑定事件,比如监听documentLoaded事件:
    window.PDFViewerApplication.eventBus.on('documentLoaded', () => {
      // 在这里绑定选择监听事件
    });
    

内容的提问来源于stack exchange,提问作者Srikar Reddy

火山引擎 最新活动