создать пароль pdf файл в lambda nodejs - PullRequest
0 голосов
/ 14 января 2020

здесь проблема в aws лямбде, использующем node.js для создания пароля в скопированном PDF-файле.

const aws = require("aws-sdk");
const fs = require("fs");
const QPDF = require("node-qpdf");

const s3 = new aws.S3();

exports.handler = async (event) => {

    const params = {
        Bucket: "BucketName", 
        Key: "key"
    };
    const s3Object = await s3.getObject(params).promise();

    fs.writeFileSync('/tmp/test.pdf', s3Object.Body.toString('base64'),{'encoding':'base64'});

    var options = {
        keyLength: 128,
        password: 'abc123',
        restrictions: {
            print: 'low',
            useAes: 'y'
        }
    }

    QPDF.encrypt('/tmp/test.pdf',options,(err)=>{
        if(err)console.log(err,err.stack);
    });

    fs.exists ( '/tmp/test.pdf', function (exists) {

        console.log (exists);

        const file = fs.readFileSync('/tmp/test.pdf');
        console.log(file);
        const params = {
            Bucket: "BucketName", 
            Key: "test.pdf",
            Body: file
        };

        s3.upload(params, (err,data) => {
            if (err) console.log(err);
            console.log(data);
        });
    });

};

это мой код!

я мог бы скопировать свой PDF-файл в S3 и успешно загрузите копию pdf-файла в S3.

Итак, следующий шаг, я хотел создать пароль в этом pdf-файле копии.

Поэтому я использовал здесь код,

        var options = {
            keyLength: 128,
            password: 'abc123',
            restrictions: {
                print: 'low',
                useAes: 'y'
            }
        }

        QPDF.encrypt('/tmp/test.pdf',options,(err)=>{
            if(err)console.log(err,err.stack);
        });

но есть ошибка.

Response:
{
  "errorType": "Error",
  "errorMessage": "/bin/sh: qpdf: command not found\n",
  "trace": [
    "Error: /bin/sh: qpdf: command not found",
    "",
    "    at Socket.<anonymous> (/opt/nodejs/node_modules/node-qpdf/index.js:124:17)",
    "    at Object.onceWrapper (events.js:300:26)",
    "    at Socket.emit (events.js:210:5)",
    "    at Socket.EventEmitter.emit (domain.js:476:20)",
    "    at addChunk (_stream_readable.js:308:12)",
    "    at readableAddChunk (_stream_readable.js:289:11)",
    "    at Socket.Readable.push (_stream_readable.js:223:10)",
    "    at Pipe.onStreamRead (internal/stream_base_commons.js:182:23)"
  ]
}

я установил npm qpdf и node-qpdf и проверил установленные npms.

в чем проблема?

Ответы [ 3 ]

1 голос
/ 14 января 2020

QPDF - это программа командной строки, вам необходимо установить ее ( для системы ) перед ее использованием.

Я проверил ваш код на Ubuntu после установки QPDF и все заработало. Вы можете обратиться к ссылке на репозиторий выше для других систем.

sudo apt-get install qpdf

0 голосов
/ 14 января 2020

Вы должны иметь программу командной строки QPDF во время выполнения. AWS Лямбда имеет концепцию AWS Слоев, которая дает возможность решать подобные проблемы. Вы можете в основном загрузить свою программу как zip на AWS Layer, а затем при создании функции Lambda вы можете дать ссылку на созданный слой.

Подробнее об этом можно прочитать здесь -

https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

  • Хорошо, что вы можете хранить свой код отдельно и свою команду прямая программа отдельная.
  • Слои также могут совместно использоваться различными лямбда-функциями.

Надеюсь, это поможет.

0 голосов
/ 14 января 2020

Вам нужно собрать автономный пакет и добавить его в zip-архив, который вы загружаете в AWS Lambda. Вот дополнительная информация о том, что необходимо сделать для создания пакета: https://github.com/qpdf/qpdf/issues/352

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