这是一个完整的EPUB处理系统,提供了文件转换、元数据提取、结构分析等功能,并支持文件存储和任务管理。 定制化比较强
app.py
: FastAPI应用主文件,提供RESTful API接口epub_to_md.py
: EPUB文件转换工具excel_to_meta.py
: Excel元数据提取工具md_to_json_structure.py
: Markdown结构提取工具text_keywords.py
: 文本关键词提取工具oss_uploader.py
: 阿里云OSS上传工具task_manager.py
: 任务管理系统start.sh
: 容器启动脚本Dockerfile
: Docker镜像构建文件requirements.txt
: Python依赖列表
- EPUB文件转换为Markdown
- Excel元数据提取
- Markdown结构提取
- 文本关键词提取
- 文件上传到OSS
- 任务状态管理
需要配置以下环境变量:
CONTAINER_NAME
: 容器名称IMAGE_NAME
: 镜像名称HOST_PORT
: 主机端口API_KEY
: API密钥
DATA_DIR
: 数据目录路径
ALIYUN_OSS_ACCESS_KEY
: 访问密钥ALIYUN_OSS_SECRET_KEY
: 密钥ALIYUN_OSS_ENDPOINT
: OSS端点ALIYUN_OSS_REGION
: 区域ALIYUN_OSS_BUCKET_NAME
: 存储桶名称ALIYUN_OSS_AUTH_VERSION
: 认证版本ALIYUN_OSS_PATH
: OSS路径
REDIS_HOST
: Redis主机REDIS_PORT
: Redis端口REDIS_DB
: Redis数据库REDIS_PASSWORD
: Redis密码
# 转换EPUB文件
curl -X POST http://localhost:${HOST_PORT}/epub-to-md \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d '{
"product_code": "100227-01",
"src": "/app/data/100227-01/100227-01工程材料及检测-数字教材.epub",
"md_img_dir": "/books/100227-01/images",
"save": true
}'
# 上传EPUB文件
curl -X POST http://localhost:${HOST_PORT}/epub-to-md/file \
-H "Authorization: Bearer ${API_KEY}" \
-F "file=@/path/to/book.epub" \
-F "product_code=100227-01" \
-F "save=true"
curl -X POST http://localhost:${HOST_PORT}/md-to-structure \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d '{
"product_code": "100227-01",
"src": "/app/data/100227-01/epub/100227-01.epub.md",
"save": true
}'
curl -X POST http://localhost:${HOST_PORT}/extract-keywords \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d '{
"text": "这是一段需要提取关键词的文本内容",
"topk": 10
}'
- Python 3.12
- FastAPI, uvicorn
- beautifulsoup4, html2text
- requests, python-multipart
- pydantic, openpyxl, pandas
- jieba, oss2, redis
- Docker环境
- Redis服务
- 阿里云OSS账号
- 必要的环境变量配置
- 复制环境变量配置文件:
cp .env.example .env
-
编辑
.env
文件,配置必要的环境变量 -
启动服务:
./start.sh
- 访问API文档:
http://localhost:${HOST_PORT}/docs
/books
/src
/100227-01
- book1.epub
- book2.epub
/output
/100227-01
/markdown
- book1.md
- book2.md
/images
- img1.jpg
- img2.png
python epub_to_md.py --src <EPUB文件路径或URL> --product_code <产品编号> --md_img_dir <图片引用路径> [--save]
--src
: EPUB文件路径或URL--file
: 上传的EPUB文件--product_code
: 产品编号(必需),例如:'100227-01'--md_img_dir
: Markdown文件中图片引用的基础路径--save
: 是否保存文件(默认为false)
# 使用完整路径,保存文件
python epub_to_md.py --src /books/src/100227-01/book1.epub --product_code 100227-01 --md_img_dir /books/100227-01/images --save
# 使用URL,不保存文件
python epub_to_md.py --src https://example.com/book.epub --product_code 100227-01 --md_img_dir /books/100227-01/images
# 不保存文件,直接返回Markdown内容
python epub_to_md.py --src /books/src/100227-01/book1.epub --product_code 100227-01 --md_img_dir /books/100227-01/images
python app.py
服务将在 http://localhost:8000
启动。
POST /epub-to-md
请求体:
{
"product_code": "100227-01",
"src": "/path/to/book.epub",
"md_img_dir": "/books/100227-01/images",
"save": true
}
响应示例:
{
"status": "success",
"product_code": "100227-01",
"message": "转换成功",
"content": "# 书籍标题\n\n**作者:作者名**\n\n...",
"output_file": "./data/100227-01/epub/100227-01.epub.md",
"img_dir": "./data/100227-01/images/",
"md_img_dir": "/books/100227-01/images"
}
POST /epub-to-md/file
请求体(表单数据):
file
: EPUB文件product_code
: 产品编号md_img_dir
: Markdown图片引用路径(可选)save
: 是否保存到文件(默认为false)
响应示例:
{
"status": "success",
"product_code": "100227-01",
"message": "转换成功",
"content": "# 书籍标题\n\n**作者:作者名**\n\n...",
"output_file": "./data/100227-01/epub/100227-01.epub.md",
"img_dir": "./data/100227-01/images/",
"md_img_dir": "/books/100227-01/images"
}
# 使用文件路径
curl -X POST "http://localhost:8000/epub-to-md" \
-H "Content-Type: application/json" \
-d '{
"product_code": "100227-01",
"src": "/path/to/book.epub",
"save": true
}'
# 使用文件上传
curl -X POST "http://localhost:8000/epub-to-md/file" \
-F "file=@/path/to/book.epub" \
-F "product_code=100227-01" \
-F "save=true"
- 确保源目录中包含要处理的EPUB文件
- 程序会自动创建必要的输出目录结构
- 当
save
为true
时,输出的Markdown文件将保存在./data/${product_code}/epub/${product_code}.epub.md
- 当
save
为true
时,提取的图片将保存在./data/${product_code}/images/
- 图片在Markdown中的引用路径格式为
/books/${product_code}/images/图片名称
- 无论是否设置
save
参数,程序都会返回转换后的Markdown内容 - 当
save
为true
时,响应中会额外包含文件路径信息
- Python 3.6+
- FastAPI
- uvicorn
- beautifulsoup4
- html2text
- requests
pip install -r requirements.txt
除了EPUB内容提取功能外,本工具还提供了Excel元数据提取和清理功能。
-
支持多种Excel格式:
- 简单格式(2行数据):第一行是属性,第二行是值
- 带标题的简单格式(3行数据):第一行是标题,第二行是属性,第三行是值
- 新格式(4行数据):第1行是属性,第4行是值
- 旧格式(4行数据):第3行是属性,第4行是值
- 带示例的新格式(5行数据):第1行是属性,第2行是示例,第3行是提示,第4行是空行,第5行是值
-
自动清理属性名:
- 移除括号及其内容
- 移除括号后的说明文字
- 处理半个括号的情况
- 移除"另附"等额外说明
- 处理带冒号的说明文字
-
保留值的原始内容:
- 不处理值的内容
- 保持长文本的完整性
- 只进行基本的空值处理
python excel_to_meta.py --src <源目录> --output <输出目录> --product_code <产品编号>
参数说明:
--src
:源Excel文件所在的基础目录--output
:输出目录--product_code
:图书产品编号
示例:
python excel_to_meta.py --src /Users/qu/books/src --output /Users/qu/books/output --product_code 109707-01
通过 app.py
提供的API接口调用:
from app import process_metadata
# 处理单个产品的元数据
result = process_metadata(
src_path="/Users/qu/books/src",
output_path="/Users/qu/books/output",
product_code="109707-01"
)
程序会在指定的输出目录下创建对应的元数据文件:
- 输出路径:
<output_path>/<product_code>/meta/<product_code>.meta.xlsx
- 文件格式:Excel文件,包含清理后的属性名和原始值
- 确保源目录中存在对应的Excel文件
- 确保有足够的权限访问源目录和输出目录
- 输出目录会自动创建(如果不存在)
- 如果输出文件已存在,会被覆盖
- Python 3.6+
- FastAPI
- uvicorn
- beautifulsoup4
- html2text
pip install -r requirements.txt
这是一个基于 FastAPI 的 Web 服务,提供 EPUB 文件转换和 Excel 元数据提取功能。
-
EPUB 转 Markdown
- 将 EPUB 文件转换为 Markdown 格式
- 支持图片提取和引用路径配置
- 保持文档结构和格式
- 支持多种输入方式:本地文件、网络URL、文件上传
-
Markdown 结构提取
- 从 Markdown 文件中提取层级结构
- 将 Markdown 转换为树状 JSON 数据
- 每个节点包含 title/content/children/level 属性
- 支持多种输入方式:文件路径、文本内容、上传文件
-
Excel 元数据提取
- 从 Excel 文件中提取元数据信息
- 支持自定义输入输出路径
- 复制环境变量配置文件:
cp .env.example .env
- 修改
.env
文件中的配置:
# Docker容器配置
CONTAINER_NAME=book-processor # 容器名称
IMAGE_NAME=book-processor # 镜像名称
API_KEY=epub_extractor_key_2024 # API密钥
HOST_PORT=8000 # 主机端口
# 目录配置
BOOKS_SRC_DIR=/path/to/books/src # 源文件目录
BOOKS_OUTPUT_DIR=/path/to/books/output # 输出目录
BOOKS_DATA_DIR=/path/to/books/data # 数据目录
/books
/src # 源文件目录
/100227-01
- book1.epub
- book2.epub
/output # 输出目录
/100227-01
/markdown
- book1.md
- book2.md
/images
- img1.jpg
- img2.png
/data # 数据目录
/100227-01
/epub
- 100227-01.epub.md
/images
- image1.jpg
- image2.png
/structure
- 100227-01.structure.json
- 确保Docker已安装并运行
- 确保目录结构正确
- 运行启动脚本:
./start.sh
- 检查容器状态:
docker ps
- 查看容器日志:
docker logs book-processor
- 测试健康检查接口:
curl -X GET http://localhost:8000/health
docker stop book-processor
docker rm book-processor
POST /epub-to-md
请求体:
{
"product_code": "产品编号",
"src_file": "源文件路径",
"output_file": "输出文件路径",
"img_dir": "图片存储路径",
"md_img_dir": "Markdown图片引用路径"
}
POST /epub-to-md-new
请求体:
{
"product_code": "产品编号",
"src": "源EPUB文件路径或URL",
"md_img_dir": "Markdown图片引用路径",
"save": true
}
POST /epub-to-md/file
请求体(表单数据):
file
: EPUB文件product_code
: 产品编号md_img_dir
: Markdown图片引用路径(可选)save
: 是否保存到文件(默认为false)
POST /md-to-structure
请求体:
{
"product_code": "产品编号",
"src": "源 Markdown 文件路径",
"text": "Markdown 文本内容",
"save": true
}
注意:src
和 text
参数只需提供其中一个,优先级为 text
> src
。
响应示例:
{
"status": "success",
"message": "层级结构数据提取成功",
"data": {
"structure": [
{
"title": "标题1",
"content": "内容1",
"children": [
{
"title": "子标题1",
"content": "子内容1",
"children": [],
"level": 2
}
],
"level": 1
}
]
},
"product_code": "100227-01"
}
POST /md-to-structure/file
请求体(表单数据):
file
: Markdown 文件product_code
: 产品编号save
: 是否保存到文件(布尔值)
POST /process_metadata
请求体:
{
"product_code": "产品编号",
"src_base": "源目录根路径",
"output_base": "输出目录根路径"
}
python epub_to_md.py --src /path/to/book.epub --product_code 100227-01 --save
参数说明:
--src
: EPUB文件路径或URL--file
: 上传的EPUB文件--product_code
: 产品编号(必需)--md_img_dir
: Markdown图片引用路径--save
: 是否保存到文件(默认为false)
python md_to_json_structure.py --src /path/to/document.md --product_code 100227-01 --save true
参数说明:
--src
: 源 Markdown 文件路径--text
: Markdown 文本内容--file
: MultipartFile 文件--product_code
: 产品编号(必需)--save
: 是否保存到文件(默认为 false)
- 安装依赖:
pip install -r requirements.txt
- 运行服务:
python app.py
服务将在 http://localhost:8000 启动
- EPUB 转 Markdown(新方法):
curl -X POST "http://localhost:8000/epub-to-md-new" \
-H "Content-Type: application/json" \
-d '{
"product_code": "BOOK001",
"src": "/path/to/book.epub",
"save": true
}'
- EPUB 转 Markdown(文件上传):
curl -X POST "http://localhost:8000/epub-to-md/file" \
-F "file=@/path/to/book.epub" \
-F "product_code=BOOK001" \
-F "save=true"
- Markdown 结构提取:
curl -X POST "http://localhost:8000/md-to-structure" \
-H "Content-Type: application/json" \
-d '{
"product_code": "BOOK001",
"src": "/path/to/document.md",
"save": true
}'
- Markdown 结构提取(文件上传):
curl -X POST "http://localhost:8000/md-to-structure/file" \
-F "file=@/path/to/document.md" \
-F "product_code=BOOK001" \
-F "save=true"
- Excel 元数据提取:
curl -X POST "http://localhost:8000/process_metadata" \
-H "Content-Type: application/json" \
-d '{
"product_code": "BOOK001",
"src_base": "/path/to/source",
"output_base": "/path/to/output"
}'
- 确保所有路径都是有效的且具有适当的访问权限
- 图片目录会自动创建(如果不存在)
- 所有 API 都返回 JSON 格式的响应
- 错误响应会包含详细的错误信息
- 当
save
设置为true
时:- EPUB转换结果将保存到
./data/${product_code}/epub/${product_code}.epub.md
- Markdown结构提取结果将保存到
./data/${product_code}/json/${product_code}.structure.json
- 图片将保存到
./data/${product_code}/images/
- EPUB转换结果将保存到
- 使用 FastAPI 框架构建
- 支持异步处理
- 包含完整的错误处理
- 提供详细的日志记录
# 检查服务状态
curl -X GET http://localhost:8000/health
响应示例:
{
"status": "success",
"message": "服务正常运行",
"data": {
"version": "1.0.0"
}
}
这是一个用于提取EPUB文件内容和Excel元数据的RESTful API服务。
- EPUB文件转换为Markdown格式
- Markdown文件结构提取
- Excel元数据提取
- 文本关键词提取
- 支持文件上传和URL链接
- 支持保存处理结果到本地文件
- 复制环境变量配置文件:
cp .env.example .env
- 修改
.env
文件中的配置:
# Docker容器配置
CONTAINER_NAME=book-processor # 容器名称
IMAGE_NAME=book-processor # 镜像名称
API_KEY=epub_extractor_key_2024 # API密钥
HOST_PORT=8000 # 主机端口
# 目录配置
DATA_DIR=/path/to/data # 数据目录
/books
/src # 源文件目录
/100227-01
- book1.epub
- book2.epub
/output # 输出目录
/100227-01
/markdown
- book1.md
- book2.md
/images
- img1.jpg
- img2.png
/data # 数据目录
/100227-01
/epub
- 100227-01.epub.md
/images
- image1.jpg
- image2.png
/structure
- 100227-01.structure.json
- 确保Docker已安装并运行
- 确保目录结构正确
- 运行启动脚本:
./start.sh
- 检查容器状态:
docker ps
- 查看容器日志:
docker logs book-processor
- 测试健康检查接口:
curl -X GET http://localhost:8000/health
docker stop book-processor
docker rm book-processor
curl -X GET http://localhost:8000/health
示例响应:
{
"status": "success",
"message": "服务正常运行",
"data": {
"version": "1.0.0"
}
}
curl -X POST http://localhost:8000/epub-to-md \
-H "Authorization: Bearer epub_extractor_key_2024" \
-H "Content-Type: application/json" \
-d '{
"product_code": "100227-01",
"src": "/app/src/100227-01/100227-01工程材料及检测-数字教材.epub",
"md_img_dir": "/app/books/100227-01/images",
"save": true
}'
curl -X POST http://localhost:8000/epub-to-md/file \
-H "Authorization: Bearer epub_extractor_key_2024" \
-F "file=@/path/to/your/file.epub" \
-F "product_code=100227-01" \
-F "save=true"
curl -X POST http://localhost:8000/md-to-structure \
-H "Authorization: Bearer epub_extractor_key_2024" \
-H "Content-Type: application/json" \
-d '{
"product_code": "100227-01",
"src": "/app/data/100227-01/epub/100227-01.epub.md",
"save": true
}'
curl -X POST http://localhost:8000/excel-to-meta \
-H "Authorization: Bearer epub_extractor_key_2024" \
-F "file=@/path/to/your/file.xlsx" \
-F "product_code=100227-01"
curl -X POST http://localhost:8000/extract-keywords \
-H "Authorization: Bearer epub_extractor_key_2024" \
-H "Content-Type: application/json" \
-d '{
"text": "这是一段需要提取关键词的文本内容",
"topk": 10
}'
示例响应:
{
"status": "success",
"message": "关键词提取成功",
"data": {
"keywords": [
{"word": "关键词1", "weight": 0.8},
{"word": "关键词2", "weight": 0.6},
{"word": "关键词3", "weight": 0.4}
]
}
}
- Python 3.8+
- Docker
- 克隆仓库:
git clone <repository_url>
cd epub-extractor
- 使用Docker运行:
./start.sh
.
├── app.py # FastAPI应用主文件
├── epub_to_md.py # EPUB转换模块
├── md_to_json_structure.py # Markdown结构提取模块
├── excel_to_meta.py # Excel元数据提取模块
├── text_keywords.py # 关键词提取模块
├── oss_uploader.py # 阿里云OSS上传工具
├── task_manager.py # 任务管理系统
├── start.sh # 启动脚本
├── Dockerfile # Docker构建文件
└── README.md # 项目文档
-
所有API请求都需要在Header中包含有效的API密钥:
Authorization: Bearer epub_extractor_key_2024
-
文件路径在容器内部使用,请确保使用正确的容器内路径:
- 源文件路径:
/app/src/...
- 输出文件路径:
/app/output/...
- 数据文件路径:
/app/data/...
- 源文件路径:
-
使用
save=true
参数可以将处理结果保存到本地文件。 -
关键词提取支持自定义返回的关键词数量(topk参数)。
-
确保目录具有正确的读写权限。
-
首次运行时,Docker会自动创建必要的目录结构。