Skip to main content
Glama
README.md
# PDF MCP Flow  - AI 驱动的 PDF 处理引擎

**中文** | [English](README_EN.md)

> 🚀 **专为 LLM 和 RAG 设计的 MCP 文档处理服务器** | PDF 转 Markdown | 格式转换 | 智能提取

**MCP PDF Flow** 是一个强大的 **Model Context Protocol (MCP)** 服务器,旨在弥合 LLM(如 Claude)与本地文档之间的鸿沟。

它不仅是**PDF 转 Markdown** 的最佳工具,还提供了一套完整的文档处理工作流,支持 **RAG(检索增强生成)** 场景下的数据清洗和格式化。

## ✨ 核心优势

*   **🤖 LLM 友好**:输出清洗后的结构化 Markdown,完美适配 AI 上下文阅读。
*   **🔍 智能 RAG 支持**:支持语义模糊搜索和元数据提取,快速定位文档关键信息。
*   **🔄 全能格式转换**:PDF ⇋ Word ⇋ Markdown 无缝互转。

## ✨ 功能特性

*   **📝 智能文本提取**:
    *   精准提取 PDF 页面文本。
    *   **智能 Markdown 识别**:自动识别标题、列表、段落结构,合并跨行文本,输出干净的 Markdown。
*   **🖼️ 图片提取**:
    *   支持提取页面内的所有图片。
    *   **自动保存与引用**:默认将图片保存到本地 `extracted_images/` 目录,并在 Markdown 中插入图片路径引用,避免大量 Base64 数据占用上下文。
    *   **Base64 预览**:可选直接返回图片 Base64 编码,支持在 MCP 客户端中即时预览(适合少量小图)。
*   **📂 批量处理**:支持对指定目录下的 PDF 文件进行批量提取,自动生成 Markdown 和图片,并保持目录结构整洁。
*   **📊 增强表格提取**:
    *   **高精度识别**:自动处理跨行表头、错位列和复杂排版。
    *   **智能清洗**:自动移除空行、空表头,过滤伪表格(如文本列表)。
    *   **批量导出**:支持一键提取目录下所有 PDF 中的表格为 Markdown 文件。
*   **🔍 模糊搜索**:
    *   **智能查找**:支持通过文件名关键词(模糊匹配、拼写错误兼容)快速定位 PDF 文件路径。
    *   **递归搜索**:默认支持多级目录递归查找。
*   **🔄 格式转换**:
    *   **Markdown 转 Word**:将生成的 Markdown 报告一键转换为格式完美的 Word (.docx) 文档。
    *   **Word 转 PDF**:支持将 Word 文档转换为 PDF 文件。
        *   *自动适配*:优先使用 Microsoft Word,若未安装则自动回退到 WPS Office。
*   **⚙️ 灵活提取**:支持提取全部页面、指定页码范围(如 `1`, `1-5`)或按关键词智能搜索。
*   **ℹ️ 元数据获取**:支持获取 PDF 标题、作者、页数及**目录结构 (TOC)**。

## 🛠️ 环境要求

*   **操作系统**:Windows (推荐,用于支持 Word/WPS 转换) / macOS / Linux
*   **Python**:>= 3.10
*   **Office 软件** (仅 Word 转 PDF 功能需要):
    *   Microsoft Word (最佳兼容性)
    *   或 WPS Office (支持 Windows)

## 📦 安装与使用

本项目使用 `uv` 进行包管理。

### 1. 克隆项目
```bash
git clone https://github.com/Dublin1231/PDF_MCP_Flow.git
cd mcp-pdf-flow
```

### 2. 安装依赖
```bash
uv sync
```

### 3. 运行服务

本服务是一个 MCP Server,设计为由 Claude Desktop 等客户端**自动启动**。
您**不需要**手动在终端运行启动命令。请继续阅读下方的 [Claude Desktop 配置](#-claude-desktop-配置) 章节完成设置。一旦配置完成,Claude Desktop 启动时会自动在后台运行此服务。

## 🔌 Claude Desktop 配置

要将此工具添加到 Claude Desktop,请编辑配置文件:

*   **Windows**: `%AppData%\Claude\claude_desktop_config.json`
*   **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

添加以下内容(请**务必**将路径修改为您本地的实际路径):

```jsonc
{
  "mcpServers": {
    "simple-pdf": {
      "command": "uv",
      "args": [
        "--directory",
        "D:/path/to/your/mcp-pdf-flow", // ⚠️ 请务必修改为您本地的实际项目路径
        "run",
        "simple-pdf"
      ],
      "env": {
        "PYTHONIOENCODING": "utf-8",
        // (可选) 指定额外的 PDF 搜索路径。Windows 使用分号 (;),Mac/Linux 使用冒号 (:) 分隔
        "PDF_SEARCH_PATHS": //"D:\\example;E:\\example"
      }
    }
  }
}
```

*注意:*
*   *Windows 用户路径分隔符请使用 `/` 或 `\\`。*
*   *`PDF_SEARCH_PATHS` 为可选配置,用于指定额外的 PDF 搜索路径,多个路径用 `;` (Windows) 或 `:` (Mac/Linux) 分隔。*

## 💬 如何在对话中使用

**你不需要手动填写 JSON 参数!** 只需要在对话中告诉 Claude 你想做什么,它会自动调用工具。

### 场景示例

#### 1. 读取 PDF
*   **指定绝对路径**:
    > **用户**: "帮我读取 `D:\Documents\report.pdf` 的第 1 到 5 页。"
*   **读取项目目录下文件**:
    > **用户**: "读取当前目录下的 `test.pdf`。"
    > *(注:Claude 会自动查找运行目录下的文件)*

#### 2. 转换 Markdown 为 Word
> **用户**: "把刚刚提取的内容保存为 Word 文档,放在 `D:\Documents\output.docx`。"
>
> **Claude**: (自动调用 `convert_markdown_to_docx` 工具)

#### 3. Word 转 PDF
> **用户**: "把 `D:\Documents\draft.docx` 转换成 PDF。"
>
> **Claude**: (自动调用 `convert_docx_to_pdf` 工具)

#### 4. 批量处理 PDF
> **用户**: "批量处理 `D:\Docs` 目录下的所有 PDF,导出为 Markdown。"
>
> **Claude**: (自动调用 `batch_extract_pdf_content` 工具)

#### 5. 批量处理并指定输出目录
> **用户**: "批量处理 `D:\Docs` 下的 PDF,将 Markdown 存到 `D:\Output\MD`,图片存到 `D:\Output\Images`。"
>
> **Claude**: (调用 `batch_extract_pdf_content`,参数 `custom_output_dir="D:\\Output\\MD"`, `custom_image_output_dir="D:\\Output\\Images"`)

#### 6. 批量处理并平铺输出(不保留目录结构)
> **用户**: "把 `D:\Docs` 下所有子文件夹里的 PDF 都提取出来,全部放到 `D:\All_MDs` 这个文件夹里,不要建子文件夹。"
>
> **Claude**: (调用 `batch_extract_pdf_content`,参数 `custom_output_dir="D:\\All_MDs"`, `preserve_structure=False`, `create_folder=False`)

#### 7. 模糊查找 PDF
> **用户**: "帮我找一下 `D:\Study` 下面关于 `springboot` 的 PDF 文件。"
>
> **Claude**: (自动调用 `search_pdf_files` 工具)

#### 8. 获取 PDF 目录结构
> **用户**: "提取 `D:\Books\Guide.pdf` 的目录大纲。"
>
> **Claude**: (自动调用 `get_pdf_metadata` 工具)


#### 9. 批量提取表格
> **用户**: "把 `D:\Books` 下所有 PDF 的表格提取出来,存到 `D:\Tables`。"
>
> **Claude**: (自动调用 `batch_extract_tables` 工具)


---

## 📖 工具列表

> **💡 小贴士:如何获取“绝对路径”?**
> *   **Windows**: 按住 `Shift` 键,右键点击文件,选择“复制文件地址 (Copy as path)”。粘贴时去掉首尾的引号。
>     *   示例: `C:\Users\Name\Documents\report.pdf`
> *   **macOS**: 选中文件,按下 `Option + Command + C` 复制路径。
>     *   示例: `/Users/name/Documents/report.pdf`


### 1. `extract_pdf_content`
提取 PDF 内容的核心工具。

**参数:**
*   `file_path` (必填): PDF 文件的绝对路径。
    *   *Windows 示例*: `D:\Documents\paper.pdf`
    *   *macOS 示例*: `/Users/username/Documents/paper.pdf`
*   `page_range` (可选): 页码范围,默认为 "all"。
    *   示例: `"1"`, `"1-5"`, `"1,3,5"`, `"all"`。
*   `keyword` (可选): 关键词搜索。若提供,将忽略页码范围,仅提取包含关键词的页面。
*   `format` (可选): 输出格式。
    *   `"text"` (默认): 纯文本提取。
    *   `"markdown"`: **推荐**。智能识别标题和段落,适合 LLM 阅读。
    *   `"json"`: 返回结构化 JSON 数据,包含每一页的文本和图片信息,适合程序化处理。
*   `include_text` (可选): 是否提取文本,默认为 `true`。
*   `include_images` (可选): 是否提取图片,默认为 `false`。
*   `use_local_images_only` (可选): 图片处理模式,默认为 `true`。
    *   `true` (默认): 图片保存到本地 `extracted_images` 目录,Markdown 中使用路径引用。**推荐用于大文件或包含大量图片的 PDF,防止 Token 溢出**。
    *   `false`: 返回图片的 Base64 数据流,可直接预览,但消耗大量 Token。
*   `skip_table_detection` (可选): **极速模式**开关,默认为 `false`。
    *   `false` (默认): 智能检测并提取表格,转换为 Markdown 表格格式。
    *   `true`: **跳过表格检测**。适用于仅需要纯文本内容的场景,速度可提升 3-4 倍(约 400+ 页/秒)。

### 2. `batch_extract_pdf_content`
批量处理指定目录下的所有 PDF 文件。

**参数:**
*   `directory` (必填): 要搜索的根目录绝对路径。
*   `pattern` (可选): 文件匹配模式,默认为 `**/*.pdf` (支持递归)。
*   `custom_output_dir` (可选): 指定输出根目录。如果不填,默认使用项目根目录。最终输出将在该目录下创建 `output` 文件夹,并根据模式包含以下子目录:
    *   `output_standard_with_image`: 包含图片,标准模式(含表格)。
    *   `output_fast_with_image_no_table`: 包含图片,极速模式(跳过表格检测)。
    *   `output_standard_no_image`: 标准模式+纯文本 (**不含图片**,含表格)。
    *   `output_fast_no_image_and_table`: 极速模式+纯文本 (**不含图片,不含表格**)。
    *   `output_only_image`: 仅提取图片模式 (不生成 Markdown 文件,图片保存在 `output/output_only_image/extracted_images` 目录)。
*   `format` (可选): 输出格式,支持 `markdown` (默认), `json`, `text`。
*   `include_text` (可选): 是否提取文本,默认为 `true`。
*   `include_images` (可选): 是否提取图片,默认为 `false`。
*   `use_local_images_only` (可选): 图片处理模式,默认为 `true`。
*   `skip_table_detection` (可选): **极速模式**开关,默认为 `false`。
    *   `false` (默认): 智能检测并提取表格,转换为 Markdown 表格格式。
    *   `true`: **跳过表格检测**。适用于仅需要纯文本内容的场景,速度可提升 3-4 倍(约 400+ 页/秒)。
*   `create_folder` (可选): **是否创建专属文件夹**,默认为 `false`。
    *   `true`: 为每个 PDF 创建专属的同名文件夹(例如 `output/subdir/file/file.md`)。
    *   `false` (默认): 不创建专属文件夹(例如 `output/subdir/file.md`)。
*   `preserve_structure` (可选): **目录结构保持**开关,默认为 `true`。
    *   `true` (默认): 保持源文件的目录层级结构(例如 `output/SourceSubDir/file.md`)。
    *   `false`: **集中/扁平化**模式。忽略源目录结构,将所有结果直接放在输出根目录(例如 `output/file.md`)。


### 3. `get_pdf_metadata`
快速获取 PDF 的元数据和目录结构。

**参数:**
*   `file_path` (必填): PDF 文件的绝对路径。

### 4. `convert_markdown_to_docx`
将 Markdown 内容转换为 Word 文档。

**参数:**
*   `markdown_content` (必填): 要转换的 Markdown 文本内容。
*   `output_path` (必填): 输出 .docx 文件的绝对路径。
    *   *注意*: 这里需要填写**你希望保存的新文件路径**。
    *   *示例*: `D:\Documents\report_output.docx`

### 5. `convert_docx_to_pdf`
将 Word 文档转换为 PDF 文件。

**参数:**
*   `docx_path` (必填): 输入的 .docx 文件绝对路径。
*   `pdf_path` (可选): 输出 .pdf 文件的绝对路径。
    *   如果不提供,将在原 docx 文件同目录下生成同名 pdf 文件。

### 6. `search_pdf_files`
通过文件名模糊搜索 PDF 文件路径。

**参数:**
*   `query` (必填): 文件名关键词。支持模糊匹配(如拼写错误)、中文匹配。
*   `directory` (可选): 搜索根目录。默认为当前工作目录。
*   `limit` (可选): 返回的最大结果数量,默认 10。
*   `threshold` (可选): 匹配阈值 (0.0-1.0),默认 0.45。


### 7. `batch_extract_tables`
批量提取目录中所有 PDF 的表格。

**默认输出路径:**
*   `output/output_only_table`: 仅提取表格模式 (表格保存在 `output/output_only_table` 目录)。

**参数:**
*   `directory` (必填): 要搜索的根目录绝对路径。
*   `output_dir` (可选): 指定输出根目录。最终表格 Markdown 文件将保存在该目录下的 `output/output_only_table` 文件夹中。如果不填,默认为当前目录。
*   `pattern` (可选): 文件匹配模式,默认为 `**/*.pdf`。

**✨ 表格提取增强特性:**
*   **智能表头合并**:自动处理跨行表头和被拆分的列名。
*   **错位列修复**:智能识别并合并因格式问题错位的标题和内容列。
*   **空行/空表头优化**:
    *   自动移除无效的空行。
    *   智能识别 KV 结构表格,仅在必要时保留表头,避免对中文 KV 表格生成错误的空表头。
*   **伪表格过滤**:
    *   自动识别并过滤文本列表(如目录、步骤说明)。
    *   自动过滤被误判为表格的代码块或长文本段落。
*   **排版优化**:智能处理单元格内的换行符,保持列表结构清晰,同时让普通长文本自然回流。

## 📂 输出目录结构

运行工具后,图片将按以下结构保存:

```
extracted_images/
  └── PDF文件名/
      ├── page_1_img_1.jpeg
      ├── page_1_img_2.png
      └── ...
```

## 💻 开发

*   **核心代码**: `src/simple_pdf/server.py`
*   **转换逻辑**: `src/simple_pdf/convert.py`