首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pdfjs:使用正确的换行符/带空格从pdf中获取原始文本

pdfjs:使用正确的换行符/带空格从pdf中获取原始文本
EN

Stack Overflow用户
提问于 2019-02-12 07:52:36
回答 1查看 1.6K关注 0票数 4

使用pdf.js,我制作了一个从pdf中提取原始文本的简单函数:

代码语言:javascript
运行
复制
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); });

然而,我无法找到正确提取新行的方法,所有的文本都是在一行中提取的。

如何正确提取文本?我希望以与桌面pc相同的方式提取文本:

打开pdf (点击文件) ->选择所有文本(CTRL + A) ->复制所选文本(CTRL + C) ->粘贴复制的文本(CTRL + V)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 14:23:17

我知道这个问题已经有一年多了,但是如果有人有同样的问题的话。

作为这篇文章说

在PDF中,没有使用控制字符(如'\n‘-)来控制布局的事情--在PDF中使用精确的坐标定位。使用文本y-坐标(可以从变换矩阵中提取)来检测直线变化。

因此,使用pdf.js,您可以使用textContent.items对象的transform属性。具体而言,表框5。如果此值发生变化,则表示有一个新行。

这是我的密码:

代码语言:javascript
运行
复制
            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都会发生变化。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54645206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档