我有一些代码旨在将pdf文件发送回网络浏览器。在该代码中,http服务器移交了一个响应流,我可以将我的pdf ooutput传送到。
const server = http.createServer((req, res) => {
var doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
doc.pipe(res);
doc.text('Writing text to document');
doc.end();
});
我现在想使用nodemailer将相同的pdf文档作为附件邮寄。所以我想我需要做这样的事情
const Stream = require('stream').Readable;
const stream = new Stream();
transport.sendMail({
to: someone@somewhere,
subject: 'Info You Wanted',
text: 'The data you want is in pdf attachments',
attachments: [{
filename: 'dummy.pdf',
content:stream
}]
});
const doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
doc.pipe(stream);
doc.text('Writing text to document');
doc.end();
这是我感到困惑的地方。以上是正确的吗?文档暗示我应该扩展一个Readable,但我不确定是什么
答案 0 :(得分:0)
PDFDocument实例是可读的节点流。 他们没有自动保存在任何地方 ,但您可以调用管道方法将PDF文档的输出发送到另一个可写的节点流,因为它正在写入。完成文档后,请调用end方法以完成它。下面是一个示例,说明如何管道传输文件或HTTP响应。
doc.pipe fs.createWriteStream(' /path/to/file.pdf')#写入PDF doc.pipe res #HTTP响应
现在不推荐在0.5版之前的PDFKit中找到的写入和输出方法
你引用这个网站获取更多信息......祝你好运...... http://pdfkit.org/docs/getting_started.html
答案 1 :(得分:0)
以下是您的操作方法:
创建一个扩展stream.PassTrough
const PassThrough = require('stream').PassThrough;
class Tunnel extends PassThrough {
constructor() {
super();
}
setHeader() {
//no op
}
}
创建此类的新实例并将其传递给doc和mail附件
const tunnel = new Tunnel();
transport.sendMail({
to: someone@somewhere,
subject: 'Info You Wanted',
text: 'The data you want is in pdf attachments',
attachments: [{
filename: 'dummy.pdf',
content:tunnel
}]
});
const doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
doc.pipe(tunnel);
doc.text('Writing text to document');
doc.end();
我不得不为普通的PassThrough流创建一个细微的变化,因为通过它的实际pdf处理软件回复了一个http请求,因此设置了标题和状态。