Как отправить PDF-файл как res в циклическом удаленном методе?

#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).