You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发PDF阅读器遇报错:expected str, bytes or os.PathLike object, not TextIOWrapper

解决PDF阅读器报错:expected str, bytes or os.PathLike object, not TextIOWrapper

错误原因

  • askopenfile()调用后返回的是已打开的文件对象(TextIOWrapper),而你后续又用open(book, 'rb')试图再次打开这个对象,open()函数需要的是文件路径字符串,不是已打开的文件对象,这就导致了类型不匹配的错误。
  • 代码还存在其他逻辑问题:初始化阶段就执行文件选择操作,按钮触发的函数重复执行无效操作,文本提取逻辑提前在全局执行,语音朗读目标错误等。

修复后的完整代码

import PyPDF2
import pyttsx3
from tkinter import * 
from tkinter.filedialog import askopenfilename  # 改用askopenfilename获取文件路径

root = Tk()
root.geometry('800x600')
root.title("PDF Reader")

# 全局变量存储提取的文本
extracted_text = ""

def read_pdf():
    global extracted_text
    # 获取文件路径字符串,限定仅选择PDF文件
    book_path = askopenfilename(filetypes=[("PDF Files", "*.pdf")])
    if not book_path:
        return  # 用户取消选择文件时直接返回
    
    # 用with语句管理文件,自动处理关闭
    with open(book_path, 'rb') as pdfobj:
        pfreader = PyPDF2.PdfReader(pdfobj)
        extracted_text = ""
        # 遍历所有页面提取文本
        for page in pfreader.pages:
            page_text = page.extract_text()
            if page_text:  # 跳过空页面
                extracted_text += page_text
    
    # 更新标签显示,长文本截断避免界面溢出
    display_text = extracted_text[:500] + "..." if len(extracted_text) > 500 else extracted_text
    l1.config(text=display_text)

def say_pdf():
    if not extracted_text:
        return  # 无文本时不执行朗读
    engine = pyttsx3.init()
    engine.say(extracted_text)
    engine.runAndWait()  # 必须调用此方法才能播放语音

# 初始化标签,设置自动换行
l1 = Label(root, text="请先选择PDF文件", height=12, wraplength=500)
l1.grid(row=0, column=0, padx=10, pady=10)

choose_file = Button(root, text='选择文件', command=read_pdf)
choose_file.grid(row=0, column=1, padx=10, pady=10)

read_file = Button(root, text='朗读', command=say_pdf)
read_file.grid(row=0, column=2, padx=10, pady=10)

root.mainloop()

关键修复点说明

  • 替换askopenfile()为askopenfilename():返回文件路径字符串,符合open()函数的参数要求。
  • 用with语句管理文件:自动关闭文件,避免资源泄漏。
  • 调整文本提取时机:将提取逻辑放入read_pdf函数,确保用户选择文件后才执行。
  • 修复语音逻辑:朗读提取到的文本内容,添加runAndWait()确保语音正常播放。
  • 增加异常判断:处理用户取消选择、无文本提取的情况,避免程序报错。
  • 优化界面显示:设置标签自动换行,长文本截断显示,提升界面可读性。

内容的提问来源于stack exchange,提问作者Diduah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:00:10