Сбой pytest при использовании потока io.BytesIO вместо файла PDF - PullRequest
0 голосов
/ 08 мая 2018

Я запускаю pytest для проверки функции, которая использует pdfminer для преобразования PDF в текст. Функция работает при выполнении $ python function.py, и я ожидаю, что результат будет таким. Я должен также указать, что я использую поток при разборе файла (io.BytesIO), и этот поток является причиной моего теста провал. При запуске pytest функция завершается с ошибкой PDFSyntaxError.

# function.py

...
from pdfminer.pdfparser import PDFParser
from pdfminer.document import PDFDocument


req = requests.get(url_pointing_to_pdf_file)
pdf = io.BytesIO(req.content)

parser = PDFParser(pdf)
document = PDFDocument(parser, password=None) # this fails
...

pytest вызывает метод init в pdfdocument.py (часть библиотеки pdfminer) и останавливается здесь:

for xref in xrefs:
    trailer = xref.get_trailer()
    ...
    if 'Root' in trailer:
        self.catalog = dict_value(trailer['Root'])
        break
else:
    raise PDFSyntaxError('No /Root object! - Is this really a PDF?')
...

И вот что показывает pytest при сбое тестирования функции:

tests/test_function.py:11:
----------------------------------------------------
.../function.py:157: in function
**document = PDFDocument(parser, password=None)**

...

E    pdfminer.pdfparser.PDFSyntaxError: No /Root object! - Is this really a PDF?
lib/python3.6/site-packages/pdfminer/pdfdocument.py:583:PDFSyntaxError

Выполнение теста с файлом PDF, хранящимся в том же каталоге, что и function.py, прошло успешно, поэтому виновником является формат io.BytesIO загруженного файла PDF. Поскольку я хочу использовать поток с функцией.py, я хотел бы знать, есть ли лучший способ сделать это.

...