Я пытаюсь открыть файл 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.info("page = ", item.page);
callback(null, item);
} else if (item.x){
console.info([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 отображает ошибки, которые вызывают исключение, но к этому времени обещание выполняется и происходят плохие вещи.
Я неправильно понимаю, как работают обратные вызовы, или эти библиотеки делают что-то не так, и я должен открыть заявку в службу поддержки?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы правильно понимаете, как работают обратные вызовы. Просто неправильно их использовать. Я быстро взглянул на 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)
}
Как выйти немедленно?
Мне не перезвонили. Я могу только предположить, что обработка ошибок в приложении не использует вывод ошибок данных. По крайней мере, в этом сценарии. Редактировать Я имею ввиду обработку ошибок в библиотеке
Спасибо, я принял это, поскольку это помогло мне подтвердить мои опасения, что библиотека работает не так, как ожидалось. Я могу запустить 0-байтовые PDF-файлы, и они вернут ошибку, и я могу просмотреть правильные PDF-файлы, и они правильно проанализируют. Поврежденный PDF-файл немедленно закрывается и не вызывает исключения, с которым я могу справиться.
Спасибо за ответ. Если вернуться к pdf2json из pdfreader и использовать ваш пример, он немедленно завершится.