在JavaScript中与文件客户端交互



我需要只使用客户端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("rn");
        });
    });
}

    // 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,字符串或参数对象"

从底部开始的第二个选项是我得到函数的地方,我可以用它来提取文本。从pdf中提取文本

Javascript通常通过在"沙箱"中运行来使其更安全,"沙箱"是一种虚拟环境,限制或直接拒绝对主机文件系统的访问。大多数(如果不是全部的话)浏览器都使用这种方法。也就是说,它通常允许读取东西,所以安全性应该不是问题…

查看函数'pdfToText'的定义,它似乎想要"原始"数据,通常简单地认为是一个字节数组,实际上可能被打包成其他东西,例如,一个32位浮点数数组,每个占用4个字节在一系列8位字节(适当地称为'octets')。

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

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

底部被注释掉的块是一个好的开始;你可以将'readAsText(file)'替换为'readAsBinaryString(file)'…但进一步阅读,我看到你需要某种"它已完成阅读"处理程序;看起来'result'属性将包含可以传递给'pdfToText'的缓冲区。所以你必须重新安排事情,让'pdfToText'调用发生在处理程序中,当文件被读取时调用。如果卡住了请注释

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

我对Javascript还是个新手,我欢迎对我所做的各种声明进行更正。: -)

最新更新