chrome PDF查看器无法下载文件

时间:2017-05-26 07:58:11

标签: google-chrome pdf pdf-viewer

这是我的情况,我有一个运行PDF生成器的服务器,当我用一些参数提出请求时,它会给我一个PDF文件,PDF不会存储在它生成的服务器中运行时。

一切顺利,我可以在chrome的PDF查看器中打开PDF,但如果要下载文件,则会出现错误,如图所示。 enter image description here

因为Chrome转到原始网址来请求文件,但该文件不是服务器上的静态资源。

我不知道是否有人遇到过这个问题?

3 个答案:

答案 0 :(得分:3)

Chrome内置的PDF查看器将通过PDF的原始网址下载pdf文件。因此,如果PDF是在服务器运行时生成的,并且如果它未存储在服务器中,则下载可能会失败。

请点击此处链接:https://productforums.google.com/forum/#!topic/chrome/YxyVToLN8ho

答案 1 :(得分:3)

每当您离开用于创建对象网址(window.URL.createObjectURL(...))的网站时,该对象将获得垃圾回收。所以你需要以某种方式保持对该对象的引用。

这适用于我们的Chrome,Firefox,Safari,iOS Safari& Android首先在功能强大的浏览器中显示PDF 在新标签中,然后允许下载(在IE中它只是开始下载):

function openPdfInNewTab(url,
                         postData,
                         description = 'Document',
                         filename = description + '.pdf') {
  if (!window.navigator.msSaveOrOpenBlob) {
    var tabWindow = window.open('', '_blank');
    var a = tabWindow.document.createElement('a');
    a.textContent = 'Loading ' + description + '..';
    tabWindow.document.body.appendChild(a);
    tabWindow.document.body.style.cursor = 'wait';
  } else {
    spinnerService.show('html5spinner');
  }

  $http.post(url, postData, {responseType: 'arraybuffer'})
    .then(function showDocument(response) {
      var file = new Blob([response.data], {type: 'application/pdf'});
      if (window.navigator.msSaveOrOpenBlob) {
        spinnerService.hide('html5spinner');
        window.navigator.msSaveOrOpenBlob(file, filename);
      } else {
        tabWindow.document.body.style.cursor = 'auto';
        var url = a.href = window.URL.createObjectURL(file);
        a.click();
        a.download = filename;
      }
      $timeout(function revokeUrl() {
        window.URL.revokeObjectURL(url);
      }, 3600000);
    }, handleDownloadError);
}

我们一直在新的浏览器标签中打开PDF并遇到类似的问题。

对于我们来说,当我们使用window.URL.createObjectURL而不是显示PDF但不允许下载的tabWindow.URL.createObject时,它又开始工作了。

答案 2 :(得分:0)

只需附加一条评论:

我们在一个项目中遇到了同样的问题,仅在Chrome上。

经过认证的GET请求将从API提取PDF作为附件,我们将通过window.createObjectURL(blob)将其转发到浏览器查看器。

Network Error是由于我们在打开PDF后调用了window.revokeObjectURL(url);。当我们删除该行时,该blob在打开后并没有立即被垃圾回收。

fetch(request)
   .then(async response => {

       if (!response.ok) {
         return reject(response.statusText);
       }

       const blob = await response.blob();
       const url = await window.URL.createObjectURL(blob);

       window.open(url, '_blank');
       URL.revokeObjectURL(url); // This line was causing the problem
       resolve();
   })
   .catch(reject)