在JavaScript中与文件客户端进行交互

时间:2015-06-02 01:59:29

标签: javascript jquery html pdf pdfjs

我需要仅使用客户端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

1 个答案:

答案 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的新手,我欢迎对我所提出的各种说法进行更正。 : - )