我如何使用 Drive API 将 Google Doc 取为 PDF 文件,并将该 blob 发送给我的 API 消费者?

问题描述 投票:0回答:1

我正在使用Express、Node和Google Drive API。我试图用一个PDF文件的blob响应API调用到我的端点。但是,当我从Drive API中获取文件时,我不想保存它,基本上我只是想将它存储在一个变量中,将其转换为base64,然后将其发送给我的API消费者。

快速概述正在发生的事情。我卡在了步骤3-4。 1. 消费者使用包含支付信息的有效载荷调用我的API端点 2. 我从Template创建一个新的Document,并使用payload使用Docs API来填充文档。3. 我将文档导出为PDF。4. 我向我的API消费者发送一个响应,其中包含步骤3中的Document的blob。

我如何才能实现这一点?

为什么我想实现这个目标?基本上,我试图避免创造额外的工作来下载文件并将其存储在某个地方,因为这样我就需要另一个连接到某个东西。如果我不能避免这种情况,当我想尝试在GCP上使用Buckets来处理这个问题。所以那里的建议也会很有帮助。

下面是我的代码概述。

// this works
const driveAPI = google.drive({version:"v3", auth: client});
const fileId = await createDocFromTemplate();
const doc = updateDoc( fileId, req.body );

// now it gets tricky
const PDF_FILE = exportDocAsPdf(doc); // how can I temporarily store pdf to a variable?
const PDF_AS_BASE = transformPdfToBase64(PDF_FILE); // how can I convert pdf to base64?

// this is what I want to send back to the API consumer
res.send({
  id: fileId,
  fileAsPdf : PDF_AS_BASE
})
node.js google-drive-api
1个回答
2
投票

我相信你的目标如下。

  • 你想导出谷歌文档而不创建一个文件作为base64数据。
  • 你想使用googleapis与Node.js来实现。
  • 你已经能够使用Drive API导出Google Document了。

对于这个问题,这个答案如何?

不幸的是,我不能看到你的脚本 updateDoc( fileId, req.body ), exportDocAsPdf(doc)transformPdfToBase64(PDF_FILE). 所以在这个答案中,我想提出一个通过输入Google文档的文件ID来返回PDF格式的base64数据的示例脚本。

示例脚本。

本例中,输入和输出值分别是Google Document的文件ID和PDF格式的base64数据。

async function exportFile(drive, documentId) {
  const res = await drive.files.export(
    {
      fileId: documentId,
      mimeType: "application/pdf",
    },
    { responseType: "arraybuffer" }
  );
  return Buffer.from(res.data).toString("base64");
}

const documentId = "###";  // Please set the Google Document ID

const driveAPI = google.drive({ version: "v3", auth: client });
const base64 = await exportFile(driveAPI, documentId).catch((err) => {
  if (err) console.log(err);
});
console.log(base64);
  • 在这种情况下,谷歌文档被输出为PDF格式。这时,数据是arraybuffer。所以,base64数据的检索方法是使用 Buffer.from(res.data).toString("base64").

参考文献:

© www.soinside.com 2019 - 2024. All rights reserved.