[英]Open PDF in a new Tab in Safari
幫助我,我非常需要幫助。 現在到真正的問題。
我一直試圖讓我的 pdf 在 Safari 的新選項卡中打開,但直到現在我都感到失望。 我正在使用 jsPDF 生成我的 PDF,之前我用過它
doc.save(pdfName+".pdf")
方法相同,因為在最新的 safari 版本“9.1.1(10601.6.17)”中它壞了。 我仍然可以使用 jsPDF 的內置選項生成 pdf:
pdf.output('dataurl');
但是,它傾向於在同一個選項卡中打開 PDF,這種行為是非常不可取的。 我嘗試了網上提供的各種解決方案來解決問題,但都沒有用。 我嘗試過的一些解決方案是:
還嘗試通過創建錨標記並將其目標設置為“_blank”然后使用 eventDispatcher 來刺激鼠標點擊來進行假點擊,但它也沒有用。 像這樣:
var a = window.document.createElement("a"); a.target = '_blank'; a.href = 'http://www.google.com'; var e = window.document.createEvent("MouseEvents"); e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e);
關於我應該做什么的任何建議? 我希望我的 pdf 在新選項卡中打開,而不是在與我的應用程序相同的選項卡中打開。
PS:我在上面為 Safari 嘗試過的每個解決方案在 Chrome 和 Mozilla Firefox 中都可以完美運行,我只是不知道 Safari 有什么問題。 任何幫助,將不勝感激。
你可以嘗試blob
輸出。 然后為此生成一個數據URI,並在新窗口中打開它:
var blob = pdf.output("blob");
window.open(URL.createObjectURL(blob));
如果你能得到你的 PDF 作為 base64,這就是你可以做到的(適用於 Safari 和 Chrome)
let base64PDF = "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP....."// your base64 pdf data
let pdfWindow = window.open("", "_blank");
pdfWindow.document.write(
"<title>Healthcare</title><iframe width='100%' style='margin: -8px;border: none;' height='100%' src='data:application/pdf;base64, " +
encodeURI(base64PDF) +
"'></iframe>"
);
嘗試了 stackoverflow 中提到的許多解決方案,但對我沒有任何作用,后來檢查了 FileSave.js 實現並為此問題創建了一個有效的解決方案。
downloadPdfMobile
中,if 部分用於 Web safari else
部分用於移動 safari。首先,您需要從 jsPDF 中獲取 base64 字符串
const doc = new jsPDF.jsPDF({ unit: 'pt', putOnlyUsedFonts: true});
const pdfElement = document.getElementById('id');
var pdfName = 'Test.pdf';
doc.html(pdfElement, {
callback: (pdf) => {
var base = pdf.output('datauristring').split(',')[1];
downloadPdfMobile(pdfName, base);
},
margin: 20,
});
這就是 downloadPdfMobile 函數的樣子,首先您需要轉換 base64 t Blob。
downloadPdfMobile: function (FileName, content) {
var _global =
typeof window === "object" && window.window === window
? window
: typeof self === "object" && self.self === self
? self
: typeof global === "object" && global.global === global
? global
: this;
var isMacOSWebView =
_global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent);
var blob = this.base64toBlob(content);
var popup = open("", "_blank");
if (popup) {
popup.document.title = popup.document.body.innerText = "downloading...";
}
var force = blob.type === "application/octet-stream";
var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari;
var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent);
if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== "undefined") {
var reader = new FileReader();
reader.onloadend = function () {
var url = reader.result;
url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, "data:attachment/file;");
if (popup) popup.location.href = url;
else location = url;
popup = null;
};
reader.readAsDataURL(blob);
} else {
var URL = _global.URL || _global.webkitURL;
var url = URL.createObjectURL(blob);
if (popup) popup.location = url;
else location.href = url;
popup = null;
setTimeout(function () {
URL.revokeObjectURL(url);
}, 4e4);
}
}
base64toBlob: function (base64str) {
var binary = atob(base64str.replace(/\s/g, ""));
var len = binary.length;
var buffer = new ArrayBuffer(len);
var view = new Uint8Array(buffer);
for (var i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
return new Blob([view], {
type: "application/pdf",
});
},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.