返回

打印 PDF 无忧:巧用 iframe 跨越浏览器限制

前端

跨域打印难题的绝佳方案:利用 iframe 和 Blob 二进制数据

揭秘跨域打印之痛

想象一下,你想从网页上打印一份 PDF 文档,但突然遇到了一个讨厌的错误信息:"跨域访问被拒绝。"这就像一堵无形的墙,阻碍了你与 PDF 文档之间的交互。跨域错误在网络世界中很常见,它发生在不同来源的资源试图互相访问时。

跨域打印的救星:iframe

幸好,我们有一个可靠的解决方案:iframe。iframe 就像一个神奇的窗口,可以将来自其他网站的内容嵌入到当前网页中。它充当了一个中介,允许跨域访问,从而解决我们的跨域打印难题。

详解 iframe 跨域打印之妙招

为了让 iframe 帮助我们跨域打印 PDF,我们需要采取一些步骤:

  1. 将 PDF 文档转换为 Blob 二进制数据:
    Blob 是一个特殊的 JavaScript 对象,可以存储二进制数据。我们将 PDF 文档转换为 Blob,以便 iframe 可以访问它。

  2. 通过 createObjectURL 生成本地对象 URL:
    本地对象 URL 是一个临时的 URL,指向 Blob 中存储的数据。我们使用 createObjectURL() 方法生成本地对象 URL。

  3. 在 iframe 中加载本地对象 URL:
    我们创建一个 iframe 并将本地对象 URL 设置为其源。这样,iframe 就能够访问 PDF 文档了。

  4. 调用 iframe 中的打印接口,完成打印:
    当 iframe 加载完成后,我们调用其 contentWindow.print() 方法。这将触发打印对话框,你可以选择打印机和打印选项。

代码示例,一步步带你飞

// 1. 将 PDF 文档转换为 Blob 二进制数据
const pdfFile = document.querySelector('input[type=file]');
pdfFile.addEventListener('change', (e) => {
  const file = e.target.files[0];
  const reader = new FileReader();
  reader.onload = () => {
    const blob = new Blob([reader.result], { type: 'application/pdf' });

    // 2. 通过 createObjectURL 生成本地对象 URL
    const objectUrl = URL.createObjectURL(blob);

    // 3. 在 iframe 中加载本地对象 URL
    const iframe = document.createElement('iframe');
    iframe.src = objectUrl;
    document.body.appendChild(iframe);

    // 4. 调用 iframe 中的打印接口,完成打印
    iframe.onload = () => {
      iframe.contentWindow.print();
    };
  };
  reader.readAsArrayBuffer(file);
});

高枕无忧,尽情打印

掌握了 iframe 跨域打印的技巧后,你就可以告别跨域错误,尽情打印 PDF 文档了。无论是从本地加载的 PDF 还是从网络获取的 PDF,iframe 都能让你轻松搞定。

常见问题解答

Q1:iframe 跨域打印只适用于特定浏览器吗?
A1:不,iframe 跨域打印适用于所有支持 iframe 和 Blob API 的现代浏览器。

Q2:我可以使用 iframe 打印其他类型的文件吗?
A2:是的,iframe 跨域打印不仅仅适用于 PDF 文档。你还可以打印图像、HTML 页面甚至其他 PDF 文档。

Q3:如果我遇到跨域错误怎么办?
A3:确保 PDF 文档和 HTML 页面托管在具有相同协议(如 HTTPS)的服务器上。如果仍然遇到错误,请检查你的代码是否正确实现了 iframe 跨域打印的步骤。

Q4:iframe 跨域打印是否适用于移动设备?
A4:是的,iframe 跨域打印在移动设备上也能正常工作,只要浏览器支持 iframe 和 Blob API。

Q5:如何自定义打印选项?
A5:要自定义打印选项,你需要直接操作 iframe 中的打印对话框。这可以通过操纵 contentWindow.print() 方法中的参数来实现。