我能用Node.js阅读PDF或Word文档吗?

19

我找不到任何可以完成这个任务的包。我知道PHP有很多用于处理PDF的库(比如http://www.fpdf.org/),但是Node.js有没有类似的库呢?

9个回答

16

textract 是一个出色的库,支持PDF、Doc、Docx等格式。


1
注意:textract使用catdoc来处理.doc文件,而且在Windows系统中无法运行。 - Tracker1
1
node-office目前已经停止开发(npm宣布其生命周期结束),而textract从2016年9月开始仍在积极开发中。 - steampowered
@NayanPatel 这是由于一些最近的更新。我有一个依赖于那种行为的项目,所以我已经固定了我的版本。 - James_1x0
@James_1x0 你固定的版本是哪个版本? - Nayan Patel

8

纯 JS 解决方案的优点在于它可以在浏览器和 Node 之间移植。 - sdgfsdh

6
你可以轻松将其转换为另一种格式,或使用例如 .doc 模板生成 .pdf 文件,但你可能需要使用现有的网络服务来完成这项任务。
例如,你可以使用 Livedocx 的服务。
要从节点中使用此服务,请参阅 node-livedocx。 (免责声明:我是此节点模块的作者)

3
问题是如何阅读PDF/DOC文件,而不是如何生成文件。此内容与问题无关。 - Elhay Avichzer

4
我建议您首先考虑使用unoconv进行转换,它使用LibreOffice或OpenOffice进行实际转换。这会增加一些开销。
我会设置几个已安装所有必要组件的工作程序,并使用请求/响应队列来处理转换...(可能需要查看kuezmq)。
总的来说,这是一个CPU密集型和繁重的任务,应该被卸载... Pandoc和其他工具特别提到了.docx而不是.doc,因此它们也可能是选项。
注意:我知道这个问题很旧,只是想为其他遇到这个问题的人提供一个当前的答案。

3
您可以使用pdf-text处理pdf文件。它将从pdf中提取文本,并将其转换成文本块的数组。适用于对结构化pdf文本进行模糊解析。
var pdfText = require('pdf-text')
var pathToPdf = __dirname + "/info.pdf"


pdfText(pathToPdf, function(err, chunks) {
  //chunks is an array of strings  
  //loosely corresponding to text objects within the pdf 
  //for a more concrete example, view the test file in this repo 
})

var fs = require('fs')
var buffer = fs.readFileSync(pathToPdf)
pdfText(buffer, function(err, chunks) {
 console.log(chunks)
})

对于docx文件,您可以使用Mammoth工具,它可以从.docx文件中提取文本。

var mammoth = require("mammoth");

mammoth.extractRawText({path: "./doc.docx"})
    .then(function(result){
        var text = result.value; // The raw text 
        console.log(text);
        var messages = result.messages;
    })
    .done();

我希望这能有所帮助。

2

如果你只需要将Word文档转换为HTML,那么另一个很好的选择是Mammoth.js

Mammoth旨在将Microsoft Word创建的.docx文档转换为HTML,并通过使用文档中的语义信息并忽略其他细节来生成简单而干净的HTML。例如,Mammoth将任何样式为“标题1”的段落转换为h1元素,而不是试图精确复制标题的样式(字体、文字大小、颜色等)。

由于.docx使用的结构与HTML的结构之间存在较大的不匹配,因此对于更复杂的文档,转换可能不太完美。 如果你只使用样式对文档进行语义标记,则Mammoth效果最佳。


2

如果需要解析pdf文件,可以使用pdf2json节点模块。

它能够将pdf文件转换为json格式和原始文本数据。


1
这里有一个示例,展示了如何使用PDF.js从PDF中下载并提取文本:
import _ from 'lodash';
import superagent from 'superagent';
import pdf from 'pdfjs-dist';

const url = 'http://unec.edu.az/application/uploads/2014/12/pdf-sample.pdf';

const main = async () => {
  const response = await superagent.get(url).buffer();
  const data = response.body;
  const doc = await pdf.getDocument({ data });
  for (const i of _.range(doc.numPages)) {
    const page = await doc.getPage(i + 1);
    const content = await page.getTextContent();
    for (const { str } of content.items) {
      console.log(str);
    }
  }
};

main().catch(error => console.error(error));

1
您可以使用Aspose.Words Cloud SDK for Node.js从DOC/DOCX、Open Office和PDF中提取文本。这是付费API,但免费计划提供每月150个免费API调用。
附注:我是Aspose的开发者传道者。
const { WordsApi, ConvertDocumentRequest } = require("asposewordscloud");
const fs = require('fs');

// Get Customer ID and Customer Key from https://dashboard.aspose.cloud/
wordsApi = new WordsApi("xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx");

const request = new ConvertDocumentRequest({
                    format: "txt",
                    document: fs.createReadStream("C:/Temp/02_pages.pdf"),
                });
const outputFile = "C:/Temp/ConvertPDFtotxt.txt";
wordsApi.convertDocument(request).then((result) => {    
    console.log(result.response.statusCode);    
    console.log(result.body.byteLength);    
    fs.writeFileSync(outputFile, result.body);
}).catch(function(err) {
    // Deal with an error
    console.log(err);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接