rajnishism/PDF-Figure-Extractor

GitHub: rajnishism/PDF-Figure-Extractor

一个基于三层检测管线的全栈PDF视觉资产提取引擎,能够自动检测并智能关联图题,从研究论文和技术报告中批量提取图表、表格等视觉元素。

Stars: 0 | Forks: 0

<<<<<<< HEAD
# 🔍 VisionExtract ### 智能 PDF 视觉资产提取引擎 **自动检测、提取并导出任何 PDF 中的图表、地图和表格——包含图题、置信度评分以及结构化的 ZIP 导出。** [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python&logoColor=white)](https://python.org) [![FastAPI](https://img.shields.io/badge/FastAPI-0.111-009688?logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com) [![React](https://img.shields.io/badge/React-18-61DAFB?logo=react&logoColor=white)](https://react.dev) [![PyMuPDF](https://img.shields.io/badge/PyMuPDF-1.24%2B-orange)](https://pymupdf.readthedocs.io) [![License: MIT](https://img.shields.io/badge/License-MIT-green)](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绕过, 科研工具, 表格提取, 视觉检测, 逆向工具