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);
    },
相关推荐
半个落月3 小时前
用 LangChain JS 做可控写作实验:理解温度参数、提示词与异步调用
javascript·人工智能·后端
爱勇宝3 小时前
《道德经》第 7 章:真正厉害的领导者,不抢主角
前端·后端·程序员
观远数据3 小时前
Excel到数据资产池:文件数据入湖的治理规范怎么建
前端·javascript·excel
CoderWeen3 小时前
我写了个能一步步点着看的 Dijkstra 可视化项目(Vue3 + Leaflet + Generator)
前端·javascript·vue.js
两点王爷4 小时前
一个快速加载面和多面数据的html测试页面(可以导出geojson数据文件)
前端·html·gis
热爱前端的小张4 小时前
第四章 接口和类型兼容性
前端
hunterandroid4 小时前
[鸿蒙从零到一] HarmonyOS 资源管理与多语言适配实战
前端
用户69371750013844 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
无人生还4 小时前
第 1 篇:从 Vue3 到 React 的思维转变
前端·vue.js·react.js
蝉蜕日记4 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求