0

我需要仅使用客户端 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、字符串或参数对象”

底部的第二个选项是我获得该功能的地方,我可以将其用于文本提取。 用Javascript从pdf中提取文本

4

1 回答 1

0

Javascript 通常通过在“沙盒”中运行而变得更安全,沙盒是一个限制或完全拒绝访问主机文件系统的虚拟环境。大多数(如果不是全部)浏览器都使用这种方法。也就是说,它通常被允许读取东西,所以安全应该不是问题......

查看函数'pdfToText'的定义,它似乎想要“原始”数据,通常被简单地认为是一个字节数组,实际上可能被打包到其他东西中,例如,一个 32 位浮点数组,每个浮点数在一系列 8 位字节中最多 4 个字节(正确称为“八位字节”)。

查看错误消息,然后调用“pdfToText”,看来您传递的不是原始缓冲区,而是代表文件请求器对话框中选择的文件的字符串。看来您需要找到一个函数,该函数可以将位于该路径的文件作为“原始”字节流读取,然后您可以将该流(我想是缓冲区到字节数组中)提供给“pdfToText”。那应该解决它。

https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString

底部注释掉的块是一个好的开始;您可以将 'readAsText(file)' 替换为 'readAsBinaryString(file)'... 但再进一步阅读,我发现您需要某种“已完成读取”处理程序;看起来“结果”属性将包含您可以传递给“pdfToText”的缓冲区。因此,您必须重新安排事情以使“pdfToText”调用发生在读取文件时调用的处理程序内。如果您遇到困难,请发表评论。

https://mozilla.github.io/pdf.js/examples/上的示例表明应该可以传递表示文件路径的字符串,但由于上述安全问题,可能存在一些问题。

我对 Javascript 还是很陌生,我欢迎对我所做的各种声明进行更正。:-)

于 2015-06-02T02:30:19.070 回答