使用pdf.js,我制作了一个从pdf中提取原始文本的简单函数:
async getPdfText(path){
const pdf = await PDFJS.getDocument(path);
const pagePromises = [];
for (let j = 1; j <= pdf.numPages; j++) {
const page = pdf.getPage(j);
pagePromises.push(page.then((page) => {
const textContent = page.getTextContent();
return textContent.then((text) => {
return text.items.map((s) => s.str).join('');
});
}));
}
const texts = await Promise.all(pagePromises);
return texts.join('');
}
// usage
getPdfText("C:\\my.pdf").then((text) => { console.log(text); });然而,我无法找到正确提取新行的方法,所有的文本都是在一行中提取的。
如何正确提取文本?我希望以与桌面pc相同的方式提取文本:
打开pdf (点击文件) ->选择所有文本(CTRL + A) ->复制所选文本(CTRL + C) ->粘贴复制的文本(CTRL + V)
发布于 2020-07-21 14:23:17
我知道这个问题已经有一年多了,但是如果有人有同样的问题的话。
作为这篇文章说:
在PDF中,没有使用控制字符(如'\n‘-)来控制布局的事情--在PDF中使用精确的坐标定位。使用文本y-坐标(可以从变换矩阵中提取)来检测直线变化。
因此,使用pdf.js,您可以使用textContent.items对象的transform属性。具体而言,表框5。如果此值发生变化,则表示有一个新行。
这是我的密码:
page.getTextContent().then(function (textContent) {
var textItems = textContent.items;
var finalString = "";
var line = 0;
// Concatenate the string of the item to the final string
for (var i = 0; i < textItems.length; i++) {
if (line != textItems[i].transform[5]) {
if (line != 0) {
finalString +='\r\n';
}
line = textItems[i].transform[5]
}
var item = textItems[i];
finalString += item.str;
}
var node = document.getElementById('output');
node.value = finalString;
});听起来很奇怪,您也可以使用tranform属性,而不是使用fontName。对于每个新行,fontName都会发生变化。
https://stackoverflow.com/questions/54645206
复制相似问题