Javascript 在节点中打开PDF时的错误处理
我正在尝试打开第三方生成的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) {
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看起来会立即退出,并且不会抛出我可以处理的异常。