isbnx 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- isbnx-0.0.1/PKG-INFO +312 -0
- isbnx-0.0.1/README.md +288 -0
- isbnx-0.0.1/pyproject.toml +52 -0
- isbnx-0.0.1/src/isbnx/__init__.py +20 -0
- isbnx-0.0.1/src/isbnx/archive.py +570 -0
- isbnx-0.0.1/src/isbnx/config.py +158 -0
- isbnx-0.0.1/src/isbnx/detector.py +326 -0
- isbnx-0.0.1/src/isbnx/epub.py +186 -0
- isbnx-0.0.1/src/isbnx/isbnx.py +191 -0
- isbnx-0.0.1/src/isbnx/mobi.py +258 -0
- isbnx-0.0.1/src/isbnx/model/isbndetect_yolo.onnx +0 -0
- isbnx-0.0.1/src/isbnx/models.py +333 -0
- isbnx-0.0.1/src/isbnx/ocr/__init__.py +7 -0
- isbnx-0.0.1/src/isbnx/ocr/isbnx_pyzbar.py +38 -0
- isbnx-0.0.1/src/isbnx/ocr/isbnx_rapiocr.py +104 -0
- isbnx-0.0.1/src/isbnx/pdf.py +272 -0
- isbnx-0.0.1/src/isbnx/pdf_type.py +69 -0
- isbnx-0.0.1/src/isbnx/pdgview/PdgView.dll +0 -0
- isbnx-0.0.1/src/isbnx/pdgview/__init__.py +0 -0
- isbnx-0.0.1/src/isbnx/utils/__init__.py +7 -0
- isbnx-0.0.1/src/isbnx/utils/cip_rules.py +192 -0
- isbnx-0.0.1/src/isbnx/utils/io.py +76 -0
- isbnx-0.0.1/src/isbnx/utils/isbn_utils.py +135 -0
isbnx-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: isbnx
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: 从 PDF、图片、压缩包和 EPUB 文件中提取 ISBN 号,支持 ONNX 检测和 OCR 识别
|
|
5
|
+
Author: zscmmm
|
|
6
|
+
Author-email: zscmmm <111739721+zscmmm@users.noreply.github.com>
|
|
7
|
+
Requires-Dist: loguru>=0.7.3
|
|
8
|
+
Requires-Dist: mneia-isbn>=0.0.3
|
|
9
|
+
Requires-Dist: opencv-python>=4.13.0.92
|
|
10
|
+
Requires-Dist: pillow>=12.2.0
|
|
11
|
+
Requires-Dist: pydantic-settings>=2.14.2
|
|
12
|
+
Requires-Dist: pymupdf>=1.27.2.3
|
|
13
|
+
Requires-Dist: pyzbar>=0.1.9
|
|
14
|
+
Requires-Dist: rapidocr>=3.9.0
|
|
15
|
+
Requires-Dist: rarfile>=4.2
|
|
16
|
+
Requires-Dist: onnxruntime>=1.27.0
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Project-URL: Homepage, https://github.com/zscmmm/isbnx
|
|
19
|
+
Project-URL: Documentation, https://isbnx.readthedocs.org
|
|
20
|
+
Project-URL: Repository, https://github.com/zscmmm/isbnx.git
|
|
21
|
+
Project-URL: Issues, https://github.com/zscmmm/isbnx/issues
|
|
22
|
+
Project-URL: Changelog, https://github.com/zscmmm/isbnx/blob/main/CHANGELOG.md
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# isbnx
|
|
27
|
+
|
|
28
|
+
> 从 PDF、图片、EPUB、MOBI 和压缩包中智能提取 ISBN 号
|
|
29
|
+
|
|
30
|
+
[](https://www.python.org/)
|
|
31
|
+
[](LICENSE)
|
|
32
|
+
[](https://isbnx.readthedocs.org)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 安装
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install isbnx
|
|
42
|
+
# 或
|
|
43
|
+
uv add isbnx
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 系统依赖
|
|
47
|
+
|
|
48
|
+
- pyzbar, [参考安装](https://pypi.org/project/pyzbar/), 自己简单测试准确率好像比[zbarlight](https://pypi.org/project/zbarlight/)好一些,单安装依赖有点麻烦
|
|
49
|
+
|
|
50
|
+
- **win**: 需要一些c++动态库,
|
|
51
|
+
- **macOS**: 需要设置 `DYLD_LIBRARY_PATH` 以支持条形码解码
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
echo 'export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH' >> ~/.zshrc
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
- pdf-inspector, 可选, [参考安装](https://github.com/firecrawl/pdf-inspector), 需要配置rust,不然可能安装不成功
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 快速开始
|
|
66
|
+
|
|
67
|
+
### 统一入口
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from isbnx import extract
|
|
71
|
+
|
|
72
|
+
# 自动根据文件后缀选择提取方式
|
|
73
|
+
result = extract("cover.png")
|
|
74
|
+
if result.success:
|
|
75
|
+
print(result.bookinfo.isbn13) # 9787123456789
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 使用 ISBNX 类
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
from isbnx import ISBNX
|
|
82
|
+
|
|
83
|
+
# 从图片提取
|
|
84
|
+
result = ISBNX().from_image("cover.png")
|
|
85
|
+
|
|
86
|
+
# 从 PDF 提取(支持文本型和扫描件)
|
|
87
|
+
result = ISBNX().from_pdf("book.pdf")
|
|
88
|
+
|
|
89
|
+
# 从 EPUB 提取
|
|
90
|
+
result = ISBNX().from_epub("book.epub")
|
|
91
|
+
|
|
92
|
+
# 从 MOBI 提取
|
|
93
|
+
result = ISBNX().from_mobi("book.mobi")
|
|
94
|
+
|
|
95
|
+
# 从压缩包提取(支持 ZIP/RAR/UVZ)
|
|
96
|
+
result = ISBNX().from_archive("book.zip")
|
|
97
|
+
|
|
98
|
+
# 或使用统一的自动分发入口
|
|
99
|
+
result = ISBNX().extract("book.pdf")
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 支持的文件格式
|
|
105
|
+
|
|
106
|
+
| 类型 | 后缀 | 提取策略 |
|
|
107
|
+
|------|------|----------|
|
|
108
|
+
| **图片** | `.png` `.jpg` `.jpeg` | ONNX 检测 → OCR / 条码解码 |
|
|
109
|
+
| **PDF** | `.pdf` | 书签定位 + 文本搜索(文本型)→ 渲染图片检测(扫描件) |
|
|
110
|
+
| **EPUB** | `.epub` | OPF 元数据优先 → XHTML 内容扫描 |
|
|
111
|
+
| **MOBI** | `.mobi` | EXTH 元数据优先 → 文本记录扫描 |
|
|
112
|
+
| **压缩包** | `.zip` `.rar` `.uvz` | `meta.xml` → `bookinfo.dat` → `leg001.pdg` → 兜底 PDG 图片 |
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 核心流程
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
输入文件
|
|
120
|
+
│
|
|
121
|
+
▼
|
|
122
|
+
文件类型判断 ───→ 图片 ───→ ONNX YOLO 检测 ───→ OCR / 条码解码 ───→ ISBN 提取
|
|
123
|
+
│ PDF ───→ 类型判断(文本/扫描)─→ 文本搜索 / 渲染检测
|
|
124
|
+
│ EPUB ──→ OPF 元数据 / XHTML 扫描
|
|
125
|
+
│ MOBI ──→ EXTH 元数据 / 文本记录扫描
|
|
126
|
+
│ 压缩包 ─→ meta.xml → bookinfo.dat → PDG 图片解码 → 检测
|
|
127
|
+
│
|
|
128
|
+
▼
|
|
129
|
+
ExtractResult
|
|
130
|
+
├── success: bool # 是否提取成功
|
|
131
|
+
├── bookinfo.isbn13 # ISBN-13
|
|
132
|
+
├── bookinfo.isbn10 # ISBN-10
|
|
133
|
+
├── bookinfo.ssid # SS 号(压缩包特有)
|
|
134
|
+
├── locate # 定位信息(页码、方法)
|
|
135
|
+
├── ocr # OCR 原始识别文本
|
|
136
|
+
├── meta # 文件元信息
|
|
137
|
+
└── elapsed # 耗时(秒)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 配置
|
|
143
|
+
|
|
144
|
+
### 严格等级
|
|
145
|
+
|
|
146
|
+
通过 `strict` 参数控制提取结果的校验严格程度:
|
|
147
|
+
|
|
148
|
+
| 等级 | 含义 | 适用场景 |
|
|
149
|
+
|:----:|------|----------|
|
|
150
|
+
| 1 | ISBN **和** SSID 都必须存在且有效 | 最高严格 |
|
|
151
|
+
| 2 | ISBN 必须存在且校验通过 | 图片/PDF 检测 |
|
|
152
|
+
| 3 | ISBN 有效 **或** SSID 存在(默认) | 压缩包提取 |
|
|
153
|
+
|
|
154
|
+
### 自定义配置
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
from isbnx import ISBNX
|
|
158
|
+
from isbnx.config import Settings
|
|
159
|
+
|
|
160
|
+
# 嵌套配置通过 dict 传参
|
|
161
|
+
config = Settings(
|
|
162
|
+
strict=2, # 严格等级
|
|
163
|
+
ocr={"ocr_model": "medium"}, # OCR 精度(small / medium)
|
|
164
|
+
detector={"conf_threshold": 0.5}, # ONNX 检测阈值
|
|
165
|
+
pdf={"front_start": 1, "back_end": 3},
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
result = ISBNX(config=config).from_image("cover.png")
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 运行时调整
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
from isbnx.config import configure
|
|
175
|
+
|
|
176
|
+
configure(
|
|
177
|
+
strict=2,
|
|
178
|
+
ocr={"ocr_model": "medium"},
|
|
179
|
+
detector={"conf_threshold": 0.5},
|
|
180
|
+
)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 输出模型
|
|
186
|
+
|
|
187
|
+
所有提取结果使用 Pydantic 模型,可通过一致的接口访问:
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
result = ISBNX().from_image("cover.png")
|
|
191
|
+
|
|
192
|
+
# 基本状态
|
|
193
|
+
result.success # True / False
|
|
194
|
+
result.error # 失败原因(如有)
|
|
195
|
+
|
|
196
|
+
# 书籍信息
|
|
197
|
+
result.bookinfo.isbn # 原始 ISBN
|
|
198
|
+
result.bookinfo.isbn13 # ISBN-13 格式
|
|
199
|
+
result.bookinfo.isbn10 # ISBN-10 格式
|
|
200
|
+
result.bookinfo.isbn_valid # 校验是否合法
|
|
201
|
+
result.bookinfo.ssid # SS 号(压缩包)
|
|
202
|
+
|
|
203
|
+
# 定位信息
|
|
204
|
+
result.locate.page # 命中页码
|
|
205
|
+
result.locate.method # 定位方式(onnx / text / bookmark / ...)
|
|
206
|
+
result.locate.score # 检测置信度
|
|
207
|
+
|
|
208
|
+
# OCR 结果
|
|
209
|
+
result.ocr.lines # OCR 文本行
|
|
210
|
+
result.ocr.text # 全部文本(换行拼接)
|
|
211
|
+
|
|
212
|
+
# 元信息
|
|
213
|
+
result.meta.source # 源文件路径
|
|
214
|
+
result.meta.source_type # 源文件类型
|
|
215
|
+
|
|
216
|
+
# 耗时
|
|
217
|
+
result.elapsed # 处理耗时(秒)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 项目结构
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
isbnx/
|
|
226
|
+
├── src/
|
|
227
|
+
│ └── isbnx/
|
|
228
|
+
│ ├── __init__.py # 公开 API 入口
|
|
229
|
+
│ ├── isbnx.py # ISBNX 主类,统一提取接口
|
|
230
|
+
│ ├── config.py # Pydantic-Settings 配置管理
|
|
231
|
+
│ ├── models.py # Pydantic 数据模型
|
|
232
|
+
│ ├── detector.py # ONNX YOLO 检测器 + 检测/OCR 流水线
|
|
233
|
+
│ ├── pdf.py # PDF ISBN 提取
|
|
234
|
+
│ ├── epub.py # EPUB ISBN 提取
|
|
235
|
+
│ ├── mobi.py # MOBI ISBN 提取
|
|
236
|
+
│ ├── archive.py # 压缩包(PDG)ISBN 提取
|
|
237
|
+
│ ├── pdf_type.py # PDF 类型检测(文本/扫描)
|
|
238
|
+
│ ├── model/ # ONNX 模型文件
|
|
239
|
+
│ │ └── isbndetect_yolo.onnx
|
|
240
|
+
│ ├── ocr/ # OCR 引擎
|
|
241
|
+
│ │ ├── isbnx_pyzbar.py # 条形码解码
|
|
242
|
+
│ │ └── isbnx_rapiocr.py # RapidOCR 文字识别
|
|
243
|
+
│ ├── pdgview/ # PDG 图片解码器
|
|
244
|
+
│ └── utils/ # 工具函数
|
|
245
|
+
│ ├── cip_rules.py # CIP 数据提取规则
|
|
246
|
+
│ ├── io.py # 文件 I/O 工具
|
|
247
|
+
│ └── isbn_utils.py # ISBN 提取与校验
|
|
248
|
+
├── tests/ # 测试用例
|
|
249
|
+
├── docs/ # MkDocs 文档
|
|
250
|
+
├── pyproject.toml
|
|
251
|
+
└── README.md
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 开发
|
|
257
|
+
|
|
258
|
+
### 环境要求
|
|
259
|
+
|
|
260
|
+
- Python ≥ 3.10, 只在 python 3.13上进行测试开发的
|
|
261
|
+
- [uv](https://docs.astral.sh/uv/) 包管理器
|
|
262
|
+
|
|
263
|
+
### 本地开发
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# 克隆项目
|
|
267
|
+
git clone https://github.com/zscmmm/isbnx.git
|
|
268
|
+
cd isbnx
|
|
269
|
+
|
|
270
|
+
# 创建虚拟环境并安装依赖
|
|
271
|
+
uv sync --group dev
|
|
272
|
+
|
|
273
|
+
# 运行测试
|
|
274
|
+
uv run pytest
|
|
275
|
+
|
|
276
|
+
# 构建文档
|
|
277
|
+
uv run mkdocs serve
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 基准测试
|
|
283
|
+
|
|
284
|
+
`isbnx` 与同类工具 `cipx` 的对比测试报告详见 [isbnx vs cipx 报告](https://isbnx.readthedocs.org/isbnx_vs_cipx_report/)。
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 路线图
|
|
289
|
+
|
|
290
|
+
- [x] 图片 ISBN 提取
|
|
291
|
+
- [x] PDF 提取(文本型 + 扫描件)
|
|
292
|
+
- [x] EPUB 提取
|
|
293
|
+
- [x] MOBI 提取
|
|
294
|
+
- [x] 压缩包(PDG)提取
|
|
295
|
+
- [x] ONNX YOLO 深度学习检测
|
|
296
|
+
- [x] 条形码解码
|
|
297
|
+
- [x] 文档网站(MkDocs)
|
|
298
|
+
- [ ] LLM 解析 CIP 字段
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 许可证
|
|
303
|
+
|
|
304
|
+
本项目基于 MIT 许可证开源 — 详见 [LICENSE](LICENSE) 文件。
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## 相关项目
|
|
309
|
+
|
|
310
|
+
- [mneia-isbn](https://pypi.org/project/mneia-isbn/) — ISBN 解析与校验库
|
|
311
|
+
- [pyzbar](https://pypi.org/project/pyzbar/) -条形码解析库
|
|
312
|
+
- [cipx](https://github.com/zscmmm/cipx) — CIP 信息提取工具
|
isbnx-0.0.1/README.md
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
|
|
2
|
+
# isbnx
|
|
3
|
+
|
|
4
|
+
> 从 PDF、图片、EPUB、MOBI 和压缩包中智能提取 ISBN 号
|
|
5
|
+
|
|
6
|
+
[](https://www.python.org/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://isbnx.readthedocs.org)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install isbnx
|
|
18
|
+
# 或
|
|
19
|
+
uv add isbnx
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 系统依赖
|
|
23
|
+
|
|
24
|
+
- pyzbar, [参考安装](https://pypi.org/project/pyzbar/), 自己简单测试准确率好像比[zbarlight](https://pypi.org/project/zbarlight/)好一些,单安装依赖有点麻烦
|
|
25
|
+
|
|
26
|
+
- **win**: 需要一些c++动态库,
|
|
27
|
+
- **macOS**: 需要设置 `DYLD_LIBRARY_PATH` 以支持条形码解码
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
echo 'export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH' >> ~/.zshrc
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
- pdf-inspector, 可选, [参考安装](https://github.com/firecrawl/pdf-inspector), 需要配置rust,不然可能安装不成功
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
### 统一入口
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from isbnx import extract
|
|
47
|
+
|
|
48
|
+
# 自动根据文件后缀选择提取方式
|
|
49
|
+
result = extract("cover.png")
|
|
50
|
+
if result.success:
|
|
51
|
+
print(result.bookinfo.isbn13) # 9787123456789
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 使用 ISBNX 类
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from isbnx import ISBNX
|
|
58
|
+
|
|
59
|
+
# 从图片提取
|
|
60
|
+
result = ISBNX().from_image("cover.png")
|
|
61
|
+
|
|
62
|
+
# 从 PDF 提取(支持文本型和扫描件)
|
|
63
|
+
result = ISBNX().from_pdf("book.pdf")
|
|
64
|
+
|
|
65
|
+
# 从 EPUB 提取
|
|
66
|
+
result = ISBNX().from_epub("book.epub")
|
|
67
|
+
|
|
68
|
+
# 从 MOBI 提取
|
|
69
|
+
result = ISBNX().from_mobi("book.mobi")
|
|
70
|
+
|
|
71
|
+
# 从压缩包提取(支持 ZIP/RAR/UVZ)
|
|
72
|
+
result = ISBNX().from_archive("book.zip")
|
|
73
|
+
|
|
74
|
+
# 或使用统一的自动分发入口
|
|
75
|
+
result = ISBNX().extract("book.pdf")
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 支持的文件格式
|
|
81
|
+
|
|
82
|
+
| 类型 | 后缀 | 提取策略 |
|
|
83
|
+
|------|------|----------|
|
|
84
|
+
| **图片** | `.png` `.jpg` `.jpeg` | ONNX 检测 → OCR / 条码解码 |
|
|
85
|
+
| **PDF** | `.pdf` | 书签定位 + 文本搜索(文本型)→ 渲染图片检测(扫描件) |
|
|
86
|
+
| **EPUB** | `.epub` | OPF 元数据优先 → XHTML 内容扫描 |
|
|
87
|
+
| **MOBI** | `.mobi` | EXTH 元数据优先 → 文本记录扫描 |
|
|
88
|
+
| **压缩包** | `.zip` `.rar` `.uvz` | `meta.xml` → `bookinfo.dat` → `leg001.pdg` → 兜底 PDG 图片 |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 核心流程
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
输入文件
|
|
96
|
+
│
|
|
97
|
+
▼
|
|
98
|
+
文件类型判断 ───→ 图片 ───→ ONNX YOLO 检测 ───→ OCR / 条码解码 ───→ ISBN 提取
|
|
99
|
+
│ PDF ───→ 类型判断(文本/扫描)─→ 文本搜索 / 渲染检测
|
|
100
|
+
│ EPUB ──→ OPF 元数据 / XHTML 扫描
|
|
101
|
+
│ MOBI ──→ EXTH 元数据 / 文本记录扫描
|
|
102
|
+
│ 压缩包 ─→ meta.xml → bookinfo.dat → PDG 图片解码 → 检测
|
|
103
|
+
│
|
|
104
|
+
▼
|
|
105
|
+
ExtractResult
|
|
106
|
+
├── success: bool # 是否提取成功
|
|
107
|
+
├── bookinfo.isbn13 # ISBN-13
|
|
108
|
+
├── bookinfo.isbn10 # ISBN-10
|
|
109
|
+
├── bookinfo.ssid # SS 号(压缩包特有)
|
|
110
|
+
├── locate # 定位信息(页码、方法)
|
|
111
|
+
├── ocr # OCR 原始识别文本
|
|
112
|
+
├── meta # 文件元信息
|
|
113
|
+
└── elapsed # 耗时(秒)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 配置
|
|
119
|
+
|
|
120
|
+
### 严格等级
|
|
121
|
+
|
|
122
|
+
通过 `strict` 参数控制提取结果的校验严格程度:
|
|
123
|
+
|
|
124
|
+
| 等级 | 含义 | 适用场景 |
|
|
125
|
+
|:----:|------|----------|
|
|
126
|
+
| 1 | ISBN **和** SSID 都必须存在且有效 | 最高严格 |
|
|
127
|
+
| 2 | ISBN 必须存在且校验通过 | 图片/PDF 检测 |
|
|
128
|
+
| 3 | ISBN 有效 **或** SSID 存在(默认) | 压缩包提取 |
|
|
129
|
+
|
|
130
|
+
### 自定义配置
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
from isbnx import ISBNX
|
|
134
|
+
from isbnx.config import Settings
|
|
135
|
+
|
|
136
|
+
# 嵌套配置通过 dict 传参
|
|
137
|
+
config = Settings(
|
|
138
|
+
strict=2, # 严格等级
|
|
139
|
+
ocr={"ocr_model": "medium"}, # OCR 精度(small / medium)
|
|
140
|
+
detector={"conf_threshold": 0.5}, # ONNX 检测阈值
|
|
141
|
+
pdf={"front_start": 1, "back_end": 3},
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
result = ISBNX(config=config).from_image("cover.png")
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 运行时调整
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
from isbnx.config import configure
|
|
151
|
+
|
|
152
|
+
configure(
|
|
153
|
+
strict=2,
|
|
154
|
+
ocr={"ocr_model": "medium"},
|
|
155
|
+
detector={"conf_threshold": 0.5},
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 输出模型
|
|
162
|
+
|
|
163
|
+
所有提取结果使用 Pydantic 模型,可通过一致的接口访问:
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
result = ISBNX().from_image("cover.png")
|
|
167
|
+
|
|
168
|
+
# 基本状态
|
|
169
|
+
result.success # True / False
|
|
170
|
+
result.error # 失败原因(如有)
|
|
171
|
+
|
|
172
|
+
# 书籍信息
|
|
173
|
+
result.bookinfo.isbn # 原始 ISBN
|
|
174
|
+
result.bookinfo.isbn13 # ISBN-13 格式
|
|
175
|
+
result.bookinfo.isbn10 # ISBN-10 格式
|
|
176
|
+
result.bookinfo.isbn_valid # 校验是否合法
|
|
177
|
+
result.bookinfo.ssid # SS 号(压缩包)
|
|
178
|
+
|
|
179
|
+
# 定位信息
|
|
180
|
+
result.locate.page # 命中页码
|
|
181
|
+
result.locate.method # 定位方式(onnx / text / bookmark / ...)
|
|
182
|
+
result.locate.score # 检测置信度
|
|
183
|
+
|
|
184
|
+
# OCR 结果
|
|
185
|
+
result.ocr.lines # OCR 文本行
|
|
186
|
+
result.ocr.text # 全部文本(换行拼接)
|
|
187
|
+
|
|
188
|
+
# 元信息
|
|
189
|
+
result.meta.source # 源文件路径
|
|
190
|
+
result.meta.source_type # 源文件类型
|
|
191
|
+
|
|
192
|
+
# 耗时
|
|
193
|
+
result.elapsed # 处理耗时(秒)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 项目结构
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
isbnx/
|
|
202
|
+
├── src/
|
|
203
|
+
│ └── isbnx/
|
|
204
|
+
│ ├── __init__.py # 公开 API 入口
|
|
205
|
+
│ ├── isbnx.py # ISBNX 主类,统一提取接口
|
|
206
|
+
│ ├── config.py # Pydantic-Settings 配置管理
|
|
207
|
+
│ ├── models.py # Pydantic 数据模型
|
|
208
|
+
│ ├── detector.py # ONNX YOLO 检测器 + 检测/OCR 流水线
|
|
209
|
+
│ ├── pdf.py # PDF ISBN 提取
|
|
210
|
+
│ ├── epub.py # EPUB ISBN 提取
|
|
211
|
+
│ ├── mobi.py # MOBI ISBN 提取
|
|
212
|
+
│ ├── archive.py # 压缩包(PDG)ISBN 提取
|
|
213
|
+
│ ├── pdf_type.py # PDF 类型检测(文本/扫描)
|
|
214
|
+
│ ├── model/ # ONNX 模型文件
|
|
215
|
+
│ │ └── isbndetect_yolo.onnx
|
|
216
|
+
│ ├── ocr/ # OCR 引擎
|
|
217
|
+
│ │ ├── isbnx_pyzbar.py # 条形码解码
|
|
218
|
+
│ │ └── isbnx_rapiocr.py # RapidOCR 文字识别
|
|
219
|
+
│ ├── pdgview/ # PDG 图片解码器
|
|
220
|
+
│ └── utils/ # 工具函数
|
|
221
|
+
│ ├── cip_rules.py # CIP 数据提取规则
|
|
222
|
+
│ ├── io.py # 文件 I/O 工具
|
|
223
|
+
│ └── isbn_utils.py # ISBN 提取与校验
|
|
224
|
+
├── tests/ # 测试用例
|
|
225
|
+
├── docs/ # MkDocs 文档
|
|
226
|
+
├── pyproject.toml
|
|
227
|
+
└── README.md
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 开发
|
|
233
|
+
|
|
234
|
+
### 环境要求
|
|
235
|
+
|
|
236
|
+
- Python ≥ 3.10, 只在 python 3.13上进行测试开发的
|
|
237
|
+
- [uv](https://docs.astral.sh/uv/) 包管理器
|
|
238
|
+
|
|
239
|
+
### 本地开发
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# 克隆项目
|
|
243
|
+
git clone https://github.com/zscmmm/isbnx.git
|
|
244
|
+
cd isbnx
|
|
245
|
+
|
|
246
|
+
# 创建虚拟环境并安装依赖
|
|
247
|
+
uv sync --group dev
|
|
248
|
+
|
|
249
|
+
# 运行测试
|
|
250
|
+
uv run pytest
|
|
251
|
+
|
|
252
|
+
# 构建文档
|
|
253
|
+
uv run mkdocs serve
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 基准测试
|
|
259
|
+
|
|
260
|
+
`isbnx` 与同类工具 `cipx` 的对比测试报告详见 [isbnx vs cipx 报告](https://isbnx.readthedocs.org/isbnx_vs_cipx_report/)。
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 路线图
|
|
265
|
+
|
|
266
|
+
- [x] 图片 ISBN 提取
|
|
267
|
+
- [x] PDF 提取(文本型 + 扫描件)
|
|
268
|
+
- [x] EPUB 提取
|
|
269
|
+
- [x] MOBI 提取
|
|
270
|
+
- [x] 压缩包(PDG)提取
|
|
271
|
+
- [x] ONNX YOLO 深度学习检测
|
|
272
|
+
- [x] 条形码解码
|
|
273
|
+
- [x] 文档网站(MkDocs)
|
|
274
|
+
- [ ] LLM 解析 CIP 字段
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 许可证
|
|
279
|
+
|
|
280
|
+
本项目基于 MIT 许可证开源 — 详见 [LICENSE](LICENSE) 文件。
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 相关项目
|
|
285
|
+
|
|
286
|
+
- [mneia-isbn](https://pypi.org/project/mneia-isbn/) — ISBN 解析与校验库
|
|
287
|
+
- [pyzbar](https://pypi.org/project/pyzbar/) -条形码解析库
|
|
288
|
+
- [cipx](https://github.com/zscmmm/cipx) — CIP 信息提取工具
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "isbnx"
|
|
3
|
+
version = "0.0.1"
|
|
4
|
+
description = "从 PDF、图片、压缩包和 EPUB 文件中提取 ISBN 号,支持 ONNX 检测和 OCR 识别"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
authors = [
|
|
7
|
+
{ name = "zscmmm", email = "111739721+zscmmm@users.noreply.github.com" }
|
|
8
|
+
]
|
|
9
|
+
requires-python = ">=3.11"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"loguru>=0.7.3",
|
|
12
|
+
"mneia-isbn>=0.0.3",
|
|
13
|
+
"opencv-python>=4.13.0.92",
|
|
14
|
+
"pillow>=12.2.0",
|
|
15
|
+
"pydantic-settings>=2.14.2",
|
|
16
|
+
"pymupdf>=1.27.2.3",
|
|
17
|
+
"pyzbar>=0.1.9",
|
|
18
|
+
"rapidocr>=3.9.0",
|
|
19
|
+
"rarfile>=4.2",
|
|
20
|
+
"onnxruntime>=1.27.0",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[dependency-groups]
|
|
24
|
+
dev = [
|
|
25
|
+
"pdf_inspector>=0.2.0",
|
|
26
|
+
"mkdocs>=1.6.1,<2.0",
|
|
27
|
+
"mkdocs-autorefs>=1.4.1,<2.0",
|
|
28
|
+
"mkdocs-material>=9.6.12,<10.0",
|
|
29
|
+
"mkdocstrings[python]>=0.29.1,<1.0",
|
|
30
|
+
"pytest>=8.3.5",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# [project.scripts]
|
|
35
|
+
# isbnx = "isbnx:main"
|
|
36
|
+
|
|
37
|
+
[build-system]
|
|
38
|
+
requires = ["uv_build>=0.11.24,<0.12.0"]
|
|
39
|
+
build-backend = "uv_build"
|
|
40
|
+
|
|
41
|
+
[[tool.uv.index]]
|
|
42
|
+
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
|
|
43
|
+
default = true
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
[project.urls]
|
|
48
|
+
Homepage = "https://github.com/zscmmm/isbnx"
|
|
49
|
+
Documentation = "https://isbnx.readthedocs.org"
|
|
50
|
+
Repository = "https://github.com/zscmmm/isbnx.git"
|
|
51
|
+
Issues = "https://github.com/zscmmm/isbnx/issues"
|
|
52
|
+
Changelog = "https://github.com/zscmmm/isbnx/blob/main/CHANGELOG.md"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from isbnx.config import Settings, configure, settings
|
|
2
|
+
from isbnx.isbnx import ISBNX, extract
|
|
3
|
+
from isbnx.models import Detect, ExtractResult, Locate, Meta, OCRResult
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"Settings",
|
|
7
|
+
"configure",
|
|
8
|
+
"settings",
|
|
9
|
+
"ISBNX",
|
|
10
|
+
"extract",
|
|
11
|
+
"Detect",
|
|
12
|
+
"Locate",
|
|
13
|
+
"Meta",
|
|
14
|
+
"OCRResult",
|
|
15
|
+
"ExtractResult",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def main() -> None:
|
|
20
|
+
print("Hello from isbnx!")
|