import fs from 'fs'
import AWS from 'aws-sdk';
import { PDFDocument } from 'pdf-lib'
const s3 = new AWS.S3();

export const handler = async (event) => {
    console.log({ PDFDocument, event })
    const bucket = event.Records[0].s3.bucket.name;
    const key = event.Records[0].s3.object.key;

    console.log("KEy", { bucket, key, record: JSON.stringify(event) })

    const params = {
        Bucket: bucket,
        Key: key
    }
    const pdf = await s3.getObject(params).promise();

    console.log("PDF BODY", { pdf })

    const pdfDoc = await PDFDocument.load(pdf.Body);
    console.log("event", { bucket, key, pdf })
    const promises = [];
    for (let i = 0; i < pdfDoc.getPages().length; i++) {
        // Create a new "sub" document
        const subDocument = await PDFDocument.create();

        // copy the page at current index
        const [copiedPage] = await subDocument.copyPages(pdfDoc, [i])
        subDocument.addPage(copiedPage);
        const pdfBytes = await subDocument.save()


        const splitFile = key.split('.pdf')[0] + '_' + i + '.pdf';
        console.log("SPLIT NAME",{key:key.split('.pdf')[0] + '_' + i + '.pdf',splitFile})
        promises.push(s3.putObject({
            Bucket:"splitedfile",
            Key: splitFile,
            Body: pdfBytes
        }).promise());
    }

  const response =  await Promise.all(promises);
        console.log("response",{response})
    return {
        message: 'PDF file split and saved to S3 successfully.'
    };
};`

Это функция AWS Lambda, написанная на Node.js, которая используется для разделения файла PDF на несколько файлов PDF, по одному на каждую страницу исходного файла.

Сначала код импортирует три библиотеки:

  • fs (файловая система): встроенная библиотека в Node.js, используемая для работы с файловой системой системы, в которой выполняется код. В этом коде он не используется.
  • AWS (Amazon Web Services) из «aws-sdk»: библиотека для работы с Amazon Web Services. В этом коде он используется для взаимодействия с Amazon S3 (Simple Storage Service), облачной службой хранения объектов.
  • PDFDocument из «pdf-lib»: библиотека для работы с файлами PDF (Portable Document Format). В этом коде он используется для загрузки файлов PDF и управления ими. Затем создается экземпляр клиента S3 с помощью new AWS.S3(). Этот экземпляр будет использоваться для взаимодействия со службой S3.

Основная логика функции находится внутри функции-обработчика. Эта функция будет вызываться при запуске AWS Lambda.

Функция начинается с регистрации объекта события, который передается в качестве аргумента. Этот объект события содержит информацию о событии, вызвавшем срабатывание функции. В этом случае он должен содержать информацию о только что созданном или обновленном объекте S3.

Затем из объекта события извлекается имя корзины S3 и ключ объекта. Ключ представляет собой путь объекта в корзине S3.

Затем функция использует метод s3.getObject для получения содержимого файла PDF из корзины S3. Методу передается объект с двумя свойствами, Bucket и Key, которые представляют имя корзины S3 и ключ объекта соответственно.

После извлечения содержимого файла PDF функция использует метод PDFDocument.load для загрузки документа PDF.

Затем функция создает массив промисов, где каждый промис представляет собой задачу разделить одну страницу PDF-документа на отдельный файл и сохранить его на S3.

Для каждой страницы документа PDF функция создает новый документ PDF с помощью метода PDFDocument.create. Затем он использует метод copyPages для копирования страницы из исходного документа в новый документ. Наконец, он использует метод сохранения для сохранения нового документа в виде нового файла PDF. Затем содержимое нового файла загружается в S3 с помощью метода s3.putObject.

Как только все обещания выполнены, функция возвращает сообщение о том, что файл PDF был успешно разделен и сохранен на S3.