当前位置: 首页 > 知识库问答 >
问题:

从Amazon S3中提取PDF,并直接在浏览器中从缓冲区/流中渲染

经正祥
2023-03-14

我有一个要求,PDF不是保存在本地服务器上,而是私下存储在AmazonS3存储桶中。但在特定的请求下,我需要检索PDF并直接在用户的浏览器中呈现,而无需在web服务器上下载

我能够在node.js拉流细,并与PDF数据作出回应。当我检查Chrome开发工具中的响应数据时,它看起来像PDF数据,我甚至可以阅读文档中的文本。

let params = {Bucket: process.env.S3STORAGE, Key: req.query.fileName};
res.attachment(req.query.fileName);
s3.getObject(params).createReadStream().pipe(res);

我尝试了多种方法来正确渲染它。它要么显示空白的PDF,要么显示gobbly-gook-gook PDF数据。

我使用一个vue2模板,并试图弹出PDF在引导模式。在这个尝试中,我得到一个空白的PDF:

<object :data="pdfStream" type="application/pdf" width="800px" :height="browserHeight"></object>


this.pdfStream = response.bodyText;

我看到一些答案说base64对其进行编码,但仍然无法实现。

// server side
let params = {Bucket: process.env.S3STORAGE, Key: req.query.fileName};
s3.getObject(params).createReadStream().pipe(strs('binary', 'base64')).pipe(res);

然后

//client side
 let objbuilder = '';
        objbuilder += ('<object width="100%" height="100%" data="data:application/pdf;base64,');
        objbuilder += (response.bodyText);
        objbuilder += ('" type="application/pdf" class="internal">');
        objbuilder += ('<embed src="data:application/pdf;base64,');
        objbuilder += (response.bodyText);
        objbuilder += ('" type="application/pdf"  />');
        objbuilder += ('</object>');
        this.pdfStream = objbuilder;

当然,我错过了一些简单的事情,或者犯了一个愚蠢的错误,但不确定是什么。我一直只是提供实际的文件,但在这个特定的例子中,目标是直接将数据呈现到浏览器中,而不生成位于S3存储中的PDF副本。

使现代化

杰森的回答为我指明了正确的方向,我相信我现在走在了正确的轨道上。然而,我不确定它是否会抛出错误。

我的第一次尝试是:

// returning a base64 encoded PDF from Amazon to the client
let params = {Bucket: process.env.S3STORAGE, Key: req.query.fileName};
s3.getObject(params).createReadStream().pipe(strs('binary', 'base64')).pipe(res);

然后在客户端Vue组件中:

//import PDFJS from 'pdfjs-dist';
export default {
  {components: PDFJS},
  ...
  ...

  ...
  viewDocument(fileName, documentName) {

      this.$http.get('/fetchDocument', {
        params: {
          fileName: fileName
        }
      })
      .then(response => {

         PDFJS.getDocument(response.bodyText).then(function (pdfDocument) {

          console.log('Number of pages: ' + pdfDocument.numPages);

        });
      });

    },

它回击了这个错误:

app.js:58668 GET http://192.168.3.14:3000/dist/app.worker.js net::ERR_ABORTED
app.js:55073 Warning: Setting up fake worker.
app.js:104 GET http://192.168.3.14:3000/0.js net::ERR_ABORTED
app.js:99 Uncaught (in promise) Error: Loading chunk 0 failed.
    at HTMLScriptElement.onScriptComplete (app.js:99)

没有应用程序。工人js0。pdfjs dist库中的js

然后如果我从没有base64的节点返回原始方式,它将返回原始PDF流,该流开始如下:

%PDF-1.2
%����
3 0 obj
<< 
/Lineariz

我得到了一个完全不同的错误

Uncaught (in promise) TypeError: Failed to construct 'URL': Invalid URL

最后,我在从节点返回的base64编码数据上尝试了base64Uint8Array函数,这导致了应用程序。工人js和0。我刚刚收到的JS404错误。

pdfjs dist包没有这些js文件,因此不确定到底发生了什么。

有什么想法吗?

共有1个答案

席烨
2023-03-14

您需要使用渲染器将PDF数据渲染到浏览器中。Mozilla的PDF就是这样一个项目。JS项目。由于您使用的是vue,因此可以查看以下示例了解其用法:https://github.com/shershen08/vue2-pdfjs-viewer

浏览器中已经内置了PDF阅读器,但不在JS应用程序的上下文中。这就是PDF的位置。JS项目出现了。

 类似资料:
  • 我只使用JavaScript,不使用任何服务器端代码,通过REST API实现了从客户机到AmazonS3的直接文件上载。一切正常但有一件事让我担心... 当我向AmazonS3 REST API发送请求时,我需要对请求进行签名,并将签名放入头中。要创建签名,我必须使用我的密钥。但是所有的事情都发生在客户端,所以,秘密密钥可以很容易地从页面源(即使我混淆/加密我的源)泄露出来。 我该怎么处理?这真

  • 我对SAML的了解非常有限。我正在开发一个通过REST API获取数据的浏览器应用程序。提供商处的API请求可以通过提供用户凭据或通过SAML SSO进行验证。 API提供商的文档说明

  • 我们目前有一个小的web应用程序,其中一部分是文件上传。目前,我们在客户端上使用Plupload,并启用了分块功能,以允许上传大型文件。这些文件被保存在应用服务器上,当它们出现时,这些块被追加。 现在,我们正在使用AmazonS3来存储文件,并有可能使用多个应用服务器。我发现很难处理这些大块。我试着以他们为榜样,但我遇到了问题。我尝试的主要内容是这样的: 我的问题是我需要知道上传的块。当我从上传的

  • 问题内容: 我正在尝试从FTP服务器读取文件。该文件是一个文件。我想知道在套接字打开的情况下是否可以对此文件执行操作。我试图按照什么分两个问题,提到的阅读文件,而不写入磁盘和读取从FTP文件,而无需下载,但没有成功。 我知道如何提取下载文件上的数据/工作,但不确定是否可以即时执行。有没有一种方法可以连接到站点,在缓冲区中获取数据,还可以提取某些数据并退出? 尝试StringIO时出现错误: 我只需

  • 问题内容: 我想执行XMLHttpRequest,然后通过POST方法发送文件名在浏览器中打开PDF。 这可能吗,或者XMLHttpRequest仅用于HTML? 问题答案: 如果您查询的URL实际上返回PDF数据,则无法通过XMLHttpRequest进行操作。 为什么?因为该响应是包含原始PDF数据的HTTP响应。即使您确实可以通过responseText`属性访问数据,JavaScript也

  • 问题内容: 我有一个内存泄漏,我已经将其隔离到错误配置的直接字节缓冲区。 GC收集包含这些缓冲区但不处理缓冲区本身的对象。如果实例化包含缓冲区的瞬态对象足够多,则会得到以下令人鼓舞的消息: 我一直在寻找这个问题,显然 和 不工作。 问题答案: 我怀疑您的应用程序某处有对ByteBuffer实例的引用,这阻止了它被垃圾回收。 直接ByteBuffer的缓冲内存是在普通堆之外分​​配的(以便GC不会移