从在线 PDF 中提取文本并对其进行排序

问题描述 投票:0回答:1

我正在尝试建立一个历史竞赛所有答案的数据库,以便我们的团队知道要学习什么。这是我试图从中提取文本数据的示例 pdf:https://usa.iacompetitions.com/wp-content/uploads/sites/5/2023/08/2021-2022-HS-History-Bowl- Round-1-A-Set.pdf

我想用“ANSWER:”搜索所有内容,然后直接获取其后面的文本。现在,这是我的代码,但我非常缺乏经验,我不知道如何继续:

<html>
    <head>
        <script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>
    </head>
    <body>
        <input id="pdffile" name="pdffile" type="file" />
        <button id="btn" onclick="convert()">Process</button>
        <div id="result"></div>
    </body>
</html>

<script>

    function convert() {
        var fr=new FileReader();
        var pdff = new Pdf2TextClass();
        fr.onload=function(){
            pdff.pdfToText(fr.result, null, (text) => { document.getElementById('result').innerText += text; 
          for(var i = 0; i < text.length; i++) {
            
              var indicees = text.indexOf("ANSWER: ", i);
              console.log(text[indicees+8])
          }
                                                      });
        }
        fr.readAsDataURL(document.getElementById('pdffile').files[0])
        
    }

    function Pdf2TextClass() {
        var self = this;
        this.complete = 0;

        this.pdfToText = function (data, callbackPageDone, callbackAllDone) {
            console.assert(data instanceof ArrayBuffer || typeof data == 'string');
            var loadingTask = pdfjsLib.getDocument(data);
            loadingTask.promise.then(function (pdf) {


                var total = pdf._pdfInfo.numPages;
                //callbackPageDone( 0, total );        
                var layers = {};
                for (i = 1; i <= total; i++) {
                    pdf.getPage(i).then(function (page) {
                        var n = page.pageNumber;
                        page.getTextContent().then(function (textContent) {

                            //console.log(textContent.items[0]);0
                            if (null != textContent.items) {
                                var page_text = "";
                                var last_block = null;
                                for (var k = 0; k < textContent.items.length; k++) {
                                    var block = textContent.items[k];
                                    if (last_block != null && last_block.str[last_block.str.length - 1] != ' ') {
                                        if (block.x < last_block.x)
                                            page_text += "\r\n";
                                        else if (last_block.y != block.y && (last_block.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null))
                                            page_text += ' ';
                                    }
                                    page_text += block.str;
                                    last_block = block;
                                }

                                textContent != null && console.log("page " + n + " finished."); //" content: \n" + page_text);
                                layers[n] = page_text + "\n\n";
                            }
                            ++self.complete;
                            //callbackPageDone( self.complete, total );
                            if (self.complete == total) {
                                window.setTimeout(function () {
                                    var full_text = "";
                                    var num_pages = Object.keys(layers).length;
                                    for (var j = 1; j <= num_pages; j++)
                                        full_text += layers[j];
                                    callbackAllDone(full_text);
                                }, 1000);
                            }
                        }); // end  of page.getTextContent().then
                    }); // end of page.then
                } // of for
            });
        }; // end of pdfToText()
    }; // end of class

</script>

在此代码的末尾,我的目标是计算某些答案选项出现的次数,并以某种方式在网站或 Excel 文档中对其进行格式化。

javascript pdf.js
1个回答
0
投票

要获取单行文本(大多数 PDF 行只是单行而不换行),您首先需要通过 HTTPS 将 PDF 获取到您的处理器,然后在第二行代码中您需要过滤每个目标行中的关键字,然后保存更多代码来解析。

跨平台我们可以使用Curl和Poppler。

对于 Windows 设备来说会是这样的

curl -o 1Aset.pdf https://usa.iacompetitions.com/wp-content/uploads/sites/5/2023/08/2021-2022-HS-History-Bowl-Round-1-A-Set.pdf
pdftotext -nopgbrk -enc UTF-8 1Aset.pdf -|find /i "answer:" >>answers.txt

将远程文本保存为answer.txt后,您就可以在任何合适的分析语言中加载和使用。

并不是说,由于 PDF 删除换行符,它们需要通过 PDFtotext 等提取器注入,然后您可能无法获得您期望的所有数据。在这种情况下,当您检查时,复制并粘贴丢失的几个内容会更简单。

© www.soinside.com 2019 - 2024. All rights reserved.