在 Node 中打开 PDF 时的错误处理

Error handling when opening a PDF in Node

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

当我收到 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 的回调似乎得到了 运行 两次。打开文件时一次(因此项目为 "file"),第二次在解析文件时。在第一遍之后 "isValidPdf" 中的承诺被解析并且传入的回调永远不会被调用,所以它不会被拒绝。 parseBuffer 回调的第二个 运行 显示错误,它抛出异常,但到那时 promise 已解决并且坏事发生了。

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

您没有误解回调的工作原理。只是以错误的方式使用它们。我快速浏览了 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)                                                                                                                                                                                         
}