没有 OS 依赖项的 nodejs 中的 PDF 到文本提取器
PDF to Text extractor in nodejs without OS dependencies
有没有一种方法可以在没有任何 OS 依赖项的情况下从 nodejs 中的 PDF 中提取文本(例如 windows 上的 pdf2text 或 xpdf)?我无法在 nodejs 中找到任何 'native' pdf 包。它们始终是现有 OS 命令之上的 wrapper/util。
谢谢
你检查过了吗PDF2Json? It is built on top of PDF.js. Though it is not providing the text output as a single line but I believe you may just reconstruct the final text based on the generated Json output:
'Texts': an array of text blocks with position, actual text and styling informations:
'x' and 'y': relative coordinates for positioning
'clr': a color index in color dictionary, same 'clr' field as in 'Fill' object. If a color can be found in color dictionary, 'oc' field will be added to the field as 'original color" value.
'A': text alignment, including:
left
center
right
'R': an array of text run, each text run object has two main fields:
'T': actual text
'S': style index from style dictionary. More info about 'Style Dictionary' can be found at 'Dictionary Reference' section
除了使用建议的 PDF2Json,您还可以直接使用 PDF.js (https://github.com/mozilla/pdfjs-dist)。这样做的好处是您不依赖于拥有 PDF2Json 的谦虚,并且他更新了 PDF.js 基础。
经过一番努力,我终于得到了一个可靠的功能,可以使用 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));
我想我会在这里为以后遇到这个问题的任何人插话。
我遇到了这个问题,花了好几个小时浏览 NPM 上的所有 PDF 库。我的要求是我需要在 AWS Lambda 上 运行 它所以不能依赖 OS 依赖项。
下面的代码改编自另一个 Whosebug 答案(我目前找不到)。唯一的区别是我们导入了 ES5 版本,它适用于 Node >= 12。如果你只导入 pdfjs-dist,将会出现 "Readable Stream is not defined" 的错误。希望对您有所帮助!
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);
有没有一种方法可以在没有任何 OS 依赖项的情况下从 nodejs 中的 PDF 中提取文本(例如 windows 上的 pdf2text 或 xpdf)?我无法在 nodejs 中找到任何 'native' pdf 包。它们始终是现有 OS 命令之上的 wrapper/util。 谢谢
你检查过了吗PDF2Json? It is built on top of PDF.js. Though it is not providing the text output as a single line but I believe you may just reconstruct the final text based on the generated Json output:
'Texts': an array of text blocks with position, actual text and styling informations: 'x' and 'y': relative coordinates for positioning 'clr': a color index in color dictionary, same 'clr' field as in 'Fill' object. If a color can be found in color dictionary, 'oc' field will be added to the field as 'original color" value. 'A': text alignment, including: left center right 'R': an array of text run, each text run object has two main fields: 'T': actual text 'S': style index from style dictionary. More info about 'Style Dictionary' can be found at 'Dictionary Reference' section
除了使用建议的 PDF2Json,您还可以直接使用 PDF.js (https://github.com/mozilla/pdfjs-dist)。这样做的好处是您不依赖于拥有 PDF2Json 的谦虚,并且他更新了 PDF.js 基础。
经过一番努力,我终于得到了一个可靠的功能,可以使用 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));
我想我会在这里为以后遇到这个问题的任何人插话。 我遇到了这个问题,花了好几个小时浏览 NPM 上的所有 PDF 库。我的要求是我需要在 AWS Lambda 上 运行 它所以不能依赖 OS 依赖项。
下面的代码改编自另一个 Whosebug 答案(我目前找不到)。唯一的区别是我们导入了 ES5 版本,它适用于 Node >= 12。如果你只导入 pdfjs-dist,将会出现 "Readable Stream is not defined" 的错误。希望对您有所帮助!
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);