类型错误:使用烧瓶读取 pdf 文件时预期的 str、字节或 os.PathLike 对象,而不是 FileStorage

Posted

技术标签:

【中文标题】类型错误:使用烧瓶读取 pdf 文件时预期的 str、字节或 os.PathLike 对象,而不是 FileStorage【英文标题】:TypeError: expected str, bytes or os.PathLike object, not FileStorage while reading pdf files using flask 【发布时间】:2018-09-21 05:23:47 【问题描述】:

我正在尝试使用烧瓶应用程序读取 python 文件。我正在使用 pdfminer 来阅读 pdf 文本。

@app.route('/getfile', methods=['POST'])
def getfile():
    request_data = request.files['file']
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(request_data, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,
                                  password=password,
                                  caching=caching,
                                  check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
return text

不幸的是它抛出了错误,

在http://0.0.0.0:5000/ 上运行(按 CTRL+C 退出) 127.0.0.1 - - [11/Apr/2018 16:07:53] “GET /hello HTTP/1.1”200 - [2018-04-11 16:07:55,720] 应用程序中的错误:/getfile [POST] 上的异常 Traceback(最近一次通话最后一次):文件 "c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", 第 1982 行,在 wsgi_app 中 响应 = self.full_dispatch_request() 文件“c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask\app.py”, 第 1614 行,在 full_dispatch_request 中 rv = self.handle_user_exception(e) 文件“c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask\app.py”, 第 1517 行,在 handle_user_exception 中 reraise(exc_type, exc_value, tb) 文件 "c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask_compat.py", 第 33 行,在再加注中 提高价值文件“c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask\app.py”, 第 1612 行,在 full_dispatch_request 中 rv = self.dispatch_request() 文件“c:\users\rb287jd\appdata\local\programs\python\python36\lib\site-packages\flask\app.py”, 第 1598 行,在 dispatch_request 中 在 getfile 中返回 self.view_functionsrule.endpoint 文件“C:/Users/RB287JD/Documents/Programs/flask_1.py”,第 27 行 fp = open(request_data, 'rb').decode("utf-8") TypeError: expected str, bytes or os.PathLike object, not FileStorage 127.0.0.1 - - [11/Apr/2018 16:07:55] “POST /getfile HTTP/1.1”500 -

如何读取烧瓶内的输入 pdf 文件? PS。我不想在代码的任何地方提供我的文件位置。我想即时进行。

【问题讨论】:

【参考方案1】:

request.files['file'] 是FileStorage 类的实例(另请参阅http://flask.pocoo.org/docs/0.12/api/#flask.Request.files),因此您不能使用fp = open(request_data, 'rb')。 FileStorage 对象包含一个stream 属性,该属性应指向一个打开的临时文件,您可能可以将其传递给PDFPage.get_pages()

所以,类似:

@app.route('/getfile', methods=['POST'])
def getfile():
    file = request.files['file']
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(file.stream, pagenos, maxpages=maxpages,
                                  password=password,
                                  caching=caching,
                                  check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    device.close()
    retstr.close()
return text

【讨论】:

以上是关于类型错误:使用烧瓶读取 pdf 文件时预期的 str、字节或 os.PathLike 对象,而不是 FileStorage的主要内容,如果未能解决你的问题,请参考以下文章

pdf打开错误之读取本文档时出现问题(14)

有啥方法可以在烧瓶邮件中命名附加的 pdf 文件?

PDF处理页面时发生错误 读取本文档时出现问题18

PDF文件,Adobe处理页面时发生错误,读取本文档时出现问题(135)

烧瓶中的蓝图模板文件夹未按预期工作

在“nsstring *”类型的对象上找不到读取字典元素的预期方法