pdfjs:使用正确的 newline/withespace 从 pdf 获取原始文本
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(双击文件)-> select 所有文本 (CTRL + A) -> 复制 selected 文本 (CTRL + C) -> 粘贴复制的文本 (CTRL + V)
我知道这个问题已有一年多了,但以防万一有人遇到同样的问题。
如this post said :
In PDF there no such thing as controlling layout using control chars
such as '\n' -- glyphs in PDF positioned using exact coordinates. Use
text y-coordinate (can be extracted from transform matrix) to detect a
line change.
所以有了pdf.js,就可以使用textContent.items
对象的transform
属性了。具体来说table的方框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
属性。每换一行,字体名称都会更改。
使用 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(双击文件)-> select 所有文本 (CTRL + A) -> 复制 selected 文本 (CTRL + C) -> 粘贴复制的文本 (CTRL + V)
我知道这个问题已有一年多了,但以防万一有人遇到同样的问题。
如this post said :
In PDF there no such thing as controlling layout using control chars such as '\n' -- glyphs in PDF positioned using exact coordinates. Use text y-coordinate (can be extracted from transform matrix) to detect a line change.
所以有了pdf.js,就可以使用textContent.items
对象的transform
属性了。具体来说table的方框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
属性。每换一行,字体名称都会更改。