Конкат два PDF-файла в облачных функциях Firebase с pdf-lib - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь объединить 2 файла PDF, используя pdf-lib (Я получил пример кода с официального сайта pdf-lib). Цель состоит в том, чтобы вызвать функцию облака, когда новый файл загружен в корзину. Затем функция собирает URL файлов, которые должны быть объединены в том же сегменте с новым. Я могу получить URL, но у меня есть ошибка в pdf-lib. Возможно я импортирую это неправильно. Потому что в примере это в синтаксисе ES6 (импорт), но для nodejs необходимо указать. Я новичок в поддержке и nodejs. Так что любая помощь высоко ценится.

    const functions = require('firebase-functions');
    const { Storage } = require('@google-cloud/storage');
    const storage = new Storage();
    const admin = require('firebase-admin');
    admin.initializeApp();
    const { PDFDocument } = require('pdf-lib');
    const fetch = require('node-fetch');

    exports.testCloudFunc = functions.storage.object().onFinalize(async object => {
      const filePath = object.name;

      const { Logging } = require('@google-cloud/logging');
      console.log(`Logged: FILEPATH: ${filePath}`);
      const id = filePath.split('/');
      console.log(`Logged: ID: ${id[0]}/${id[1]}`);
      const bucket = object.bucket;
      console.log(`Logged: BUCKET: ${object.bucket}`);

      async function listFilesByPrefix() {
        const options = {
          prefix: id[0] + '/' + id[1]
        };
        const [files] = await storage.bucket(bucket).getFiles(options);

        const endFiles = files.filter(el => {
          return (
            el.name === id[0] + '/' + id[1] + '/' + 'invoiceReport.pdf' ||
            el.name === id[0] + '/' + id[1] + '/' + 'POD.pdf' ||
            el.name === id[0] + '/' + id[1] + '/' + 'rateConfirmation.pdf'
          );
        });

        endFiles.forEach(el => console.log(el.name));

        const promises = [];
        for (let i = 0; i < endFiles.length; i++) {
          console.log(endFiles[i].name);
          promises.push(
            endFiles[i].getSignedUrl({
              action: 'read',
              expires: '03-17-2025'
            })
          );
        }

        const urlsArray = await Promise.all(promises);

        return urlsArray;
      }

      listFilesByPrefix()
        .then(results => {
          results.forEach(el => console.log(el));
          copyPages(results[0], results[1]);
          return results;
        })
        .catch(console.error);
    });

    async function copyPages(url1, url2) {

      const firstDonorPdfBytes = await fetch(url1).then(res => res.arrayBuffer());
      const secondDonorPdfBytes = await fetch(url2).then(res => res.arrayBuffer());

      const firstDonorPdfDoc = await PDFDocument.load(firstDonorPdfBytes);
      const secondDonorPdfDoc = await PDFDocument.load(secondDonorPdfBytes);

      const pdfDoc = await PDFDocument.create();

      const [firstDonorPage] = await pdfDoc.copyPages(firstDonorPdfDoc, [0]);
      const [secondDonorPage] = await pdfDoc.copyPages(secondDonorPdfDoc, [742]);

      pdfDoc.addPage(firstDonorPage);
      pdfDoc.insertPage(0, secondDonorPage);

      const pdfBytes = await pdfDoc.save();
    }

Но в журналах консоли Firebase Cloud я получаю следующее:

TypeError: Cannot read property 'node' of undefined
    at PDFDocument.<anonymous> (/srv/node_modules/pdf-lib/cjs/api/PDFDocument.js:459:62)
    at step (/srv/node_modules/tslib/tslib.js:136:27)
    at Object.next (/srv/node_modules/tslib/tslib.js:117:57)
    at fulfilled (/srv/node_modules/tslib/tslib.js:107:62)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...