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.以上就是实现全过程 有不懂的可以 随时交流哈

相关推荐
半岛盒子3 分钟前
AI Coding方案与事件流(前端)
前端
星栈5 分钟前
Makepad 应用如何读文件、调接口、保存数据
前端·rust
qq_466302457 分钟前
office 2021 下载安装激活
前端
新新学长搞科研9 分钟前
【广东省博促会主办】2026年第七届先进材料与智能制造国际学术会议(ICAMIM 2026)
大数据·前端·数据库·人工智能·物联网
铁皮饭盒12 分钟前
用bunjs代码讲解XSS/CSRF/SQL注入/DDos等10种前后端安全防护
前端·后端
王莎莎-MinerU15 分钟前
从 OCR 到 Context Engineering:用 MinerU 搭一个可复现文档解析评测
人工智能·深度学习·机器学习·pdf·ocr·个人开发
hhb_61818 分钟前
TypeScript泛型实战:企业级请求封装全解析
javascript·ubuntu·typescript
琹箐20 分钟前
chrome 插件下载安装;Manifest file is missing or unreadable
前端·chrome
云飞云共享云桌面21 分钟前
面向机械研发:双服务器架构搭配云飞云运行 SolidWorks 方案详解
运维·服务器·前端·网络·架构·制造
乐兮创想 小林34 分钟前
B2B 内容营销的工程化运营:从内容矩阵建模到 SEO/GEO 联动的完整体系
前端·线性代数·矩阵·网站建设·北京网站建设公司