Я пытаюсь сгенерировать PDF с помощью внешнего API, а затем вернуть этот PDF клиенту, не сохраняя его на сервере. Я знаю, что мне нужно использовать fs.createReadStream или pipe, но я не могу понять, как это реализовать. Я использую Express на бэкэнде и axios на веб-интерфейсе, хотя я счастлив использовать все, что работает. Это нужно только для Chrome, потому что это внутренний инструмент.
PDF возвращается и сохраняется должным образом с помощью CURL, но почему-то не сохраняет серверную часть, когда я использую JS API (в идеале, он не должен был бы сохранять, но это не имеет значения, пока он попадает к клиенту ). Я пробовал несколько вариантов pipe и readStream и writeStream, а также просто возвращал .pipe (res) из вызова API, и я могу получить пустой PDF для загрузки на стороне клиента, но он никогда не имеет данных.
Вот код для внешнего интерфейса:
.then((response)=>{
console.log('done', response)
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'file.pdf');
document.body.appendChild(link);
link.click();
})
И задняя часть:
app.post('/pdf', async (req, res) => {
const data = req.body.data;
res.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename=result.pdf"
});
await request.post('https://www.pdfotter.com/api/v1/pdf_templates/[templateID]/fill')
.form(data)
.auth([API KEY], '')
.pipe(fs.createWriteStream('result.pdf'));
const filePath = __dirname + '/result.pdf';
// Check if file specified by the filePath exists
fs.exists(filePath, (exists) => {
if(exists) {
fs.createReadStream(filePath).pipe(res);
} else {
res.writeHead(400, {"Content-Type": "text/plain"});
res.end("ERROR File does not exist");
}
});
}
В идеале я хотел бы использовать API для создания PDF, а затем вернуть PDF клиенту (или передать PDF на Google Drive) без сохранения на сервере.