我正在尝试建立一个历史竞赛所有答案的数据库,以便我们的团队知道要学习什么。这是我试图从中提取文本数据的示例 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 文档中对其进行格式化。
要获取单行文本(大多数 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 等提取器注入,然后您可能无法获得您期望的所有数据。在这种情况下,当您检查时,复制并粘贴丢失的几个内容会更简单。