#javascript #node.js #loopbackjs #jspdf
#javascript #node.js #loopbackjs #jspdf
Вопрос:
Я определяю свой удаленный метод обратной связи следующим образом
Visitor.remoteMethod('getVisitorsPDF', {
description: 'Get visitors list in PDF file',
accepts: [
{ arg: 'res', type: 'object', http: { source: 'res' } },
{ arg: 'dateInStart', type: 'string' },
{ arg: 'dateInEnd', type: 'string' },
{ arg: 'employeeSiteId', type: 'string' },
{ arg: 'name', type: 'string' },
{ arg: 'visitorCompany', type: 'string' },
{ arg: 'employeeName', type: 'string' },
{ arg: 'typeId', type: 'number' },
{ arg: 'shift', type: 'number' }
],
returns: {},
http: { path: '/getpdf', verb: 'get' }
});
и его реализация заключается в следующем:
Visitor.app.models.user.testAccess(res).then(
(current) => {
....
res.set('Content-Type', 'application/pdf');
res.set('Content-Disposition', 'attachment;filename="visitors.pdf"');
...
Visitor._getVisitors(query, current).then(
(visitors) => {
let visitorsFiltered = visitors.filter((v) => {
if (!v.tztimeIn) return v;
let d = v.timeIn v.tztimeIn * 60000;
if (dStart < d amp;amp; d < dEnd) return v;
});
Visitor._getVisitorsPDF(visitorsFiltered)
.then(result => {
res.send(result);
},
);
},
);
}
)
};
И функция, которая генерирует pdf, выглядит следующим образом:
Visitor._getVisitorsPDF = async function (visitors) {
...
const rows = tempData;
const doc = new jsPDF();
doc.autoTable(columns, rows);
doc.save('visitors.pdf');
}
как отправить этот документ обратно в качестве ответа на приложение / pdf? Я застрял здесь
Ответ №1:
Я использовал node-html-pdf для создания и отправки PDF-файлов. Он имеет встроенный метод для возврата буфера.
В вашем коде doc.save('file')
сохраните файл в pwd.
Затем вы могли бы использовать fs
для асинхронного чтения сохраненного файла, а затем буферизировать его для клиента
import stream from "stream";
...
fs.readFile('file', (err, fileBuffer) => {
if (err) throw err;
// console.log(fileBuffer);
let encodedBuffer = Buffer.from(JSON.stringify(fileBuffer));
// create a stream to the receiver
let readStream = new stream.PassThrough();
readStream.end(encodedBuffer);
res.set("Content-disposition", "attachment; filename=" filename);
res.set("Content-Type", "application/pdf");
readStream.pipe(res);
});
Комментарии:
1. хорошо, я попробую это!!!
2. как я могу включить в это изображения..
3. также я не хочу сохранять файл в текущем рабочем каталоге. как это сделать без сохранения в pwd?
4. Ознакомьтесь с разделом примеров в репозитории jspdf. Чтобы сохранить в другой каталог, не уверен, поддерживает ли его jspdf. Проверьте html-pdf.
5. ваш код не работает:-(
Ответ №2:
Где используется обычный объект ответа (типа Request в @loopback / rest), вы можете сделать:
res.download(result)
Вместо
res.send(result).