Я использую pdf js -дист для извлечения текста из PDF-документов, и я сталкиваюсь с вышеуказанной ошибкой для выбранных PDF-файлов. Когда возникает эта ошибка, я бы хотел ее отловить и обработать соответствующим образом, но моя реализация пока не увенчалась успехом в ее обнаружении.
В результате произошел сбой моей функции Firebase Cloud.
Код на данный момент:
function extractPlainTextFromPdf(pdfUrl) {
let options = setupPdfOptions(pdfUrl)
return getPlainBody(options)
.then((plainBody) => plainBody)
.catch((err) => {
if (err.message == "Invalid PDF structure") {
return getPlainBodyWithBuffer(pdfUrl)
} else {
console.log("Err plainBody", err.message)
return
}
})
}
function getPlainBodyWithBuffer(pdfUrl) {
return getBufferFromUrl(pdfUrl)
.then((contents) => {
let options = {
data: contents
}
return getPlainBody(options)
})
.then((plainBody) => plainBody)
.catch((err) => {
console.log(pdfUrl)
console.log("Error buffer:", err.message)
return ""
})
}
function getBufferFromUrl(url) {
const options = {
url: url,
encoding: null,
method: 'GET',
headers: {
'User-Agent': "useragent"
}
}
return new Promise((resolve, reject) => {
request(options, (err, res, body) => {
if (!err && res.statusCode == 200) {
if (!res.headers["content-type"].includes("application/pdf")) {
let err = new Error('Not a pdf document.')
reject(err)
} else {
resolve(body)
}
} else {
const error = new Error('Error from url.')
reject(error)
}
})
})
}
function getPlainBody(options) {
return getDocument(options)
.then(doc => extractTexts(doc, doc.numPages))
.catch(err => console.log('getPlainBody', err))
}
function getDocument(options) {
var loadingTask = pdfjslib.getDocument(options)
return loadingTask.promise
.then((doc) => {
return doc
})
.catch((err) => {
console.log('Error getting doc', err.message)
return
})
}
function extractTexts(doc, maxNumPages) {
var promises = []
for (pageNum = 1; pageNum <= maxNumPages; pageNum++) {
const promise = getText(pageNum, doc)
promises.push(promise)
}
return Promise.all(promises)
.then((results) => {
var pdfString = []
for (const result of results) {
pdfString.push(result);
}
return pdfString.join('').replace(/\s{2,}/g,' ').trim();
})
.catch((err) => {
console.log('Error extracting text', err)
})
}
function getText(pageNum, doc) {
return doc.getPage(pageNum)
.then((page) => {
return page.getTextContent()
})
.then((content) => {
var strings = content.items.map((item) => {
return item.str
});
const concatStrings = strings.join('');
return concatStrings;
})
.catch((err) => {
console.log('Error getting text', err)
return
})
}
function setupPdfOptions(url) {
return {
url: url,
encoding: null,
httpHeaders: {
"User-Agent": "user-agent",
}
};
}
Я реализовал блоки перехвата, но ни один из них не обнаружил ошибку :
Error: Bad end offset: 1769521
at ChunkedStream.onReceiveData (/srv/node_modules/pdfjs-dist/build/pdf.worker.js:11699:15)
at ChunkedStreamManager.onReceiveData (/srv/node_modules/pdfjs-dist/build/pdf.worker.js:12252:21)
at /srv/node_modules/pdfjs-dist/build/pdf.worker.js:12036:15
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7
Версии
- Nodejs: 8
- pdf js -ist: 2.3.200