【问题标题】:pdfjs: get raw text from pdf with correct newline/withespacepdfjs:使用正确的换行符/空格从 pdf 中获取原始文本
【发布时间】:2019-07-05 19:29:18
【问题描述】:

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

【问题讨论】:

    标签: javascript pdf pdfjs


    【解决方案1】:

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

    作为this post said

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

    虽然听起来很奇怪,但您也可以使用fontName 属性,而不是使用tranform。每一行,fontName 都会改变。

    【讨论】:

    • 感谢您的回答。它帮助我识别换行符产生更好的pdf文本输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2019-08-22
    • 2012-03-05
    • 2012-03-18
    • 2019-11-28
    相关资源
    最近更新 更多