ar0*_*968 4 javascript pdf pdfjs
使用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); });
Run Code Online (Sandbox Code Playgroud)
但是我找不到正确提取新行的方法,所有文本仅在一行中提取。
如何正确提取文本?我想以与台式电脑相同的方式提取文本:
打开pdf(双击文件)-> 选择所有文本(CTRL + A)-> 复制所选文本(CTRL + C)-> 粘贴复制的文本(CTRL + V)
小智 7
我知道这个问题已经有一年多了,但以防万一有人遇到同样的问题。
正如这篇文章所说:
在 PDF 中,没有使用诸如 '\n' 之类的控制字符来控制布局——PDF 中使用精确坐标定位的字形。使用文本 y 坐标(可以从变换矩阵中提取)来检测线条变化。
所以使用 pdf.js,你可以使用对象的transform属性textContent.items。特别是表格的框 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;
});
Run Code Online (Sandbox Code Playgroud)
听起来很奇怪,除了使用tranform,您还可以使用fontName属性。每换一行,fontName 就会改变。