如何从pdf.js中的用户选择中检索文本?

Sri*_*ddy 3 javascript pdf pdfjs

这个问题特定于pdf.js,一个基于javascript的pdf渲染器.我正在构建一个自定义版本,我需要提取我在pdf中选择的文本.

还有其他帖子可以从一个页面或整个pdf文档中获取文本,例如此处的文档,但我希望获取用户选择的特定文本,并可能提醒它或在控制台中打印它.

小智 6

pdf.js 在 web 目录中有一个文件viewer.html。

您必须在 viwer.html 中执行以下两个步骤

  1. 添加 onselectionchange 事件监听器。
  2. 定义事件处理函数onselectionchange()。
<script>

  // addEventListener version
  document.addEventListener('selectionchange', () => {
    console.log(document.getSelection());
  });

  // onselectionchange version
  document.onselectionchange = () => {
    var text = getSelectedText();

    if(text)
    {
      alert(text); 

    }
  };

  function getSelectedText() {
     if (window.getSelection) {
        return window.getSelection().toString();
     } 
     else if (document.selection) {
         return document.selection.createRange().text;
     }
     return '';
  }
</script>
Run Code Online (Sandbox Code Playgroud)


sem*_*ser 5

你在寻找的是window.getSelection()方法.此方法返回特定的Selection对象,其中包含网页上所选文本的范围.

以下是getSelection()pdf.js一起使用的方法:

function getHightlightCoords() {
var pageIndex = PDFViewerApplication.pdfViewer.currentPageNumber - 1; 
var page = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
var pageRect = page.canvas.getClientRects()[0];
var selectionRects = window.getSelection().getRangeAt(0).getClientRects();
var viewport = page.viewport;
var selected = selectionRects.map(function (r) {
  return viewport.convertToPdfPoint(r.left - pageRect.x, r.top - pageRect.y).concat(
     viewport.convertToPdfPoint(r.right - pageRect.x, r.bottom - pageRect.y)); 
});
return {page: pageIndex, coords: selected};
}


function showHighlight(selected) {
var pageIndex = selected.page; 
var page = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
var pageElement = page.canvas.parentElement;
var viewport = page.viewport;
selected.coords.forEach(function (rect) {
  var bounds = viewport.convertToViewportRectangle(rect);
  var el = document.createElement('div');
  el.setAttribute('style', 'position: absolute; background-color: pink;' + 
    'left:' + Math.min(bounds[0], bounds[2]) + 'px; top:' + Math.min(bounds[1], bounds[3]) + 'px;' +
    'width:' + Math.abs(bounds[0] - bounds[2]) + 'px; height:' + Math.abs(bounds[1] - bounds[3]) + 'px;');
  pageElement.appendChild(el);
});
}
Run Code Online (Sandbox Code Playgroud)

  • 另外请注意,在你提供的解决方案中,**.getHighlightCoords()**里面的**.map()**似乎不起作用,因为selectionRects即**"window.getSelection().getRangeAt(0). getClientRects();"**返回对象的对象而不是对象数组,因此您需要将其转换为类似于此的数组:**"var selectionRectsList = Object.values(selectionRects);"** (2认同)