[英]pdfjs: get raw text from pdf with correct newline/withespace
使用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); });
但是我找不到正確提取新行的方法,所有文本僅在一行中提取。
如何正確提取文本? 我想以與台式電腦相同的方式提取文本:
打開pdf(雙擊文件)-> 選擇所有文本(CTRL + A)-> 復制所選文本(CTRL + C)-> 粘貼復制的文本(CTRL + V)
我知道這個問題已經有一年多了,但以防萬一有人遇到同樣的問題。
正如這篇文章所說:
在 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 就會改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.