You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QWebEngineView显示PDF:如何选中链接短语内的单个字符

解决QWebEngineView展示PDF时无法选中链接内单个字符的问题

当用QWebEngineView加载带链接的PDF时,链接短语会被整体绑定为交互元素,导致无法选中其中单个字符。不用修改PDF本身,通过注入JavaScript就能关闭链接的交互功能,让文本可以正常选中。

修改后的完整代码如下:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import QWebEngineSettings, QWebEngineView
import sys

class App(QMainWindow):
    def __init__(self):
        super(App, self).__init__()
        self.webView = QWebEngineView()
        self.webView.settings().setAttribute(
            QWebEngineSettings.PluginsEnabled, True)
        self.webView.settings().setAttribute(
            QWebEngineSettings.PdfViewerEnabled, True)
        # 绑定PDF加载完成信号,执行JS移除链接交互
        self.webView.page().loadFinished.connect(self.disablePdfLinks)
        self.webView.load(QUrl.fromUserInput("path-to-pdf"))
        self.setCentralWidget(self.webView)

    def disablePdfLinks(self, ok):
        if ok:
            # 注入JavaScript代码,处理所有链接元素
            js_code = """
            // 遍历PDF渲染出的所有链接标签
            const links = document.querySelectorAll('a');
            links.forEach(link => {
                // 移除链接跳转功能
                link.removeAttribute('href');
                // 禁止链接的鼠标交互,让文本可被选中
                link.style.pointerEvents = 'none';
                // 确保文本选中功能正常
                link.style.userSelect = 'text';
            });
            """
            self.webView.page().runJavaScript(js_code)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()
    window.showMaximized()
    sys.exit(app.exec_())

关键说明

  • 绑定loadFinished信号:确保PDF完全加载后再执行JS代码,避免DOM元素未渲染完成导致操作无效。
  • JavaScript逻辑:
    • 选中页面中所有<a>标签(PDF viewer会将文档内的链接渲染为该标签)
    • 移除href属性,彻底取消跳转功能
    • 设置pointerEvents: none,让鼠标事件穿透链接元素,不再触发交互
    • 设置userSelect: text,明确允许文本被选中

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:47:46