我使用html-pdf节点库生成PDF,然后使用node-qpdf库对其加密。
pdf.create(htmlString, {format: 'A4', timeout: 600000})
.toFile(filePath, function (err, data) {
if (err) {
logger.error('Error while creating the pdf file ::->', err.stack);
return reject(err);
} else {
logger.info('Successfully able to create the file in tmp');
encrypt(filePath, '/tmp/' + _.get(lead, 'code', '00003') + '_receipt_encrypted.pdf');
return resolve(data);
}
});
var encrypt = function (inputFile, outputFile) {
let exec = require('child_process').exec;
var ownerPass = 'ownerpasswd'
var userPass = 'ownerpasswd'
let cmd = 'qpdf --encrypt ' + ownerPass + ' ' + userPass + ' 256 -- ' + inputFile + ' ' + outputFile
exec(cmd, function (err) {
if (err) {
console.error("The error", err, err.stack)
} else {
console.log("The PDF is encrypted")
}
})
}
当我试图通过电子邮件发送时,我能够在/tmp/文件夹位中生成加密的pdf文件,我得到了错误[Error: ENOENT: no such file or directory, open '/tmp/A6rz2K-p2n_receipt_encrypted.pdf'] {
这是读取文件并通过电子邮件发送的代码。
if (err) {
console.log('error in reading encrypted file================= ', err, err.stack);
}
var attachment = {
content: data.toString('base64'),
name: encryptedFileName,
type: "application/pdf"
};
sendReceiptEmail(lead,attachment);
logger.log("end of receipt pdf creation");
})
return Promise.resolve();
})```
我猜你有异步代码执行的问题。对encrypt
的调用看起来不错,因为该函数是在pdf..toFile
回调函数内部调用的。也许您需要确保encrypt
完成后调用sendReceiptEmail
,在exec
回调函数内。
正如Raya所评论的那样,我建议重构代码,使用承诺或异步代码执行。