项目地址:suyihang15/book_reader: 基于python的图书阅读器
下载链接:https://github.com/suyihang15/book_reader/releases/download/1.0.0/BookReader.exe
📚 BookReader — 图书管理与阅读器
一款用 Python + PyQt5 编写的桌面端图书管理与阅读器,支持多格式导入、分类管理、阅读进度追踪。本文将详细介绍该程序的设计原理、功能特性、使用方法及技术栈。
🧠 程序原理
整体架构
┌─────────────────────────────────────────────────────┐ │ MainWindow │ │ ┌──────────┬──────────────────────────────────────┐ │ │ │ Category │ QStackedWidget │ │ │ │ Sidebar │ ┌─────────────┬──────────────────┐ │ │ │ │ │ │ Library │ Reader │ │ │ │ │ 分类筛选 │ │ Widget │ Widget │ │ │ │ │ │ │ (书架视图) │ (阅读器) │ │ │ │ └──────────┘ └─────────────┴──────────────────┘ │ │ │ ↑ 信号驱动切换 │ │ └─────────────────────────────────────────────────────┘
三层数据流
[用户操作] [UI 层] [数据层] [存储层]
│ │ │ │
导入图书 ──→ ImportDialog ──→ parsers.py ──→ SQLite DB
│ │ (解析元数据) (library.db)
│ │ │
点击分类 ──→ CategorySidebar ──→ database.py ──→ SQLite DB
│ (发信号) (get_books_by_category)
│ │ │
阅读图书 ──→ ReaderWidget ──→ parsers.py ──→ 文件系统
│ (逐页渲染) (library/)
设计原则
| 原则 | 体现 |
|---|---|
| 信号-槽解耦 | 组件间通过 PyQt5 信号通信,不直接调用彼此方法 |
| 数据与视图分离 | database.py 只管数据 CRUD,UI 层只管展示 |
| 解析器策略模式 | BaseParser 抽象基类,每种格式一个子类,通过工厂方法获取 |
| 线程分离 | 导入操作在 QThread 中执行,不阻塞主界面 |
| 增量迁移 | 数据库变更通过 ALTER TABLE 兼容已有数据,不丢记录 |
数据库模型
┌──────────────────────┐ ┌──────────────────────┐
│ categories │ │ books │
├──────────────────────┤ ├──────────────────────┤
│ id (PK) │←──┐ │ id (PK) │
│ name (UNIQUE) │ └───│ category_id (FK) │
│ sort_order │ │ title │
└──────────────────────┘ │ author │
│ publisher │
│ description │
│ format │
│ file_path │
│ cover_path │
│ page_count │
│ current_page │
│ tags (JSON) │
│ date_added │
│ last_read │
└──────────────────────┘
✨ 功能特性
📥 图书导入
- 支持 PDF / EPUB / MOBI / AZW3 / TXT / FB2 格式
- 拖拽文件/文件夹到窗口即可批量导入
- 自动解析元数据(书名、作者、出版社、ISBN)
- 自动提取封面(PDF 首页、EPUB 内置封面、TXT 自动生成)
- 基于文件 MD5 的重复检测,避免重复导入
- 导入时可选择分类
📂 分类管理
- 预设 8 个分类:小说、文学、科技、历史、哲学、艺术、教育、其他
- 左侧栏按分类筛选图书,显示每类数量
- 支持添加、重命名、删除自定义分类
- 图书卡片显示分类标签
- 编辑详情时可修改分类
📚 书架视图
- 网格视图:卡片式封面展示,鼠标悬停放大效果
- 列表视图:紧凑列表,适合大量图书浏览
- 搜索:按书名/作者实时过滤
- 排序:最近添加、书名 A-Z、作者 A-Z、最近阅读
📖 阅读器
- PDF 高清渲染(150 DPI),逐页加载
- EPUB/TXT HTML 文本渲染,自动分页
- 三种主题:☀️ 日间 / 🌙 夜间 / 📜 护眼
- 字体大小自由调节(A+/A- 按钮)
- 键盘快捷键翻页(← → / A D)
- 阅读进度自动保存,下次打开继续阅读
✏️ 元数据编辑
- 编辑书名、作者、出版社、ISBN、描述
- 自定义标签(逗号分隔)
- 更换/重置封面图片
- 修改所属分类
🚀 快速开始
环境要求
- Python 3.8+
- Windows / Linux / macOS
安装依赖
pip install -r requirements.txt
运行
python main.py
首次运行会自动创建 library.db 数据库和 library/ 目录结构。
🎮 操作指南
导入图书
| 方式 | 操作 |
|---|---|
| 按钮导入 | 点击工具栏「📥 导入图书」→ 选择文件 |
| 文件夹导入 | 菜单栏 文件 → 导入文件夹(Ctrl+Shift+I) |
| 拖拽导入 | 将文件/文件夹直接拖入窗口 |
导入时可选择「导入到分类」,将图书直接归入指定分类。
浏览与管理
| 操作 | 方式 |
|---|---|
| 分类筛选 | 点击左侧栏分类名称 |
| 搜索图书 | 顶部搜索框输入书名或作者 |
| 排序切换 | 搜索框旁下拉菜单切换排序方式 |
| 视图切换 | 菜单栏 视图 → 网格视图 / 列表视图 |
| 编辑详情 | 右键图书卡片 → ✏️ 编辑详情 |
| 删除图书 | 右键图书卡片 → 🗑️ 删除 |
| 管理分类 | 左侧栏底部「⚙ 管理分类」按钮 |
阅读图书
| 操作 | 方式 |
|---|---|
| 打开阅读 | 点击图书封面 或 右键 → 📖 阅读 |
| 上一页 | ← 键 / A 键 / 点击「◀ 上一页」 |
| 下一页 | → 键 / D 键 / 点击「下一页 ▶」 |
| 跳转页码 | 导航栏输入页码或拖动滑块 |
| 首/末页 | Home / End 键 |
| 字体放大 | 点击 A+ 按钮 |
| 字体缩小 | 点击 A- 按钮 |
| 切换主题 | 右上角下拉菜单(日间/夜间/护眼) |
| 返回书架 | Esc 键 / 点击「← 返回书架」 |
📂 项目结构
book_reader/
├── main.py # 程序入口
├── requirements.txt # Python 依赖清单
├── database.py # SQLite 数据库层(CRUD + 迁移)
├── parsers.py # 多格式解析器(策略模式)
├── utils.py # 工具函数(封面生成、文件哈希)
├── ui/
│ ├── __init__.py
│ ├── main_window.py # 主窗口(菜单、工具栏、状态栏)
│ ├── library_widget.py # 书架视图(网格/列表 + 图书卡片)
│ ├── reader_widget.py # 阅读器(PDF/EPUB/TXT 渲染)
│ ├── import_dialog.py # 导入对话框(多线程导入)
│ ├── detail_dialog.py # 详情编辑对话框
│ ├── category_sidebar.py # 分类侧边栏(分类筛选)
│ └── category_dialog.py # 分类管理对话框
├── library/ # 图书文件存储目录
│ └── .covers/ # 封面图片缓存
└── library.db # SQLite 数据库文件
各模块职责
| 模块 | 职责 | 依赖 |
|---|---|---|
database.py | 数据库初始化、图书/分类 CRUD、增量迁移 | SQLite3 |
parsers.py | 解析各格式图书元数据与内容 | PyMuPDF, ebooklib, BS4 |
utils.py | 封面生成、哈希去重、格式判断 | Pillow |
main_window.py | 窗口框架、菜单/工具栏、信号路由 | PyQt5 |
library_widget.py | 书架渲染、搜索/排序/分类筛选 | PyQt5 |
reader_widget.py | 阅读器渲染、主题/字体切换 | PyQt5 |
import_dialog.py | 导入 UI + 后台线程 | PyQt5, parsers |
detail_dialog.py | 图书元数据编辑表单 | PyQt5 |
category_sidebar.py | 分类列表展示 + 筛选信号 | PyQt5 |
category_dialog.py | 分类增删改管理 | PyQt5 |
🛠️ 技术栈
| 组件 | 技术 | 用途 |
|---|---|---|
| GUI 框架 | PyQt5 | 窗口、布局、信号槽 |
| PDF 解析 | PyMuPDF (fitz) | PDF 元数据提取 + 页面渲染 |
| EPUB 解析 | ebooklib + BeautifulSoup4 | EPUB 元数据 + HTML 内容提取 |
| 图像处理 | Pillow | 封面生成、缩放、格式转换 |
| 数据库 | SQLite3 | 图书记录、分类、阅读进度 |
| 线程 | QThread | 导入不阻塞 UI |
⚠️ 注意事项
- 导入时会复制文件到
library/目录,原始文件不受影响 - 删除图书会同时删除
library/中的副本和封面缓存 - MOBI/AZW 格式仅基础元数据支持,建议转为 EPUB 后导入获得完整体验
- 数据库文件
library.db和library/目录是核心数据,备份时请保留 - 分类表中的默认分类可按需修改或删除
效果展示

总结:这是本人弄的一个图书阅读器,支持各种类型的图书文件,但是打包的是单文件,所以启动稍微有点慢,可以自行打包一下。