4

使用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)

4

1 回答 1

8

我知道这个问题已经有一年多了,但万一有人遇到同样的问题。

正如这篇文章所说

在 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;
            });

听起来很奇怪,除了使用tranform,您还可以使用该fontName属性。每一行,fontName 都会改变。

于 2020-07-21T14:23:17.967 回答