首页 > 解决方案 > 如何使用 Drive API 将 Google Doc 获取为 PDF 文件并将该 blob 发送给我的 API 使用者?

问题描述

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

快速概览正在发生的事情。我被困在第3-4步。1. 消费者使用包含支付信息的有效负载调用我的 API 端点 2. 我从模板创建一个新文档,并使用有效负载通过 Docs API 填充文档。3. 我将文档导出为 PDF。4. 我用步骤 3 中的文档块向我的 API 使用者发送响应。

我怎样才能做到这一点?

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

下面是我的代码的概述,

// 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.jsgoogle-drive-api

解决方案


我相信你的目标如下。

  • 您想要导出 Google 文档而不创建文件作为 base64 数据。
  • 您想使用 googleapis 和 Node.js 来实现这一点。
  • 您已经能够使用 Drive API 导出 Google 文档。

为此,这个答案怎么样?

不幸的是,我看不到您的updateDoc( fileId, req.body ),exportDocAsPdf(doc)transformPdfToBase64(PDF_FILE). 所以在这个答案中,我想提出一个示例脚本,通过输入 Google Document 的文件 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);
  • 在这种情况下,Google 文档将导出为 PDF 格式。那时,数据就是arraybuffer。因此使用Buffer.from(res.data).toString("base64").

参考:


推荐阅读