Nodejs:将文档转换为 PDF

Posted

技术标签:

【中文标题】Nodejs:将文档转换为 PDF【英文标题】:Nodejs: Convert Doc to PDF 【发布时间】:2017-01-13 19:15:19 【问题描述】:

我发现了一些 repos,它们看起来不像仍然在维护:

https://github.com/gfloyd/node-unoconv https://github.com/skmp/node-msoffice-pdf ...

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

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

doc buffer -> pdf buffer

问题:

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

【问题讨论】:

这方面有什么好的开始吗?? 对此有任何解决方案吗? libreoffice 花了我 4 个小时来安装,但仍然无法从命令行运行 【参考方案1】:

对于那些现在可能偶然发现这个问题的人:

有一个很酷的工具叫做Gotenberg — Docker 驱动的无状态 API,用于将 html、Markdown 和 Office 文档转换为 PDF。支持通过unoconv转换DOC。

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

我欢迎你使用它:)

UPD: Gotenberg 现在有了新网站 — https://gotenberg.dev

【讨论】:

使用无服务器是否可行?我很想使用它,但我正在使用 Firebase Cloud Functions,从我读到的内容中,我需要在单独的实例上使用 Gotenberg,所以第二个问题是它是否可扩展。谢谢! @jeand'arme Gotenberg 容器应该在某个地方运行,据我所知,不幸的是,没有任何公共实例。您应该在您的基础架构中运行它。关于可扩展性,Gotenberg 是无状态的,因此您可以随心所欲地扩展它。 Gotenberg 文档中有关于可扩展性的部分:thecodingmachine.github.io/gotenberg/#scalability @yumma 感谢您的链接!我现在遇到了不同的问题 - 如何在 Google Cloud Run 上部署它。我什至在这里提出了一个问题:***.com/questions/66316490/… 如果您对此有任何解决方案,将不胜感激 @yumma 它有效。将简单的 docx 转换为 pdf 平均需要 10-25 秒(尝试了多个版本,似乎 4k 的 RAM 和 2 个 CPU 的工作效果最好——有时不到 7 秒)。感谢分享这个库!【参考方案2】:

在创建应用程序时,我需要将用户上传的 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。

【讨论】:

这应该被标记为已接受的答案。唯一缺少的细节是: const promisify = require('bluebird'); 这在 Google Cloud Functions 等无服务器功能中是否可行?看起来很不错,很想用它 如果谷歌云功能的工作方式类似于 aws lambda,那么可以。我们需要压缩 libreoffice-convert 并将其添加到我们的函数中,以便我们可以使用它。【参考方案3】:

要将文档转换为 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();

【讨论】:

我沿着这条路走,在 Amazon Linux 上,它让我很难设置 unoconv 及其依赖项,因为 Yum 没有所有软件包,手动安装也浪费了我很多时间。跨度> 【参考方案4】:

根据@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
        );

【讨论】:

这可行,但这不是并发的,一次只能转换一个文件。如果有多个用户同时访问 API 怎么办?我已经使用 Node + Express 实现了这个,但这是一个后备 - 没有并发转换。【参考方案5】:

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,它将在您提供的输出路径上生成

【讨论】:

docx-pdf 使用文件系统,请求是使用缓冲区。 nativedocuments 不需要将文件写入磁盘,非常适合无服务器功能 这需要 PhantomJS,它已被弃用且不再受支持

以上是关于Nodejs:将文档转换为 PDF的主要内容,如果未能解决你的问题,请参考以下文章

问:如何将PDF文档(表格式的)转换为Excel格式?

将PDF文件转换为word文档格式

将Word文档转换为PDF文件的步骤和技巧

如何将PDF文件转换为能编辑的Word文档

如何将 Word 文档转换为 PDF? [关闭]

怎么将HTML文档转换为Word文档?