Как правильно читать PDF в nodejs буфер из метода экспорта Google Drive API? - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь прочитать PDF-файл из Google Drive v2 API метод экспорта в nodejs буфер, чтобы его можно было отправить по электронной почте в виде вложения или сохранить, но при просмотре он выглядит пусто, как и все пробелы. Я ожидаю, что PDF будет выглядеть так же, как при экспорте и просмотре через приложение браузера Google Диска. А именно, что что-то показывает, поскольку content-length: 55243.

я пробовал следующее:

  var drive = google.drive('v2');
  drive.files.export({
    auth: auth,
    fileId: ...,
    mimeType: 'application/pdf'
  })
  .then(res => {

      let buf = Buffer.from(res.data, 'utf-8');//tried 'latin1', didn't work
      fs.writeFileSync("file.pdf", buf);
  })

Необработанный HTTP-ответ

    HTTP/1.1 200 
    cache-control: private, max-age=0, must-revalidate, no-transform
    content-encoding: gzip
    content-length: 55243
    content-type: text/plain; charset=UTF-8
    date: Sat, 01 Feb 2020 15:04:46 GMT
    etag: "x2jdlkqYTB8kzPmV7jH2KPtlR68/iXa-VTcVlqvfqgBwCPMhdnUXfUk"
    expires: Sat, 01 Feb 2020 15:04:46 GMT
    server: GSE
    vary: Origin, X-Origin
    Content-Type: application/pdf

    %PDF-1.4
    ...
    ...

Что нужно исправить в моем коде? Можете ли вы показать, как правильно читать PDF в буфер?

1 Ответ

1 голос
/ 03 февраля 2020
  • Вы хотите экспортировать Документы Google (электронные таблицы, документы и слайды) в виде файла PDF, используя буфер массива с Google Диска.
  • Вы хотите добиться этого с помощью Drive API v2 с googleapis из Node.js.
  • Вы уже смогли получить файл с помощью Drive API.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Шаблон 1:

В этом шаблоне используется буфер массива.

Модифицированный скрипт:

const drive = google.drive({version: "v2"});
drive.files.export(
  {
    auth: auth,
    fileId: "###",  // Please set the file ID of Google Docs.
    mimeType: "application/pdf"
  },
  { responseType: "arraybuffer" },
  (err, res) => {
    if (err) {
      console.log(err);
    } else {
      fs.writeFile("file.pdf", Buffer.from(res.data), function(err) {
        if (err) {
          return console.log(err);
        }
      });
    }
  }
);

Шаблон 2:

В этом шаблоне используется поток.

Модифицированный скрипт:

const drive = google.drive({version: "v2"});
var dest = fs.createWriteStream("file.pdf");
drive.files.export(
  {
    auth: auth,
    fileId: "###",  // Please set the file ID of Google Docs.
    mimeType: "application/pdf"
  },
  { responseType: "stream" },
  function(err, response) {
    if (err) {
      console.log(err);
      return;
    }
    response.data
      .on("end", function() {
        console.log("Done.");
      })
      .on("error", function(err) {
        console.log("Error during download", err);
        return process.exit();
      })
      .pipe(dest);
  }
);

Примечание:

  • Пожалуйста, используйте последнюю версию googleapis.
  • И в приведенном выше сценарии, когда const drive = google.drive({version: "v2"}); изменен на const drive = google.drive({version: "v3"});, можно также использовать Drive API v3.

Ссылки:

Если я неправильно понял ваш вопрос, а это не то направление, которое вы хотите, прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...