我正在使用nodemailer和pdfmake创建pdf,并将其在电子邮件的附件中发送。我对 NodeJS 中的文件处理没有太多经验,我无法让它工作。
请参阅保存文件的位置示例。当我检查类型时,
createPdfKitDocument
返回NodeJS.ReadableStream
的扩展。
在 Nodemailer 中,我可以将附件包含为
Stream
或 Readable
请参阅文档。
但是,我无法在不保存附件的情况下发送附件,并给出文件的路径。
我试图按原样提供从
ReadableStream
返回的 createPdfKitDocument
,这会导致悬而未决的承诺。我尝试用Readable.from()
包裹它,但没有成功。我尝试对结果调用.read()
,并没有导致挂起承诺,但无法打开pdf。
有什么想法如何将
ReadableStream
转换为 Readable
或 Buffer
?
NodeJS.ReadableStream
类型流用于较旧的 NodeJS 库和版本。您可以使用 wrap
中的 Readable
方法将 NodeJS.ReadableStream
转换为 Readable 流。
const { OldReader } = require('./old-api-module.js');
const { Readable } = require('node:stream');
const oreader = new OldReader(); // will return stream of NodeJS.ReadableStream
const myReader = new Readable().wrap(oreader);
myReader.on('readable', () => {
myReader.read(); // etc.
});
参考:https://nodejs.org/api/stream.html#stream_read_wrap_stream。有关其他信息,请参阅此 https://nodejs.org/api/stream.html#compatibility-with-older-nodejs-versions
当我尝试使用 puppeteer 的 createPDFStream 方法生成 PDF 文件时,这是一个对我有用的解决方案(打字稿),该方法返回
ReadableStream<Uint8Array>
。
import puppeteer, { Browser } from 'puppeteer';
import { Readable } from 'stream';
import { ReadableStream } from 'stream/web';
/**
* This function renders HTML contents to a PDF file stream
* @param html HTML string
*/
async function renderToStream(html: string) {
let browser: Browser;
try {
browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(html).catch(() => browser.close());
const webStream = await page.createPDFStream();
const nodeStream = Readable.fromWeb(webStream as ReadableStream<any>);
nodeStream.on('end', () => browser.close());
return nodeStream;
} catch (err) {
console.error('PDF rending to stream failed: ', err);
if (browser) {
browser.close();
}
}
}