在 Node 中打开 PDF 时的错误处理
Error handling when opening a PDF in Node
我正在尝试打开第 3 方生成的 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 的回调似乎得到了 运行 两次。打开文件时一次(因此项目为 "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)
}
我正在尝试打开第 3 方生成的 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 的回调似乎得到了 运行 两次。打开文件时一次(因此项目为 "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)
}