我需要仅使用客户端JavaScript提取PDF文本。
我有这个JSFiddle http://jsfiddle.net/go279m0h/
document.getElementById('file').addEventListener('change', readFile, false);
/** This works
* Extract text from PDFs with PDF.js
* https://mozilla.github.io/pdf.js/getting_started/
*/
pdfToText = function(data) {
PDFJS.workerSrc = "{{ url_for('static', filename='js/pdf.worker.js') }}";
PDFJS.cMapUrl = "{{ url_for('static', filename='cmaps') }}";
PDFJS.cMapPacked = true;
return PDFJS.getDocument(data).then(function(pdf) {
var pages = [];
for (var i = 0; i < pdf.numPages; i++) {
pages.push(i);
}
return Promise.all(pages.map(function(pageNumber) {
return pdf.getPage(pageNumber + 1).then(function(page) {
return page.getTextContent().then(function(textContent) {
return textContent.items.map(function(item) {
return item.str;
}).join(' ');
});
});
})).then(function(pages) {
return pages.join("\r\n");
});
});
}
// this function should get the text of a pdf file and print it to the console.
function readFile (evt) {
var files = evt.target.files;
var file = files[0];
// following from https://stackoverflow.com/questions/1554280/extract-text-from-pdf-in-javascript
// using PDFJS function
self.pdfToText(files[0].path).then(function(result) {
console.log("PDF done!", result);
})
/*
var reader = new FileReader();
reader.onload = function() {
console.log(this.result);
}
//reader.readAsText(file)
*/
}
从PDF获取文本的PDF JS函数当前使用服务器端文件路径,但我不能让它接受用户上传文件的files [0]参数。
我运行时遇到的错误是 “未捕获错误:getDocument中的参数无效,需要Uint8Array,字符串或参数对象”
底部的第二个选项是我获得该功能的地方,我可以用它进行文本提取。 extract text from pdf in Javascript
答案 0 :(得分:0)
通过在沙盒中运行它,通常会使Javascript变得更安全。#sand;&#34;是一个限制或完全拒绝访问主机文件系统的虚拟环境。大多数 - 如果不是全部 - 浏览器都使用这种方法。也就是说,它通常被允许阅读,所以安全不应该是一个问题......
看看功能的定义&pdfToText&#39;,它似乎想要&#34; raw&#34;数据,通常简单地认为是一个字节数组,实际上可以打包成其他东西,例如,一个32位浮点数组,每个浮点数占一个8位字节的4个字节(正确称为&#39 ;八位字节&#39;)。
查看错误消息,然后调用&#39; pdfToText&#39;,看来代替原始缓冲区,您传递的字符串表示在文件请求者对话框中选择的文件。看来你需要找到一个能够读取位于该路径上的文件的函数作为&#34; raw&#34;字节流,然后您可以将该流(缓冲区转换为字节数组,我猜)到“pdfToText”#。那应该解决它。
https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString
底部注释掉的大块是一个好的开始;你可以替换&#39; readAsText(file)&#39;用&#39; readAsBinaryString(文件)&#39; ...但是进一步阅读,我发现你需要某种&#34;它已经完成阅读&#34;处理程序;看起来像&#39;结果&#39;属性将包含您可以传递给&lt; pdfToText&#39;的缓冲区。因此,您必须重新安排事情以获得“pdfToText”。调用发生在读取文件时调用的处理程序内部。评论你是否被卡住了。
https://mozilla.github.io/pdf.js/examples/处的示例表明应该可以传递表示文件路径的字符串,但可能由于上述安全性问题而存在一些问题。
我还是Javascript的新手,我欢迎对我所提出的各种说法进行更正。 : - )