Blob格式的PDF文件调用打印,浏览器文件打印(兼容)

浏览器文件打印,解决:非整个浏览器页面打印,指定模块儿打印

要调用 iframe 中加载的 PDF 文件的打印功能,可以直接操作 iframe 的 contentWindow 对象,调用其内置的打印方法(PDF 浏览器插件或 PDF.js 渲染器通常会暴露 print() 方法)。以下是具体实现方式:

实现思路

  1. 确保 iframe 已完全加载 PDF(监听 load 事件)。

  2. 通过 iframe 的 contentWindow 调用 PDF 的打印方法(不同浏览器可能有差异,需兼容处理)。

  3. 若直接调用失败,降级使用 window.print() 打印整个 iframe 内容。

    打印

fileUrl 文件地址; @load="handleIframeLoad" 判断pdf文件是否加载完成。

javascript 复制代码
// 监听 iframe 加载完成
    handleIframeLoad() {
      this.isIframeLoaded = true;
      console.log('PDF 加载完成,可打印');
    },

    // 打印 iframe 中的 PDF
    printPdf() {
      if (!this.isIframeLoaded) {
        alert('PDF 尚未加载完成,请稍后再试');
        return;
      }

      const iframe = this.$refs.pdfIframe;
      const iframeWindow = iframe.contentWindow;

      try {
        // 方案1:直接调用 PDF 内置的打印方法(主流浏览器对 PDF 支持较好)
        if (iframeWindow.print) {
          // 部分浏览器中,PDF 的 print() 是异步的,需包裹在 setTimeout 中
          setTimeout(() => {
            iframeWindow.print();
          }, 100);
        } else {
          // 方案2:降级使用 window.print() 打印整个 iframe 区域
          this.printIframeWithWindowPrint(iframe);
        }
      } catch (error) {
        console.error('打印失败,使用降级方案', error);
        this.printIframeWithWindowPrint(iframe);
      }
    },

    // 降级方案:使用 window.print() 并指定只打印 iframe 内容
    printIframeWithWindowPrint(iframe) {
      // 保存当前页面的打印样式
      const originalStyle = document.body.style;

      // 隐藏页面其他内容,只显示 iframe
      document.body.style.visibility = 'hidden';
      iframe.style.visibility = 'visible';
      iframe.style.position = 'fixed';
      iframe.style.top = '0';
      iframe.style.left = '0';
      iframe.style.width = '100%';
      iframe.style.height = '100%';

      // 触发打印
      window.print();

      // 恢复页面样式(打印完成后执行)
      setTimeout(() => {
        document.body.style = originalStyle;
        iframe.style = ''; // 恢复 iframe 原有样式
      }, 100);
    },
相关推荐
染指11101 小时前
103.RAG-LLamaIndex后端rag问答-聊天接口
前端·javascript·vue.js·人工智能
东风破_8 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_8 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric9 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_019 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余9 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
小磊哥er11 小时前
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算
javascript·ai编程
kyriewen12 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程