Nodejs pdf js -dist: невозможно поймать смещение плохого конца - PullRequest
0 голосов
/ 01 мая 2020

Я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...