如何修复Streamlit OCR平台开发中的TypeError:expected str, bytes or os.PathLike object, not UploadedFile
问题描述
我正在用Streamlit和EasyOCR开发OCR平台,已经实现了图片转文本的功能,但卡在PDF转JPG这一步。流程是上传PDF→转JPG→转numpy.ndarray→提取文本,但上传PDF时触发TypeError: expected str, bytes or os.PathLike object, not UploadedFile,错误出在执行convert_from_path(uploaded_file)的时候。
代码片段:
uploaded_file = st.file_uploader("Download PDF:", type=['pdf']) if uploaded_file is not None: st.write('File downloaded') pdf2img = convert_from_path(uploaded_file) pdf2img.save('out.jpg', 'JPEG') imgcv=cv2.imread('out.jpg') imgcv=cv2.cvtColor(imgcv, cv2.COLOR_BGR2RGB) file_bytes = np.asarray(bytearray(imgcv.read()), dtype=np.uint8) bytearray_img1 = cv2.imdecode(file_bytes, 1)
解决方法
核心问题是convert_from_path需要文件路径或字节流,但Streamlit的UploadedFile是文件对象,不是路径。另外代码还有两处错误:convert_from_path返回的是图片列表,不能直接调用save;imgcv是numpy数组,不存在read()方法。
修正步骤:
- 用
convert_from_bytes替代convert_from_path,直接传入上传文件的字节数据 - 处理
convert_from_bytes返回的图片列表(兼容PDF多页场景) - 直接将PIL图片转为numpy数组,跳过本地文件存储,减少IO操作
修正后的代码:
import streamlit as st from pdf2image import convert_from_bytes import cv2 import numpy as np import easyocr # 初始化EasyOCR阅读器,可按需设置语言 reader = easyocr.Reader(['ch_sim', 'en']) uploaded_file = st.file_uploader("上传PDF文件:", type=['pdf']) if uploaded_file is not None: st.write('文件已上传') # 读取上传文件的字节数据 pdf_bytes = uploaded_file.read() # 将PDF转换为PIL图片列表(每页对应一张图片) pil_images = convert_from_bytes(pdf_bytes) # 遍历处理每一页 for idx, img in enumerate(pil_images): st.subheader(f"第{idx+1}页识别结果") # 将PIL图片转为numpy数组 img_np = np.array(img) # 转换为OpenCV兼容的BGR格式 img_cv = cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR) # 用EasyOCR提取文本 result = reader.readtext(img_cv) # 展示识别出的文本 for detection in result: st.write(f"文本: {detection[1]}")
内容的提问来源于stack exchange,提问作者Алексей Курочкин
相关产品推荐
相关产品推荐

