Chrome扩展程序 - 保存PDF文件

时间:2015-03-18 05:35:19

标签: javascript google-chrome pdf google-chrome-extension

我正在开发一个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"
});

这有效,但有两个缺点:

  • 该文件必须重新下载,如果它很大,那就太痛苦了。此外,该文件已经下载,所以我应该可以使用它。
  • 由于某些原因,这不适用于本地打开的文件(" file://...")。它会抛出一个NETWORK_INVALID_REQUEST并且不会下载。

有更好的方法来保存文件吗?

2 个答案:

答案 0 :(得分:3)

注意,chrome / chrome浏览器似乎会将embed元素附加到document.body以显示.pdf个文件

  1. a)利用pdfwindow.location.href检测document.querySelectorAll("embed")[0].type;

    b)利用XMLHttpRequestdocument请求现有pdf,其中应document blob作为cache回复。见console - > Network - > Headers - > Status Code

  2. 要允许在chrome / chrome浏览器中打开file: protocol,请尝试使用命令行标记--allow-access-from-files;见How do I make the Google Chrome flag “--allow-file-access-from-files” permanent?


  3. .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