是否有一种方法可以从没有任何操作系统依赖的nodejs pdf中提取文本(如pdf2text,或windows上的xpdf)?我无法在nodejs中找到任何"本地"pdf包。它们始终是现有操作系统命令之上的包装器/util。由于
经过一番努力,我终于得到了一个可靠的功能,可以使用https://github.com/mozilla/pdfjs-dist从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));
您检查过PDF2Json了吗?它建立在pdf格式的基础上。虽然它没有提供单行文本输出,但我相信您可以根据生成的Json输出重建最终文本:
' text ':一个包含位置、实际文本和样式信息的文本块数组;'x'和'y':定位的相对坐标'clr':颜色字典中的颜色索引,与'Fill'对象中的'clr'字段相同。如果一种颜色可以在颜色字典中找到,"oc"字段将被添加到字段中作为"原始颜色"值。'A':文本对齐方式,包括:左中心正确的'R':一个文本运行数组,每个文本运行对象有两个主要字段:"T":实际文本'S':样式字典中的样式索引。关于"风格词典"的更多信息可以在"词典参考"部分找到
我想在这里为将来遇到这个问题的人插话。我遇到了这个问题,花了几个小时研究NPM上的所有PDF库。我的需求是我需要在AWS Lambda上运行它,所以不能依赖于操作系统的依赖。
下面的代码改编自另一个stackoverflow答案(我目前找不到)。唯一的区别是我们导入了ES5版本,它可以与Node>= 12一起工作。如果你只是导入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);
此解决方案适用于我使用节点14.20.1使用"pdf-parse": "^1.1.1"
你可以这样安装:
yarn add pdf-parse
这是将PDF文件转换为文本的主要功能。
const path = require('path');
const fs = require('fs');
const pdf = require('pdf-parse');
const assert = require('assert');
const extractText = async (pathStr) => {
assert (fs.existsSync(pathStr), `Path does not exist ${pathStr}`)
const pdfFile = path.resolve(pathStr)
const dataBuffer = fs.readFileSync(pdfFile);
const data = await pdf(dataBuffer)
return data.text
}
module.exports = {
extractText
}
那么你可以像这样使用这个函数:
const { extractText } = require('../api/lighthouse/lib/pdfExtraction')
extractText('./data/CoreDeveloper-v5.1.4.pdf').then(t => console.log(t))
不使用建议的PDF2Json,您也可以直接使用PDF.js (https://github.com/mozilla/pdfjs-dist)。这样做的好处是,你不依赖于谦虚谁拥有PDF2Json,他更新PDF.js库。