我在一个网站上工作,该网站提供 PDF 文件(即时生成)供用户查看和下载。用户需要保存这些,签署它们(使用任何第 3 方 PDF 应用程序),然后上传它们。 对于这个特定问题,我们专注于将 PDF 从 iOS 上的 Chrome 传递到第 3 方 PDF 应用程序。
在不安全的公共(public)网站上,通过公共(public)链接查看 PDF,例如 this IRS form工作正常。您可以查看它,然后按右下角的“打开方式...” 并选择另一个应用程序。另一个应用程序将收到 PDF 的 URL 并正常打开它。
但是,在安全网站上,交接不会正确发生。按 PDF 右下角的“打开方式...”并选择第 3 方 PDF 应用程序后,其他应用程序将收到 URL,但不会收到维持 session 状态所需的 cookie。因此,当它下载 PDF 时,它会获得网站的登录页面。不同的应用程序对此有不同的处理方式,但例如,Google Drive 会将登录页面保存为损坏的 PDF 文件。 请注意,这在 Safari 中运行良好,问题出在 iOS Chrome 上。
我尝试做的是让 iOS 上的 Chrome 浏览器将 PDF 作为 blob 加载,然后创建一个数据 url 并使用它显示 PDF:
<a id="myLink">Click here to test PDF data url</a>
<script>
$('#myLink').click(function() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/f1099msc.pdf');
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
if (this.status == 200) {
var blob = new Blob([this.response], { type: 'application/pdf' });
var reader = new FileReader();
reader.onloadend = function() {
window.open(reader.result);
};
reader.readAsDataURL(blob);
}
};
xhr.send();
return false;
});
</script>
这种方法工作正常并成功显示 PDF。但是,按右下角的“打开方式...”将 PDF 移交给另一个应用程序不起作用。按下它没有反应。我认为这是因为数据 url 很大,并且不支持移交给另一个应用程序。
有什么想法吗?如何在 iOS 上使用 iOS Chrome 的“打开方式”功能将 PDF 隐藏在安全网站或大数据 URL 中?
Here is an example page that will load a PDF as a data url. 它只能在 Chrome iOS 上显示 PDF。其他浏览器不喜欢这种方法。
最佳答案
问题的根源似乎是 iOS 版 Chrome 中的实现行为。在 https://bugs.chromium.org/p/chromium/issues/detail?id=831678 提出了一个问题解决丢失的 cookie。
作为一种替代方法,可以生成一个临时 URL,其中包含所有必要的身份验证详细信息,并且不依赖于随请求一起发送的 cookie。
使用这些临时 URL 在 Chrome 中打开 PDF。按“打开方式...”按钮将该临时 URL 传递给第三方应用程序。出于安全原因,您应该停用基于时间或调用次数的临时 URL。还可以实现限制,即临时 URL 仅对那个确切的 IP 地址有效。
关于javascript - 如何在 iOS 上将 iOS Chrome 的 "Open in"功能与 protected 网站后面的 PDF 或大数据 URL 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50681521/