Skip to content

reskfa/pdf_sword

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PDF Sword 🗡️

智能 PDF 章节分解工具 - 将 PDF 按章节拆分为结构化数据,以便 LLM 阅读和分析。

特性

  • 🔍 预设模式匹配:内置多种中文/英文章节模式(第一章、第1章、1.1 等)
  • 🤖 LLM 智能分析:自动分析文档结构,生成正则或代码进行分割
  • 自动策略选择:优先使用预设模式,失败时自动切换 LLM
  • 💰 成本可控:只在必要时调用 LLM,支持预览字符数限制
  • 📦 多种输出格式:支持 JSON、TXT、Markdown 格式输出

适用场景

  • 📊 金融文档:年报、募集说明书、招股说明书
  • 📄 法律文件:合同、法规、条款
  • 📚 学术论文:按章节提取分析
  • 📑 技术文档:结构化处理

安装

# 克隆仓库
git clone https://github.com/yourusername/pdf-sword.git
cd pdf-sword

# 安装
pip install -e .

# 或安装开发依赖
pip install -e ".[dev]"

快速开始

1. 命令行使用

# 基本使用(自动选择策略)
pdf-sword split input.pdf

# 保存为 JSON
pdf-sword split input.pdf -o output.json

# 保存为 Markdown
pdf-sword split input.pdf -o chapters.md --format md

# 每个章节保存为单独文件
pdf-sword split input.pdf -o chapters_dir/ --format txt

# 强制使用 LLM 分析
pdf-sword split input.pdf --strategy llm -o output.json

# 测试预设模式匹配情况
pdf-sword test input.pdf

2. Python API 使用

from pdf_sword import PDFChunker
from pdf_sword.models import ChunkerConfig, SplitStrategy

# 基本使用
chunker = PDFChunker()
result = chunker.chunk("path/to/document.pdf")

# 遍历章节
for chapter in result.chapters:
    print(f"[{chapter.index}] {chapter.title}")
    print(f"内容长度: {len(chapter.content)} 字符")
    print("-" * 40)

# 转换为字典
chapters_dict = result.to_dict()
# {"第一章": "内容...", "第二章": "内容...", ...}

# 获取特定章节
chapter = result.get_chapter("财务数据")
if chapter:
    print(chapter.content)

3. 配置 LLM(用于智能分析)

from pdf_sword import PDFChunker
from pdf_sword.models import ChunkerConfig, LLMConfig, SplitStrategy

config = ChunkerConfig(
    strategy=SplitStrategy.AUTO,  # 自动选择:先尝试模式匹配,失败则用 LLM
    llm=LLMConfig(
        model="gpt-4o-mini",  # 或其他兼容 OpenAI API 的模型
        api_key="your-api-key",  # 或设置环境变量 OPENAI_API_KEY
        base_url=None,  # 自定义 API 地址(可选)
        max_preview_chars=10000,  # LLM 预览的字符数
    ),
)

chunker = PDFChunker(config)
result = chunker.chunk("path/to/document.pdf")

4. 添加自定义模式

from pdf_sword import PDFChunker
from pdf_sword.models import PatternConfig

chunker = PDFChunker()

# 添加自定义章节模式
chunker.add_pattern(PatternConfig(
    name="my_pattern",
    regex=r"Chapter\s+([A-Z]+):",  # 匹配 Chapter I:, Chapter II: 等
    level=1,
    description="大写字母章节",
))

result = chunker.chunk("path/to/document.pdf")

预设模式

模式名称 描述 示例
chapter_cn_num 中文数字章节 第一章、第二章...
chapter_arabic 阿拉伯数字章节 第1章、第2章...
section_cn_num 中文数字节 第一节、第二节...
section_arabic 阿拉伯数字节 第1节、第2节...
chapter_dot 数字点号 1. 、2. ...
subsection_dot 多级数字 1.1 、1.2 ...
chapter_cn_dun 中文顿号 一、二、三...
section_cn_paren 中文括号 (一)、(二)...
part_roman 英文 Part Part I、Part II...
chapter_en 英文 Chapter Chapter 1、Chapter 2...

输出格式

JSON 格式

{
  "strategy": "pattern",
  "pattern_used": "chapter_arabic",
  "total_chars": 152345,
  "chapter_count": 8,
  "chapters": [
    {
      "index": 1,
      "title": "概述",
      "level": 1,
      "content": "第一章内容...",
      "metadata": {"pattern": "chapter_arabic"}
    }
  ]
}

Markdown 格式

# PDF 章节分解结果

- 策略: pattern
- 总字符数: 152345
- 章节数: 8

---

## 概述

第一章内容...

---

## 财务数据

第二章内容...

工作原理

  1. 文本提取:使用 pdfplumber 提取 PDF 文本,保留布局信息
  2. 模式匹配:尝试预设正则模式,自动选择最佳匹配
  3. LLM 分析(必要时):
    • 将前 N 个字符发送给 LLM
    • LLM 分析章节规律,返回正则表达式
    • 或使用 LLM 生成的 Python 代码进行分割
  4. 章节提取:根据匹配点分割文本,构建结构化数据

环境变量

export OPENAI_API_KEY="your-api-key"
export OPENAI_BASE_URL="https://api.openai.com/v1"  # 可选

开发

# 运行测试
pytest

# 代码格式化
black src/
ruff check --fix src/

# 类型检查
mypy src/

许可证

MIT License

贡献

欢迎 Issue 和 PR!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 创建 Pull Request

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors