Преобразование буфера doc Node.js в файл PDF для вывода его на клиент - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть буфер docx Node.js.

var buf = doc.getZip()
             .generate({type: 'nodebuffer'});

console.log("buffer is ", buf);

Я получаю буфер как

<Buffer 50 4b 03 04 0a 00 00 00 00 00 42 42 3d 4d 23 df 99 8f 65 05 00 00 65 05 00 00 13 00 00 00 5b 43 6f 6e 74 65 6e 74 5f 54 79 70 65 73 5d 2e 78 6d 6c 3c ... >

Я хочу, чтобы он был преобразован в документ PDF и загружен на стороне клиента. Я не хочу, чтобы документ был сохранен на стороне сервера.

У меня есть одно решение, т.е. преобразовать буфер docx в файл docx, а затем файл docx в pdf.

fs.writeFileSync(path.resolve(__dirname, 'output.docx'), buf);
docToPdf('./output.docx').then(
   console.log("it is done")
)

Но, таким образом, документ сохраняется на сервере. И docToPdf также использует LibreOffice. Есть ли лучший способ, которым я могу избежать всего этого.

1 Ответ

0 голосов
/ 23 января 2019

https://www.npmjs.com/package/@nativedocuments/docx-wasm (что нового, как я пишу, январь 2019 г.) будет делать то, что вы хотите.

const fs = require('fs');
const docx = require("@nativedocuments/docx-wasm");

// init docx engine
docx.init({
    // ND_DEV_ID: "XXXXXXXXXXXXXXXXXXXXXXXXXX",    // goto https://developers.nativedocuments.com/ to get a dev-id/dev-secret
    // ND_DEV_SECRET: "YYYYYYYYYYYYYYYYYYYYYYYYYY", // you can also set the credentials in the enviroment variables
    ENVIRONMENT: "NODE", // required
    LAZY_INIT: true      // if set to false the WASM engine will be initialized right now, usefull pre-caching (like e.g. for AWS lambda)
}).catch( function(e) {
    console.error(e);
});

async function convertHelper(document, exportFct) {
    const api = await docx.engine();
    await api.load(document);
    const arrayBuffer = await api[exportFct]();
    await api.close();
    return arrayBuffer;
}

convertHelper("sample.docx", "exportPDF").then((arrayBuffer) => {
    fs.writeFileSync("sample.pdf", new Uint8Array(arrayBuffer));
}).catch((e) => {
    console.error(e);
});

Как видно из вышесказанного, вам понадобится ключ API (его модель freemium). Раскрытие: у меня есть интерес к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...