我正在运行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调用pdfdocument.py中的 init 方法(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
使用存储在与function.py相同的目录中的PDF文件运行测试是成功的,因此罪魁祸首是下载的PDF文件的io.BytesIO格式。由于我想在function.py中使用一个流,我想知道是否有更好的方法来做到这一点。