我正在开发一个Chrome文件扩展程序,可以将文件保存到下载文件夹中(这不是它所做的全部,但那是我遇到问题的部分)。现在我专注于PDF文件。基本上,当在Chrome中打开PDF时,用户可以使用Menu -> Save File As
手动保存... ...,我只是尝试使用扩展程序自动执行此功能,但我还没有找到很好的方法。
我们可以说我可以检测当前标签中是否有PDF文件(基于this问题的答案)。
到目前为止,我发现的最好的事情是发起下载:
chrome.downloads.download({
url: tabs[0].url, saveAs: false,
filename: "my file", /* This will be some unique autogenerated identifier */
conflictAction: "overwrite"
});
这有效,但有两个缺点:
有更好的方法来保存文件吗?
答案 0 :(得分:3)
注意,chrome / chrome浏览器似乎会将embed
元素附加到document.body
以显示.pdf
个文件
a)利用pdf
,window.location.href
检测document.querySelectorAll("embed")[0].type
;
b)利用XMLHttpRequest
从document
请求现有pdf
,其中应document
blob
作为cache
回复。见console
- > Network
- > Headers
- > Status Code
要允许在chrome / chrome浏览器中打开file:
protocol
,请尝试使用命令行标记--allow-access-from-files
;见How do I make the Google Chrome flag “--allow-file-access-from-files” permanent?
.pdf
document
,即; Ecma-262.pdf尝试
// check if `document` is `pdf`
if (/pdf/i.test(window.location.href.slice(-3))
|| document.querySelectorAll("embed")[0].type === "application/pdf") {
var xhr = new XMLHttpRequest();
// load `document` from `cache`
xhr.open("GET", "", true);
xhr.responseType = "blob";
xhr.onload = function (e) {
if (this.status === 200) {
// `blob` response
console.log(this.response);
var file = window.URL.createObjectURL(this.response);
var a = document.createElement("a");
a.href = file;
a.download = this.response.name
|| document.querySelectorAll("embed")[0].src
.split("/").pop();
document.body.appendChild(a);
a.click();
// remove `a` following `Save As` dialog,
// `window` regains `focus`
window.onfocus = function () {
Array.prototype.forEach.call(document.querySelectorAll("a")
, function (el) {
document.body.removeChild(el)
})
}
};
};
xhr.send();
};
答案 1 :(得分:1)
仅解决问题的文件://方面。您的扩展程序是否有权访问file://。要访问您的扩展程序,都需要请求file:// / ,并且用户必须从扩展页面手动授予此访问权限。您可以使用https://developer.chrome.com/extensions/extension#method-isAllowedFileSchemeAccess检查您是否拥有必要的权限。
有关访问file:// urls的更多信息,请参阅Adding file://. permission to chrome extension。您可能还会发现How can I enable my chrome extension in incognito mode?有帮助。
对于相关讨论(虽然因为您已经有PDF文件而不是特定于您的用例),但也请参阅https://code.google.com/p/chromium/issues/detail?id=169337。