rajnishism/PDF-Figure-Extractor
GitHub: rajnishism/PDF-Figure-Extractor
一个基于三层检测管线的全栈PDF视觉资产提取引擎,能够自动检测并智能关联图题,从研究论文和技术报告中批量提取图表、表格等视觉元素。
Stars: 0 | Forks: 0
<<<<<<< HEAD
# 🔍 VisionExtract
### 智能 PDF 视觉资产提取引擎
**自动检测、提取并导出任何 PDF 中的图表、地图和表格——包含图题、置信度评分以及结构化的 ZIP 导出。**
[](https://python.org)
[](https://fastapi.tiangolo.com)
[](https://react.dev)
[](https://pymupdf.readthedocs.io)
[](LICENSE)
## ✨ 什么是 VisionExtract?
VisionExtract 是一个全栈 Web 应用程序,能够读取任何 PDF 文档并智能提取所有视觉资产——包括图表、地图、示意图和表格——及其相关的图题。它在一个美观且交互式的界面中呈现这些内容,并允许你将所有内容导出为有组织的 ZIP 压缩包。
## 🎯 核心功能
| 功能 | 描述 |
|---|---|
| **三层检测 Pipeline** | 按优先级顺序结合了 PyMuPDF 矢量网格分析、PDF XObject 提取和 OpenCV 边缘检测 |
| **智能图题关联** | 具有方向感知逻辑(上方 = 主要,下方 = 备选)的多信号评分矩阵 |
| **五级置信度评分** | 根据检测来源和图题质量,提供 70%–100% 的确定性置信度 |
| **交互式 PDF 阅读器** | 带有缩放控制、点阵画布和点击高亮边界框的暗黑模式 PDF 查看器 |
| **可调整大小的分栏布局** | 拖动分隔线即可调整 PDF 查看器和资产面板的大小 |
| **实时导出进度** | 全文档导出,具有逐页的实时进度条和完成百分比 |
| **结构化 ZIP 导出** | 资产按 `Figures/`、`Tables/` 和 `Unconfirmed/` 文件夹分类整理 |
| **感知哈希去重** | 自动过滤重复的 logo 和页眉 |
| **100% 置信度过滤** | 仅导出高置信度的已验证资产,并将备选资产存放在单独的文件夹中 |
## 🏗️ 架构
```
Report Parse/
├── backend/ # FastAPI Python backend
│ ├── main.py # API routes & export logic
│ ├── processor.py # Core PDF extraction engine
│ ├── assets/ # Runtime: extracted image PNGs (git-ignored)
│ └── uploads/ # Runtime: uploaded PDFs (git-ignored)
│
└── frontend/ # React + TypeScript frontend
└── src/
├── App.tsx # Main layout, export flow, resize logic
├── index.css # Full design system (dark theme)
├── components/
│ ├── PdfViewer.tsx # PDF reader with bbox overlay
│ └── AssetList.tsx # Extracted asset cards panel
└── store/
└── useStore.ts # Zustand global state
```
## 🔬 提取 Pipeline 的工作原理
### 阶段 1 — 渲染
PDF 页面被渲染为高分辨率的栅格图像(缩放因子),以便进行 OpenCV 处理。
### 阶段 2 — 三层检测
| 优先级 | 检测器 | 方法 | 捕获内容 |
|---|---|---|---|
| **第一层** | `table_detect` | `page.find_tables()` — PyMuPDF 矢量线分析 | 带有边框线的基于网格的表格 |
| **第二层** | `pdf_object` | 来自 PDF 结构的 XObject 扫描 | 栅格图像、嵌入的图表 |
| **第三层** | `cv_region` | OpenCV Canny 边缘 + 轮廓检测 | 矢量图、地图、未标记的图表 |
### 阶段 3 — 过滤
- **位置过滤器**:去除页眉/页脚区域和过大的捕获内容(占页面 90% 以上)
- **文本覆盖率过滤器**:文本覆盖率 ≥30% 的 `cv_region` 检测结果将被丢弃(防止带边框的段落被提取为图表)
- **纯图题过滤器**:极小的纯文本区域将被丢弃
### 阶段 4 — 图题关联(多信号评分)
对于每个图表,所有附近的文本块都会根据 7 个信号进行评分:
| 信号 | 分值 |
|---|---|
| 正则匹配(`Figure X`、`Table X`、`Map X`、`Chart X`) | +4.0(必要条件) |
| 位于图表**上方**(主要) | 满分权重 + 最远 150pt 的距离衰减 |
| 位于图表**下方**(备选) | −2.0 方向惩罚 + 80pt 硬性上限 |
| 距离衰减(越近 = 得分越高) | +0.2 到 +2.0 |
| 水平居中对齐 | +0.5 到 +1.5 |
| 宽度比例匹配 | +0.2 到 +0.8 |
| 斜体 / 较小字体 | +0.4 到 +0.5 |
| 介入元素(图题与该图表之间存在另一个图表) | −2.5 |
贪婪二分图分配确保每个图题最多只匹配一个图表。
### 阶段 5 — 置信度评分
| 等级 | 条件 | 置信度 |
|---|---|---|
| **A** | `table_detect`/`pdf_object` + 上方图题 + 带编号的图表 | **100%** |
| **B** | `cv_region` + 上方图题 + 带编号的图表 | **95%** |
| **C** | 任何来源 + 上方图题(无编号) | **80%** |
| **D** | 任何来源 + 下方图题(备选) | **70%** |
| **E** | 未找到图题 | **50–75%** |
### 阶段 6 — 去重
感知哈希 跨页面追踪重复的图像。出现在 ≥20% 页面上的图像(如 logo、水印)会被自动过滤掉。
## 🚀 配置指南
### 前置条件
| 需求 | 版本 |
|---|---|
| Python | 3.10+ |
| Node.js | 18+ |
| pip | 最新版 |
| npm | 最新版 |
### 后端设置
```
# 1. 导航到 backend 目录
cd "Report Parse/backend"
# 2. 创建并激活 virtual environment (推荐)
python3 -m venv .venv
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate # Windows
# 3. 安装 Python dependencies
pip install fastapi uvicorn pymupdf opencv-python numpy pillow imagehash python-multipart
# 4. 创建必需的运行时目录
mkdir -p assets uploads
# 5. 启动 backend 服务器
python3 main.py
# → 服务器运行于 http://localhost:8001
```
### 前端设置
```
# 1. 导航到 frontend 目录 (新终端)
cd "Report Parse/frontend"
# 2. 安装 Node dependencies
npm install
# 3. 启动开发服务器
npm run dev
# → 应用运行于 http://localhost:5173
```
### 环境概览
| 服务 | URL |
|---|---|
| 前端 | http://localhost:5173 |
| 后端 | http://localhost:8001 |
| API 文档 | http://localhost:8001/docs |
## 📖 如何使用
### 1. 上传 PDF
点击右上角标题栏中的 **"Choose File"** 并选择任意 PDF。文档将被上传至后端,并自动处理第一页。
### 2. 导航页面
使用标题栏中的 **◀ / ▶** 箭头在页面之间移动。每一页都会按需处理——检测到的资产会在 1-2 秒内显示在右侧面板中。
### 3. 查看提取的资产
右侧面板会显示当前页面所有检测到的资产:
- 所提取图像的**缩略图**
- **图表/表格标签**(例如:"Figure 7.1"、"Table 16.16")
- 与该资产相关的**图题文本**
- **置信度条**(绿色 = 100%,黄色 = 70–80%)
- **下载**或**复制图题**按钮
### 4. 在 PDF 上点击资产
每个检测到的资产都会在 PDF 上用一个彩色边界框高亮显示:
- 🟣 **紫色** = 图表 / 示意图
- 🟢 **绿色** = 表格(检测到矢量网格)
- 🔵 **靛蓝色光晕** = 选中的资产
点击 PDF 上的边界框将其选中,右侧面板会自动滚动至该资产。
### 5. 缩放和导航 PDF
PDF 查看器顶部的工具栏提供:
- **−/+** 缩放按钮
- **预设缩放下拉菜单**(50%、75%、100%、125%、150%、200%)
- **适合宽度**按钮
- **重置**按钮
画布支持水平和垂直方向的完全滚动。
### 6. 导出完整报告
点击标题栏中的 **"Export Full Report"** 以提取文档每一页中的所有视觉资产。
实时进度叠加层会显示:
- 当前正在处理的页面(`Processing Page X of Y`)
- 完成百分比进度条
- 压缩阶段指示器
下载的 ZIP 文件组织结构如下:
```
confident_assets_[id].zip
├── Figures/
│ ├── Figure_7.1_-_ESML_Project_Location.png
│ └── Figure_8.2_-_Geological_Cross_Section.png
├── Tables/
│ ├── Table_16.16_-_Estimated_Number_of_Drills.png
│ └── Table_3.1_-_Resource_Estimate.png
└── Unconfirmed/
└── asset_p42_1.png ← Detected but no caption found
```
### 7. 上传新文件
点击标题栏中的 **"New File"** 以重置会话并上传不同的文档。
## 🔌 API 参考
| 方法 | 端点 | 描述 |
|---|---|---|
| `POST` | `/upload` | 上传 PDF,返回 `session_id` 和 `total_pages` |
| `GET` | `/process/{session_id}/{page_no}` | 处理特定页面,返回检测结果 |
| `GET` | `/export-document/{session_id}` | 将所有页面导出为结构化的 ZIP 文件 |
| `GET` | `/export-status/{session_id}` | 轮询实时导出进度 |
| `GET` | `/assets/{filename}` | 提供提取出的资产图像 |
## 🛠️ 配置 (processor.py)
你可以在 `processor.py` 顶部调整以下关键常量:
| 常量 | 默认值 | 描述 |
|---|---|---|
| `MARGIN_TOP` | `50` | 上边距——上方的的内容将被忽略(页眉) |
| `MARGIN_BOTTOM` | `50` | 下边距(磅)——下方的的内容将被忽略(页脚) |
| `MAX_TEXT_COVERAGE_CV` | `0.30` | 文本密度 >30% 的 CV 区域将被丢弃 |
| `MAX_CAPTION_DISTANCE_PTS` | `150` | 在**上方**搜索图题的最大距离 |
| `MAX_CAPTION_DISTANCE_BELOW` | `80` | 在**下方**搜索图题的最大距离(备选) |
| `LOGO_PAGE_PCT` | `0.20` | 出现在 >20% 页面上的图像将被视为 logo |
## 📦 依赖项
### 后端
| 包 | 用途 |
|---|---|
| `fastapi` | REST API 框架 |
| `uvicorn` | ASGI 服务器 |
| `pymupdf` (fitz) | PDF 解析、渲染、`find_tables()` |
| `opencv-python` | 矢量图的边缘检测 |
| `numpy` | 数组操作 |
| `pillow` | 图像处理 |
| `imagehash` | 用于去重的感知哈希 |
| `python-multipart` | 多部分文件上传支持 |
### 前端
| 包 | 用途 |
|---|---|
| `react` + `typescript` | UI 框架 |
| `vite` | 构建工具和开发服务器 |
| `react-pdf` | 在浏览器中渲染 PDF |
| `axios` | HTTP 客户端 |
| `zustand` | 全局状态管理 |
| `lucide-react` | 图标库 |
## 📄 许可证
MIT 许可证 — 详情请参阅 [LICENSE](LICENSE)。
用 ❤️ 构建文档智能
=======
# PDF-Figure-Extractor
PDF Figure Extractor 使用基于 AI 的版面分析和高分辨率视觉检测,自动从 PDF 文档中提取图表、示意图、表格和图题。非常适合用于研究论文、技术报告和工程文档。
>>>>>>> 10919c09560860b4bf4db3fee2d1a3402342d1da标签:AV绕过, FastAPI, OpenCV, PDF解析, PDF阅读器, PyMuPDF, Python, React, Syscalls, ZIP导出, 人工智能, 全栈应用, 图像提取, 图表提取, 技术报告, 数据提取, 文档处理, 文献管理, 无后门, 版面分析, 用户模式Hook绕过, 科研工具, 表格提取, 视觉检测, 逆向工具