Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点中打开PDF时的错误处理_Javascript_Node.js_Pdf Reader - Fatal编程技术网

Javascript 在节点中打开PDF时的错误处理

Javascript 在节点中打开PDF时的错误处理,javascript,node.js,pdf-reader,Javascript,Node.js,Pdf Reader,我正在尝试打开第三方生成的PDF,我知道它偶尔会失败。我同时尝试了pdf2json和pdfreader,但遇到了相同的问题,我不确定这是否是我试图在承诺中处理库的方式 当我收到PDF时,我会打开它,以确保它是一个有效的PDF,然后再将其传递给处理 我是这样做的: function printRawItems(filename, callback){ new pdfReader.PdfReader().parseBuffer(filename, function(err, item) {

我正在尝试打开第三方生成的PDF,我知道它偶尔会失败。我同时尝试了
pdf2json
pdfreader
,但遇到了相同的问题,我不确定这是否是我试图在承诺中处理库的方式

当我收到PDF时,我会打开它,以确保它是一个有效的PDF,然后再将其传递给处理

我是这样做的:

function printRawItems(filename, callback){
new pdfReader.PdfReader().parseBuffer(filename, function(err, item) {
    if (err) {
        callback(err);
    } else if (!item) {
        callback();
    } else if (item.text) {
        callback(null, item)
    } else if (item.page){
        console.log("page =", item.page);
        callback(null, item);
    } else if (item.x){
        console.log([item.x, item.y, item.oc, item.A, Math.floor(item.w), item.text].join("\t"));
        callback(null, item);
    } else {
        console.warn(item);
    }
});
}

function isValidPdf(buffer) {
return new Promise((resolve, reject) => {
    printRawItems(buffer, function(err, item){
        if (err) {
            return reject(err);
        } else if (item) {
            return resolve(item);
        }
        return reject();
    })
}).catch(err => {throw err})
}
传递到“isValidPdf”的缓冲区来自http请求

现在我可以告诉大家,我传递到parseBuffer的回调似乎运行了两次。一次是在打开文件时(因此项是“文件”),第二次是在解析文件时。在第一次传递之后,“isValidPdf”中的承诺被解析,传递的回调永远不会被调用,因此不会被拒绝。第二次运行
parseBuffer
回调将显示错误,这会引发异常,但此时承诺已得到解决,坏事情发生了


是我误解了回调的工作原理,还是这些库做错了什么,我应该开一张支持票?

你没有误解回调的工作原理。只是用错了方法。我快速浏览了一下
pdf2json
,似乎您首先创建了解析器,然后执行
.parseBuffer()
并等待事件触发,例如:

function printRawItems (buffer, cb) {                                                                                                                                                                                
  const parser = new PDFParser()                                                                                                                                                                                     
  parser.on('pdfParser_dataError', errData => {                                                                                                                                                                      
    cb(errData.parserError)                                                                                                                                                                                          
  })                                                                                                                                                                                                                 
  parser.on('pdfParser_dataReady', pdfData => {                                                                                                                                                                      
    cb(null, pdfData)                                                                                                                                                                                                
  })                                                                                                                                                                                                                 
  parser.parseBuffer(buffer)                                                                                                                                                                                         
}

谢谢你的回复。从pdfreader返回到pdf2json,并使用您的示例使其立即退出。以什么方式立即退出?我没有收到任何回电。我只能假设应用程序中的错误处理没有使用数据错误输出。至少在这种情况下。编辑我是指库中的错误处理谢谢,我接受了这个,因为它有助于确认我对库不能按预期工作的担心。我可以运行0字节的pdf,它们返回错误,我可以运行正确的pdf,它们可以正确解析。损坏的pdf看起来会立即退出,并且不会抛出我可以处理的异常。