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的主要内容,如果未能解决你的问题,请参考以下文章