Flask读取PDF时出现TypeError:期望str、bytes或os.PathLike对象而非FileStorage
解决Flask中使用PDFMiner读取上传PDF时的TypeError问题
嘿,这个问题我熟!你遇到的TypeError: expected str, bytes or os.PathLike object, not FileStorage错误,根源是对Flask上传文件的对象类型理解错了。
错误原因
request.files['file']返回的是Flask的FileStorage对象,它不是文件路径,也不是直接能给open()函数用的参数。你试图用open(request_data, 'rb')去打开这个对象,自然会报错——open()只认文件路径、字节或者路径类对象,不认FileStorage。
解决方案
其实FileStorage本身已经封装了上传文件的数据流,你直接用它的stream属性就能拿到类文件对象,传给PDFMiner就行,完全不需要额外调用open()。
修改后的完整代码如下:
from flask import Flask, request import io from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage app = Flask(__name__) @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) # 直接使用FileStorage的stream属性,无需open fp = request_data.stream interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos = set() # 遍历并处理PDF的每一页 for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching): interpreter.process_page(page) # 获取提取到的文本内容 extracted_text = retstr.getvalue() # 记得关闭资源,避免内存泄漏 device.close() retstr.close() fp.close() return extracted_text if __name__ == '__main__': app.run(debug=True)
额外提示
- 确保你已经安装了维护中的pdfminer分支:
pip install pdfminer.six(原pdfminer已停止更新) - 如果上传的文件可能很大,建议限制文件大小或采用流式处理,避免内存占用过高。
内容的提问来源于stack exchange,提问作者dhinar1991
相关产品推荐
相关产品推荐

