没有操作系统依赖关系的nodejs中的PDF到文本提取器

时间:2015-06-09 13:38:51

标签: node.js pdf pdftotext

有没有办法从nodejs中的PDF中提取文本而没有任何操作系统依赖性(如pdf2text或Windows上的xpdf)?我无法找到任何本地人。 nodejs中的pdf包。它们始终是现有OS命令之上的包装器/实用程序。 感谢

4 个答案:

答案 0 :(得分:4)

您检查了PDF2Json吗?它建立在PDF.js之上。虽然它没有将文本输出作为单行提供,但我相信您可能只是根据生成的Json output重建最终文本:

  

'文本':包含位置,实际文本和样式信息的文本块数组:   'x'和'y':定位的相对坐标   'clr':颜色字典中的颜色索引,与'填充'对象中的'clr'字段相同。如果可以在颜色字典中找到颜色,则“oc”字段将作为“原始颜色”值添加到字段中。   'A':文本对齐,包括:   剩下   中央   对   'R':一个文本运行数组,每个文本运行对象有两个主要字段:   'T':实际文字   'S':样式字典中的样式索引。有关'Style Dictionary'的更多信息,请参阅'Dictionary Reference'部分

答案 1 :(得分:2)

经过一些工作,我终于有了使用cause issues

读取PDF文本的可靠功能

要使其正常工作,请首先在命令行上安装npm:

npm i pdfjs-dist

然后使用此代码创建一个文件(在此示例中,我将文件命名为“ pdfExport.js”):

const pdfjsLib = require("pdfjs-dist");

async function GetTextFromPDF(path) {
    let doc = await pdfjsLib.getDocument(path).promise;
    let page1 = await doc.getPage(1);
    let content = await page1.getTextContent();
    let strings = content.items.map(function(item) {
        return item.str;
    });
    return strings;
}
module.exports = { GetTextFromPDF }

然后可以将其简单地用在您喜欢的任何其他js文件中:

const pdfExport = require('./pdfExport');
pdfExport.GetTextFromPDF('./sample.pdf').then(data => console.log(data);

答案 2 :(得分:1)

我想在这里为以后遇到这个问题的任何人提供帮助。 我遇到了这个问题,花了数小时在NPM上的所有PDF库上。我的要求是我需要在AWS Lambda上运行它,因此不能依赖于操作系统依赖性。

下面的代码改编自另一个stackoverflow答案(我目前无法找到)。唯一的区别是,我们导入了可用于Node> = 12的ES5版本。如果仅导入pdfjs-dist,则会出现“未定义可读流”错误。希望对您有帮助!

import * as pdfjslib from 'pdfjs-dist/es5/build/pdf.js';

export default class Pdf {
  public static async getPageText(pdf: any, pageNo: number) {
    const page = await pdf.getPage(pageNo);
    const tokenizedText = await page.getTextContent();
    const pageText = tokenizedText.items.map((token: any) => token.str).join('');
    return pageText;
  }

  public static async getPDFText(source: any): Promise<string> {
    const pdf = await pdfjslib.getDocument(source).promise;
    const maxPages = pdf.numPages;
    const pageTextPromises = [];
    for (let pageNo = 1; pageNo <= maxPages; pageNo += 1) {
      pageTextPromises.push(Pdf.getPageText(pdf, pageNo));
    }
    const pageTexts = await Promise.all(pageTextPromises);
    return pageTexts.join(' ');
  }
}

用法

const fileBuffer = fs.readFile('sample.pdf');
const pdfText = await Pdf.getPDFText(fileBuffer);

答案 3 :(得分:0)

您可以直接使用PDF.js(https://github.com/mozilla/pdfjs-dist),而不是使用建议的PDF2Json。这样做的好处是,您不依赖于拥有PDF2Json的谦虚并且他更新PDF.js基础。