环境准备:
我这边采用的是express做后端语言操作,如果有不同请另外查阅pdfKit操作方式。
导入依赖版本,引入包资源
// 生成pdf文件 const doc = new PDFDocument(); doc.font('/app/utils/微软雅黑.ttf') // const customPDFFont = doc.registerFont('medium','../utils/源柔黑体-Medium.ttf') const uuid = Date.now(); const pdfStream = fs.createWriteStream(`output${uuid}.pdf`) doc.pipe(pdfStream);//关联pdfStream流 doc.fontSize(14).text('我的兴趣类型特点和偏好',{align:'left'}) doc.moveDown();// 移动到下一个段落 // 添加第一个类型和文本 doc.fontSize(12).text(typeOne,{align:'left'}); doc.text(txt1,{align:'left'}); doc.moveDown(); // 移动到下一个段落 // 监听pdfStream完成后的方法 pdfStream.on('finish',()=>{ // 可以在这里加入oss对象存储之类的逻辑... // 读取自己写好的pdf文件 fs.createReadStream(`output${uuid}.pdf`) }) doc.end();
我这边使用了cos对象存储的API
pdfStream.on('finish',()=>{
// 监听是否已经创建完毕了
const params = {
Bucket: '存储桶',
Region: '上传域',
Key: `文件名`,
Body: fs.createReadStream(`output${uuid}.pdf`)
}
cos.putObject(params, (err,data)=>{
if (err) {
console.error(err);
} else {
console.log('文件上传成功:', data);
// 删除临时 PDF 文件
fs.unlink(`output${uuid}.pdf`, (err) => {
if (err) {
console.error('删除 PDF 出错:', err);
} else {
console.log('PDF 文件删除成功');
}
});
res.send({
filePath: `output${uuid}.pdf`,
code: 200
})
}
});
});
大家可以借鉴一下,由于微信小程序不自带导出pdf功能,以此需自己定义导出pdf功能。
我的逻辑是:
1、小程序点击导出
2、后端根据小程序发送的数据找到需要导出的文件数据
3、后端生成pdf文件写入数据
4、将pdf文件上传到oss,返回下载路径给微信小程序