Сохраните ответ на возврат из вызова api в PDF в Javascript

#javascript #node.js #api #pdf

Вопрос:

Я делаю это через Api RingCentral и получаю ответ ниже через запрос узла. Я пытаюсь понять, как я могу сохранить ответ (который должен быть источником PDF), чтобы затем открыть его.

Это и есть ответ.

 Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 5,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: true,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'https://platform.ringcentral.com/restapi/v1.0/account/~/extension/1234/message-store/1234/content/1234?contentDisposition=Inline',
    status: 200,
    statusText: 'OK',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}
 

Это и есть код:

     let getMessageContent = await platform.get('/restapi/v1.0/account/~/extension/' accountId '/message-store/' attachId '/content/' attachId, {
        contentDisposition: ['Inline']
    })
    let jsonMessageContent = await getMessageContent.headers
        console.log(jsonMessageContent)
 

Если я запущу URL-адрес в post man, я смогу увидеть PDF-файл, отображаемый таким образом.

В «Почтальоне» (это всего лишь пример)

 %PDF-1.3
%����
1 0 obj 
<<
/Pages 2 0 R
/Type /Catalog
>>
endobj 
2 0 obj 
<<
/Kids [3 0 R]
/Count 1
/Type /Pages
>>
endobj 
3 0 obj 
<<
/CropBox [0 0 609.882 818.449]
/Parent 2 0 R
/Thumb 4 0 R
/MediaBox [0 0 609.882 818.449]
/Resources 
<<
/XObject 
 

Есть Какие-Нибудь Идеи?

Ответ №1:

Когда в прошлом мне нужно было создать конечную точку, которая брала определенную информацию (часть ее из одного и того же запроса), создавала с ней PDF-файл и подавала его в качестве ответа, я обнаружил, что PDFKit является сильным союзником. Основная причина этого проста: его документации более чем достаточно для выполнения работы. Единственная проблема в том, что заставить ту же самую работу выглядеть немного нормально довольно утомительно. Чтобы создать ваш PDF-файл, я бы предложил нечто pdfCreatorMethod() подобное этому:

 const PDFDocument = require("pdfkit");
const fs = require("fs");

const doc = new PDFDocument({ autoFirstPage: false });

doc.pipe(fs.createWriteStream('PATH/TO/YOUR/PDF'));

doc.registerFont("Helvetica", "client/assets/fonts/Helvetica-01.ttf");
doc.registerFont(
"HelveticaBold",
"client/assets/fonts/Helvetica-Bold-02.ttf"
);

doc.font("Helvetica").fontSize(10).fillColor("#80B3BD").text("", 70, 80, {
width: 100,
align: "left",
lineBreak: true,
});

/**
 * ADD WHATEVER YOU WANT TO YOUR FILE
 */

doc.end();
 

Позволяет вам включать в документ любую информацию, которую вы пожелаете. После этого вам понадобится только ваш маршрут, чтобы указать путь к созданному вами файлу:

 router.put("/mypdf", async (req, res) => {
    try {
      pdfCreatorMethod(req);
      res.set("Content-Type", "application/pdf");
      return res.status(201).sendFile('PATH/TO/YOUR/PDF');
    } catch (e) {
      console.error(e);
      return res.status(500).send({ error: e.message });
    }
});