在 iPad 的新选项卡中以 base64 格式显示 PDF(Safari 或 Chrome for iOs)2021
Display PDF in base64 in a new tab in iPad (Safari or Chrome for iOs) 2021
我在一个 Angular 网络应用程序中工作,我在其中从后端 API 获取一个 base64 字符串,它表示一个 PDF 文件。我想在新选项卡中打开该 PDF。我尝试过使用 Blob、iframe 和各种方法,所有这些似乎都适用于我的 Mac 的 chrome 和 safari,它们甚至可以在模拟的 iPad(使用 XCode 和模拟设备的 safari),但它们在真实设备上不起作用(iPad)。这是我用来在新标签页中打开 PDF 的代码,都支持 chrome 和 safari:
首先,我确定浏览器是否为 safari。如果是这种情况,我会预先打开新的 window,因为在 safari 中禁止从 XHR 调用内部打开新选项卡:
var isSafari =
navigator.vendor &&
navigator.vendor.indexOf('Apple') > -1 &&
navigator.userAgent &&
navigator.userAgent.indexOf('CriOS') == -1 &&
navigator.userAgent.indexOf('FxiOS') == -1;
if (isSafari) {
var newWindow = window.open('', '_blank');
}
然后,我进行 XHR 调用以获取 base64 格式的 PDF url,并从中创建一个 Blob:
this.dataService
.getPDFUrl(this.data.code)
.subscribe((res) => {
this.pdfUrl = res.message;
var byteCharacters = atob(this.pdfUrl);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var file = new Blob([byteArray], { type: 'application/pdf;base64' });
this.pdfUrl = (window.URL || window.webkitURL).createObjectURL(file);
//If browser is Safari, use a Reader to display the PDF in the previously opened window
if (isSafari) {
var reader = new FileReader();
reader.onloadend = function (e) {
newWindow.location.href = reader.result as string;
};
reader.readAsDataURL(file);
} else {
//If browser is not Safari, open a new window (works in chrome)
window.open(this.pdfUrl, '_blank');
}
});
我已经尝试过这种方法和许多其他方法,其中 none 可以在真实 iPad 上运行,尽管它们确实可以在模拟 iPad.[=15= 上运行]
关于如何让 base64 中的 PDF 正确显示在 iPad 的新选项卡中,您能否提供任何指导?我需要它在 iOs Safari 或 Chrome 中工作 iOs(我知道它们在内部非常相似)。
提前致谢。
Safari 似乎没有遵循 a 标签的标准。我相信 确定了根本原因。来自链接答案中的评论:
Note that specifying a target attribute in Safari seems to override the download attribute (this does not seem to be the case in Chrome, Firefox or Opera).
尝试删除上面代码中的 '_blank'
,然后对其进行测试。应该有用!
不幸的是,我不确定您将如何在新标签页中打开它并进行更改。
我在一个 Angular 网络应用程序中工作,我在其中从后端 API 获取一个 base64 字符串,它表示一个 PDF 文件。我想在新选项卡中打开该 PDF。我尝试过使用 Blob、iframe 和各种方法,所有这些似乎都适用于我的 Mac 的 chrome 和 safari,它们甚至可以在模拟的 iPad(使用 XCode 和模拟设备的 safari),但它们在真实设备上不起作用(iPad)。这是我用来在新标签页中打开 PDF 的代码,都支持 chrome 和 safari:
首先,我确定浏览器是否为 safari。如果是这种情况,我会预先打开新的 window,因为在 safari 中禁止从 XHR 调用内部打开新选项卡:
var isSafari =
navigator.vendor &&
navigator.vendor.indexOf('Apple') > -1 &&
navigator.userAgent &&
navigator.userAgent.indexOf('CriOS') == -1 &&
navigator.userAgent.indexOf('FxiOS') == -1;
if (isSafari) {
var newWindow = window.open('', '_blank');
}
然后,我进行 XHR 调用以获取 base64 格式的 PDF url,并从中创建一个 Blob:
this.dataService
.getPDFUrl(this.data.code)
.subscribe((res) => {
this.pdfUrl = res.message;
var byteCharacters = atob(this.pdfUrl);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var file = new Blob([byteArray], { type: 'application/pdf;base64' });
this.pdfUrl = (window.URL || window.webkitURL).createObjectURL(file);
//If browser is Safari, use a Reader to display the PDF in the previously opened window
if (isSafari) {
var reader = new FileReader();
reader.onloadend = function (e) {
newWindow.location.href = reader.result as string;
};
reader.readAsDataURL(file);
} else {
//If browser is not Safari, open a new window (works in chrome)
window.open(this.pdfUrl, '_blank');
}
});
我已经尝试过这种方法和许多其他方法,其中 none 可以在真实 iPad 上运行,尽管它们确实可以在模拟 iPad.[=15= 上运行]
关于如何让 base64 中的 PDF 正确显示在 iPad 的新选项卡中,您能否提供任何指导?我需要它在 iOs Safari 或 Chrome 中工作 iOs(我知道它们在内部非常相似)。
提前致谢。
Safari 似乎没有遵循 a 标签的标准。我相信
Note that specifying a target attribute in Safari seems to override the download attribute (this does not seem to be the case in Chrome, Firefox or Opera).
尝试删除上面代码中的 '_blank'
,然后对其进行测试。应该有用!
不幸的是,我不确定您将如何在新标签页中打开它并进行更改。