如何在 Javascript 中获取 pdf 中的选定文本?

IT技术 javascript google-chrome-extension
2021-02-15 21:41:21

我正在编写一个 Chrome 扩展来操作 pdf 文件,所以我想在 pdf 中获取选定的文本。我怎样才能做到这一点。

像这样的事情:

在此处输入图片说明

2个回答

没有一种适用于所有 pdf 扩展的通用解决方案。每个扩展都有自己的 API。如果您使用 google-chrome 扩展程序,我相信这是不可能的。

如何从网页中嵌入的 pdf 中获取选定的文本?

https://html.developreference.com/article/23259983/How+extension+get+the+text+selected+in+chrome+pdf+viewer%EF%BC%9F

您可以使用内置 PDF 查看器的内部未记录命令

这是内容脚本的示例:

function getPdfSelectedText() {
  return new Promise(resolve => {
    window.addEventListener('message', function onMessage(e) {
      if (e.origin === 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai' &&
          e.data && e.data.type === 'getSelectedTextReply') {
        window.removeEventListener('message', onMessage);
        resolve(e.data.selectedText);
      }
    });
    // runs code in page context to access postMessage of the embedded plugin
    const script = document.createElement('script');
    if (chrome.runtime.getManifest().manifest_version > 2) {
      script.src = chrome.runtime.getURL('query-pdf.js');
    } else {
      script.textContent = `(${() => {
        document.querySelector('embed').postMessage({type: 'getSelectedText'}, '*');
      }})()`;
    }
    document.documentElement.appendChild(script);
    script.remove();
  });
}

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg === 'getPdfSelection') {
    getPdfSelectedText().then(sendResponse);
    return true;
  }
});

此示例假设您从弹出窗口或后台脚本发送消息:

chrome.tabs.query({active: true, currentWindow: true}, ([tab]) => {
  chrome.tabs.sendMessage(tab.id, 'getPdfSelection', sel => {
    // do something
  });
});

另请参阅如何打开正确的 devtools 控制台以查看扩展脚本的输出?

ManifestV3 扩展也需要这个:

  • manifest.json 应该公开 query-pdf.js

      "web_accessible_resources": [{
        "resources": ["query-pdf.js"],
        "matches": ["<all_urls>"],
        "use_dynamic_url": true
      }]
    
  • 查询-pdf.js

    document.querySelector('embed').postMessage({type: 'getSelectedText'}, '*')
    
嘿,我用内置的查看器试过了。我所做的是将您的代码复制到我的 CRX 中,分别在后台和内容脚本中尝试 -> 消息侦听器已注册 -> 在 pdf 查看器中选择文本时,我无法观察到从侦听器收到的任何消息。
2021-04-17 21:41:21
@AlexZhong,这仍然有效,所以如果您可以使用MCVE发布一个新问题,描述您的案例的所有细节,某人(或我)可能会提供帮助。请注意,此答案仅适用于内置查看器且仅适用于主页,因此对于 iframe,您需要进行一些更改。
2021-05-08 21:41:21
这对我不起作用。不幸的是,消息侦听器没有拦截来自 pdf 查看器的任何事件。
2021-05-11 21:41:21
另外,我在您链接的源代码中找不到任何正在发送的“getPdfSelection”消息
2021-05-11 21:41:21
当然,您应该自己发送该消息。
2021-05-12 21:41:21