Pdf 通过SendGrid发送受密码保护的附件

Pdf 通过SendGrid发送受密码保护的附件,pdf,sendgrid,email-attachments,password-protection,qpdf,Pdf,Sendgrid,Email Attachments,Password Protection,Qpdf,我想使用SendGrid for nodejs将受密码保护的PDF作为电子邮件附件发送 我尝试使用qpdf对我的pdf进行密码保护。这将输出本地受密码保护的新pdf文件。然后,我尝试从该文件中读取数据,并按照SendGrid的文档将其作为附件内容发送 const fs = require('fs'); const qpdf = require('node-qpdf'); const options = { keyLength: 128, password: 'FAKE_PASSWORD

我想使用SendGrid for nodejs将受密码保护的PDF作为电子邮件附件发送

我尝试使用
qpdf
对我的pdf进行密码保护。这将输出本地受密码保护的新pdf文件。然后,我尝试从该文件中读取数据,并按照SendGrid的文档将其作为附件内容发送

const fs = require('fs');
const qpdf = require('node-qpdf');

const options = {
  keyLength: 128,
  password: 'FAKE_PASSWORD',
  outputFile: filename
}
const attachments = []

await new Promise(res => {
  const writeStream = fs.createWriteStream('/tmp/temp.pdf');
  writeStream.write(buffer, 'base64');
  writeStream.on('finish', () => {
      writeStream.end()
  });
  res();
})
await qpdf.encrypt('/tmp/temp.pdf', options);
const encryptedData = await new Promise(res => {
  const buffers = []
  const readStream = fs.createReadStream('/tmp/temp.pdf');
  readStream.on('data', (data) => buffers.push(data))
  readStream.on('end', async () => {
    const buffer = Buffer.concat(buffers)
    const encryptedBuffer = buffer.toString('base64')
    res(encryptedBuffer)
  })
})
attachments.push({
  filename,
  content: encryptedData,
  type: 'application/pdf',
  disposition: 'attachment'
})

我收到一封带有pdf附件的电子邮件,但它没有密码保护。这两个库是否可以执行此操作?

看起来您正在发送未加密的文件。也许这样行吗

const fs=require('fs');
const qpdf=require('node-qpdf');
常量选项={
密钥长度:128,
密码:“假密码”
}
常量附件=[]
等待新的承诺(res=>{
const writeStream=fs.createWriteStream('/tmp/temp.pdf');
writeStream.write(缓冲区'base64');
writeStream.on('finish',()=>{
writeStream.end()
res();//已更改
});
})
等待qpdf.encrypt('/tmp/temp.pdf',选项,文件名);//改变
const encryptedData=等待新承诺(res=>{
常量缓冲区=[]
const readStream=fs.createReadStream(文件名);//已更改
readStream.on('data',(data)=>buffers.push(data))
readStream.on('end',async()=>{
const buffer=buffer.concat(缓冲区)
const encryptedBuffer=buffer.toString('base64'))
res(加密缓冲区)
})
})
附件.推({
文件名,
内容:encryptedData,
键入:“application/pdf”,
处置:“附件”
})

Ahh是的,似乎我用错误的文件创建了一个流。太好了!我认为您也可以使用封装在Promise中的
fs.readFile
删除大量流式代码
fs extra
默认情况下提供承诺,因此可能会有所帮助。