通过 iframe 打印 pdf(跨域)

新手上路,请多包涵

我需要打印一个 PDF 文件…但是我收到一个错误

有解决方法吗?我只需要一键打印PDF文件

错误:

 Uncaught SecurityError: Blocked a frame with origin "https://secure.domain.com" from accessing a frame with origin "https://cdn.domain.com". Protocols, domains, and ports must match.

代码:

 var iframe = $('<iframe src="'+url+'" style="display:none"></iframe>').appendTo($('#main')).load(function(){
    iframe.get(0).contentWindow.print();
});

原文由 clarkk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

您处理的错误与跨域保护和同源策略有关。

在您的情况下,如果您将此 iframe 嵌套在我们可以称为代理 iframe 的另一个本地 iframe 中,则可以打印跨域 iframe。

由于代理 iframe 是本地的并且具有相同的来源,因此您可以毫无问题地打印它,它还会打印跨域 iframe。

请参阅下面的示例:

index.html(容器)

 $(function() {
  var url = 'proxy.html'; // We're not loading the PDF but a proxy which will load the PDF in another iframe.

  var iframe = $('<iframe src="' + url + '"></iframe>').appendTo($('#main'));

  iframe.on('load', function(){
    iframe.get(0).contentWindow.print();
  });
});

proxy.html(代理)

 <body>
  <iframe src="http://ANOTHER_DOMAIN/PDF_NAME.pdf"></iframe>
</body>

使用此解决方案,您不再有跨域问题,您可以使用 print() 函数。您唯一需要处理的是一种将 PDF url 从容器传递到代理的方法,以及一种检测带有 PDF 的 iframe 何时实际加载的方法,但这取决于您使用的解决方案/语言。

原文由 HiDeoo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏