iframe 嵌入预览 PDF ,禁用右键菜单、打印下载按钮不展示

需求场景:pdf文件预览 我一开始就想到了<iframe></iframe>标签 去实现 但是并不能满足我后续的场景(1.右上方下载、打印按钮不展示 2.禁用右键菜单)。用过的都知道iframe标签没有针对于特定按钮隐藏属性 要么都展示 要么都隐藏(在路径后面拼接#toolbar=0) 针对于隐藏特定按钮隐藏 我这边也实现了 通过定位方法透明背景样式去写 但是这样写后 禁用右键菜单后 (οncοntextmenu="return false;" ) 如果pdf文件很大 没法滚动了

我这边也尝试了个别的依赖(vue-pdf-embed)都不好使 最终选择了pdfjs+iframe 下面是具体操作方法

1.去官网下载pdfjs 记住不要太高 的版本 稳定版本就行 因为太高的版本是mjs(服务器不认识 .mjs 文件,把它当成了二进制文件,导致 PDF.js 无法加载!)

https://github.com/mozilla/pdf.js/releases/download/v3.11.174/pdfjs-3.11.174-dist.zip

2.把下载下来的文件放到public/pdfjs

3.修改配置:pdfjs/web/viewer.html(阻止跨域、禁用右键菜单、打印下载按钮隐藏)

复制代码
 <script>
      // 强制关闭 PDF.js 跨域验证
      window.Cypress = true;
      window.PDFJS = {
        disableWebSecurity: true,
        disableOriginCheck: true,
      };
    </script>
    <script>
      // 全局禁用右键菜单
      document.addEventListener('DOMContentLoaded', function () {
        // 禁用右键
        document.addEventListener('contextmenu', function (e) {
          e.preventDefault();
          return false;
        });

        // 禁用图片另存为
        document.addEventListener('dragstart', function (e) {
          e.preventDefault();
        });

        // 禁用选择
        document.addEventListener('selectstart', function (e) {
          e.preventDefault();
        });

        // 禁用 F12 / Ctrl+Shift+I / Ctrl+Shift+J / Ctrl+U
        document.addEventListener('keydown', function (e) {
          if (e.key === 'F12' || (e.ctrlKey && e.shiftKey && (e.key === 'I' || e.key === 'J')) || (e.ctrlKey && e.key === 'U')) {
            e.preventDefault();
            return false;
          }
        });
      });
    </script>
    <style>
      #printButton,
      #downloadButton,
      #editorFreeTextButton,
      #editorInkButton,
      #editorStampButton,
      #toolbarViewerRight,
      #toolbarViewerMiddle,
      #toolbarViewerLeft,
      #viewAttachments,
      #viewLayers,
      #editorHighlightButton {
        display: none !important;
      }
      /* 隐藏右键菜单 */
      html,
      body {
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
      }
    </style>

4.具体页面使用

复制代码
  <a-modal v-model:open="pdfVisible" width="95%" :footer="null" destroyOnClose @cancel="handleCancelPdf" style="top: 20px">
      <!-- 禁用右键菜单 -->
      <div @contextmenu.prevent style="width: 100%; height: 88vh; padding: 0; margin: 0">
        <!-- 本地 PDF.js 预览,无跨域问题 -->
        <iframe v-if="pdfVisible" :src="pdfSrc" width="100%" height="100%" frameborder="0" style="border: none" oncontextmenu="return false;" />
      </div>
    </a-modal>
  const pdfVisible = ref(false);
  const pdfSrc = ref('');

打开弹框方法
const previewFile = async (record) => {
    try {
      // ✅ 唯一能100%绕过跨域校验的方法
      const response = await fetch(record.fileUrl);
      const blob = await response.blob();
      const blobUrl = URL.createObjectURL(blob);

      // ✅ 直接加载,不触发任何跨域检查
      pdfSrc.value = `/pdfjs/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;
      pdfVisible.value = true;
    } catch (e) {
      message.error('PDF 加载失败');
    }
  };
  // 关闭 PDF
  const handleCancelPdf = () => {
    pdfVisible.value = false;
    pdfSrc.value = '';
  };

5.以上就是实现全过程 有不懂的可以 随时交流哈

相关推荐
犇驫聊AI7 分钟前
Chrome DevTools MCP + Claude Code 自定义skills生成接口代码生成器
前端·javascript
kyriewen18 分钟前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
hoLzwEge34 分钟前
node-linker VS shamefully-hoist
前端·前端框架
袋鱼不重41 分钟前
解决 Web 端图片预览与下载颜色不一致的一种工程方案
前端·后端
风止何安啊1 小时前
教你用 JS + AI 实现简单的爬虫,零门槛爬取网页信息
前端
cidy_981 小时前
codebase-memory-mcp 新手完全教程:让 AI 真正「理解」你的代码库
前端
牛奶1 小时前
HTTPS你不知道的事
前端·https·浏览器
小小小小宇1 小时前
前端 Vue 如何避免不必要的子组件渲染全解析
前端
稀土熊猫君1 小时前
一个人能做出什么开源项目?
vue.js·后端·开源
cidy_982 小时前
codebase-memory-mcp 安装教程
前端