Nodejs:将Doc转换为PDF

时间:2016-09-06 10:48:16

标签: node.js pdf doc

我找到了一些repos,看起来并不像它们仍然保留:

我用libreoffice尝试approach,但pdf输出非常糟糕,无法使用(差异页面上的文字等)。

如果可能,我想避免启动任何后台进程和/或在服务器上保存文件。最好的解决方案是我可以使用缓冲区。出于隐私原因,我不能使用任何外部服务。

doc buffer -> pdf buffer

问题:

如何在nodejs中将文档转换为pdf?

6 个答案:

答案 0 :(得分:3)

迟来的答案,但是您现在可以尝试我们刚刚发布(2019年1月)的https://www.npmjs.com/package/@nativedocuments/docx-wasm

它将在本地执行转换,不需要LibreOffice,unoconv或其他任何东西。

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密钥(免费增值模型)。

答案 1 :(得分:2)

从docx到pdf 一个将docx文件转换为pdf的库。

安装:

npm install docx-pdf --save

用法

 var docxConverter = require('docx-pdf');

   docxConverter('./input.docx','./output.pdf',function(err,result){
   if(err){
      console.log(err);
     }
    console.log('result'+result);
 });

its basically docxConverter(inputPath,outPath,function(err,result){
  if(err){
   console.log(err);
  }
   console.log('result'+result);
 });

输出应为output.pdf,它将在您提供的输出路径上生成

答案 2 :(得分:2)

对于那些如今可能会迷失于这个问题的人:

有一个很酷的工具,称为Gotenberg -由Docker驱动的无状态API,用于将HTML,Markdown和Office文档转换为PDF。它支持通过unoconv转换DOC。

我恰好是Gotenberg的JS / TS客户端的作者-gotenberg-js-client

我欢迎您使用它:)

答案 3 :(得分:1)

要将文档转换为PDF,我们可以使用Universal Office Converter (unoconv)命令行实用程序。

它可以由任何包管理器安装在您的操作系统上,例如使用apt-get

在ubuntu上安装它
sudo apt-get install unoconv

根据unoconv的文档

  

如果您手动安装了unoconv,请确保已安装所需的LibreOffice或OpenOffice软件包

以下示例演示了如何调用unoconv实用程序

unoconv -f pdf sample_document.py

它生成包含sample_document.py

内容的PDF文档

如果您想使用nodeJS程序,那么您可以通过child process

调用命令

查找以下代码,演示如何使用子进程来使用unoconv创建PDF

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function createPDFExample() {
  const { stdout, stderr } = await exec('unoconv -f pdf sample.js');
  console.log('stdout:', stdout);
  console.log('stderr:', stderr);
}

createPDFExample();

答案 4 :(得分:1)

在创建应用程序时,我需要将用户上传的doc或docx文件转换为pdf文件,以进行进一步分析。我为此目的使用了npm软件包libreoffice-convert。 libreoffice-convert要求在Linux机器上安装libreoffice。这是我使用的示例代码。 这段代码是用JavaScript编写的,用于基于nodejs的应用程序。

const libre = require('libreoffice-convert');
const path = require('path');
const fs = require('fs').promises;
let lib_convert = promisify(libre.convert)

async function convert(name="myresume.docx") {
  try {
    let arr = name.split('.')
    const enterPath = path.join(__dirname, `/public/Resume/${name}`);
    const outputPath = path.join(__dirname, `/public/Resume/${arr[0]}.pdf`);
    // Read file
    let data = await fs.readFile(enterPath)
    let done = await lib_convert(data, '.pdf', undefined)
    await fs.writeFile(outputPath, done)
    return { success: true, fileName: arr[0] };
  } catch (err) {
    console.log(err)
    return { success: false }
  }
}

您将获得高质量的pdf。

答案 5 :(得分:0)

根据@shubham singh提供的答案,为excel发布经过稍微修改的版本。我试过了,效果很好。

    const fs = require('fs').promises;
    const path = require('path');
    const { promisify } = require('bluebird');
    const libre = require('libreoffice-convert');
    const libreConvert = promisify(libre.convert);

        // get current working directory
        let workDir = path.dirname(process.mainModule.filename)
        // read excel file
        let data = await fs.readFile(
          `${workDir}/my_excel.xlsx`
        );
        // create pdf file from excel
        let pdfFile = await libreConvert(data, '.pdf', undefined);
        // write new pdf file to directory
        await fs.writeFile(
          `${workDir}/my_pdf.pdf`,
          pdfFile
        );