Могу ли я заставить PyPDF2 сбоить изящно, когда PDF-файл, который он анализирует, поврежден? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть приложение Python, которое удаляет сотни файлов PDF с общедоступного веб-сайта и просматривает их, используя эту библиотеку Python PyPDF2

Из сотен таких файлов, которые успешно анализируются,Один файл вызывает у меня изжогу.Это 18 страниц в длину.Имя файла: «bad.pdf».Вы можете видеть это здесь .

Это мой код, который будет анализировать документ:

$ virtualenv my_env
$ source my_env/bin/activate
(my_env) $ pip install PyPDF2==1.26.0
(my_env) $ python
>>> import PyPDF2
>>> def parse_pdf_doc():
>>>     pdfFileObj = open('bad.pdf', 'rb')
>>>     pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
>>>     for curr_page_num in range(pdfReader.numPages):
>>>         print 'curr_page_num = {}'.format(curr_page_num)
>>>         pageObj = pdfReader.getPage(curr_page_num)
>>>         print '\tPage Retrieved successfully'
>>>         page_text = pageObj.extractText()
>>>         print '\tText extracted successfully'

Когда я запускаю этот код, он анализирует первые девять страницуспешно.Но потом на десятой странице просто висит.Навсегда:

>>> parse_pdf_doc()
curr_page_num = 0
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 1
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 2
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 3
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 4
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 5
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 6
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 7
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 8
    Page Retrieved successfully
    Text extracted successfully
curr_page_num = 9
    Page Retrieved successfully
<... hung here forever ...>

В чем проблема с номером страницы 10?Давайте откроем это в средстве просмотра.Ух ты! Даже Документы Google не могут разобрать страницу № 10.Так что на этой странице определенно что-то искажено:

enter image description here

Но все же мне нужен PyPDF, чтобы вызвать исключение или выйти из строя каким-либо другим способом, а не тольковойти в бесконечный цикл.Это убивает мой рабочий процесс.Что я могу сделать, чтобы обойти эту поврежденную страницу в файле PDF?

1 Ответ

0 голосов
/ 09 декабря 2018

Ниже шаблон даст вам представление о том, как этого добиться.

from multiprocessing import Process
pdfFileObj = open('bad.pdf', 'rb')
for page in PDFPage.get_pages(pdfFileObj):
                    processTimeout = 20
                    extractTextProcess = Process(target=Function_to_extract_text, args=(pdfObject,page)

также open ваш файл с ключевым словом with (для сохранения утечки памяти)

...