Marker
Marker 是一款快速将PDF、EPUB和MOBI文档转换为Markdown的开源工具,特别适合处理书籍、论文和技术文档,支持表格识别、公式转换和多语言处理。
🌟 核心特性
- ✅ 快速转换:比nougat快10倍,处理速度极快
- ✅ 高质量输出:准确识别标题、列表、表格等结构
- ✅ 公式支持:将数学公式转换为LaTeX格式
- ✅ 多格式支持:支持PDF、EPUB、MOBI等格式
- ✅ 批量处理:支持批量文档转换
- ✅ GPU加速:支持CUDA加速处理
- ✅ 开源免费:完全开源,可自由使用
📦 安装与使用
快速安装
# 使用 pip 安装
pip install marker-pdf
# 安装依赖
pip install torch torchvision
# GPU 版本(推荐)
pip install marker-pdf[gpu]
命令行使用
# 转换单个PDF
marker_single document.pdf output_folder
# 批量转换
marker_batch input_folder output_folder
# 指定语言
marker_single document.pdf output_folder --lang Chinese
# 使用GPU
marker_single document.pdf output_folder --gpu
Python API
from marker.convert import convert_single_pdf
from marker.models import load_all_models
# 加载模型(首次运行会自动下载)
models = load_all_models()
# 转换PDF
full_text, images, metadata = convert_single_pdf(
"document.pdf",
models
)
# 保存Markdown
with open("output.md", "w", encoding="utf-8") as f:
f.write(full_text)
# 保存图片
for i, img in enumerate(images):
img.save(f"image_{i}.png")
🏗️ 技术架构
graph TB
A[PDF文档] --> B[页面渲染]
B --> C[版面分析]
C --> D[文本检测]
C --> E[表格检测]
C --> F[公式检测]
D --> G[OCR识别]
E --> H[表格解析]
F --> I[公式转换]
G --> J[内容组装]
H --> J
I --> J
J --> K[Markdown输出]
核心组件
- 布局模型: Detectron2,用于版面分析
- OCR引擎: Tesseract/Surya,用于文本识别
- 表格模型: Table Transformer,用于表格识别
- 公式模型: Nougat,用于公式识别
🎯 应用场景
1. 学术论文转换
from marker.convert import convert_single_pdf
from marker.models import load_all_models
def convert_academic_paper(pdf_path, output_dir):
"""转换学术论文"""
models = load_all_models()
# 转换配置
text, images, meta = convert_single_pdf(
pdf_path,
models,
max_pages=None, # 处理所有页面
langs=["English"], # 语言设置
batch_multiplier=2 # GPU批处理大小
)
# 保存Markdown
output_path = f"{output_dir}/paper.md"
with open(output_path, "w", encoding="utf-8") as f:
f.write(text)
# 保存图片
for idx, img in enumerate(images):
img.save(f"{output_dir}/figure_{idx}.png")
return text, meta
2. 技术书籍转换
def convert_book(pdf_path, output_dir):
"""转换技术书籍"""
from marker.convert import convert_single_pdf
from marker.models import load_all_models
models = load_all_models()
text, images, meta = convert_single_pdf(
pdf_path,
models,
langs=["Chinese", "English"], # 支持中英文混合
parallel_factor=2 # 并行处理加速
)
# 保存完整内容
with open(f"{output_dir}/book.md", "w", encoding="utf-8") as f:
f.write(text)
# 输出元数据
print(f"总页数: {meta['pages']}")
print(f"处理时间: {meta['time']:.2f}秒")
return text
3. 批量文档处理
import os
from pathlib import Path
from marker.convert import convert_single_pdf
from marker.models import load_all_models
def batch_convert(input_dir, output_dir):
"""批量转换PDF文档"""
# 加载模型(只加载一次)
models = load_all_models()
pdf_files = Path(input_dir).glob("*.pdf")
for pdf_path in pdf_files:
try:
print(f"处理: {pdf_path.name}")
# 转换
text, images, meta = convert_single_pdf(
str(pdf_path),
models
)
# 创建输出目录
doc_output = Path(output_dir) / pdf_path.stem
doc_output.mkdir(exist_ok=True)
# 保存Markdown
md_path = doc_output / f"{pdf_path.stem}.md"
with open(md_path, "w", encoding="utf-8") as f:
f.write(text)
# 保存图片
for idx, img in enumerate(images):
img.save(doc_output / f"image_{idx}.png")
print(f"完成: {pdf_path.name}")
except Exception as e:
print(f"错误 {pdf_path.name}: {e}")
4. 提取特定页面
def convert_pages(pdf_path, start_page, end_page):
"""转换指定页面范围"""
from marker.convert import convert_single_pdf
from marker.models import load_all_models
models = load_all_models()
# 配置页面范围
text, images, meta = convert_single_pdf(
pdf_path,
models,
start_page=start_page,
max_pages=end_page - start_page + 1
)
return text
🔧 高级配置
性能优化
from marker.convert import convert_single_pdf
from marker.models import load_all_models
# 加载模型时的配置
models = load_all_models(
device="cuda", # 使用GPU
dtype="float16" # 使用半精度加速
)
# 转换时的性能配置
text, images, meta = convert_single_pdf(
"document.pdf",
models,
batch_multiplier=4, # 增大批处理大小
parallel_factor=2, # 并行处理
max_pages=None # 不限制页数
)
多语言处理
# 中文文档
text, _, _ = convert_single_pdf(
"chinese_doc.pdf",
models,
langs=["Chinese"]
)
# 中英混合
text, _, _ = convert_single_pdf(
"mixed_doc.pdf",
models,
langs=["Chinese", "English"]
)
# 多语言
text, _, _ = convert_single_pdf(
"multi_lang.pdf",
models,
langs=["Chinese", "English", "Japanese"]
)
表格处理
def extract_tables(pdf_path):
"""重点提取表格内容"""
models = load_all_models()
text, images, meta = convert_single_pdf(
pdf_path,
models,
force_ocr=False, # 优先使用原生文本
extract_tables=True # 确保提取表格
)
# 表格在Markdown中以表格语法呈现
# | 列1 | 列2 | 列3 |
# |-----|-----|-----|
# | 值1 | 值2 | 值3 |
return text
📊 性能对比
| 工具 | 速度 | 准确率 | 公式支持 | GPU加速 | 开源 |
|---|---|---|---|---|---|
| Marker | ⭐⭐⭐⭐⭐ | 92% | ⭐⭐⭐⭐ | ✅ | ✅ |
| Nougat | ⭐⭐ | 95% | ⭐⭐⭐⭐⭐ | ✅ | ✅ |
| MinerU | ⭐⭐⭐ | 94% | ⭐⭐⭐⭐⭐ | ✅ | ✅ |
| PyMuPDF | ⭐⭐⭐⭐⭐ | 88% | ⭐⭐ | ❌ | ✅ |
| Adobe | ⭐⭐⭐ | 96% | ⭐⭐⭐⭐ | ❌ | ❌ |
速度测试(100页PDF)
| 工具 | CPU时间 | GPU时间 |
|---|---|---|
| Marker | 120秒 | 25秒 |
| Nougat | 600秒 | 180秒 |
| MinerU | 200秒 | 45秒 |
💡 最佳实践
-
模型预加载
# 在应用启动时加载一次
global_models = load_all_models()
# 后续转换直接使用
text, _, _ = convert_single_pdf(pdf_path, global_models) -
批量处理优化
# 使用更大的批处理大小
text, _, _ = convert_single_pdf(
pdf_path,
models,
batch_multiplier=8 # 根据GPU显存调整
) -
内存管理
import torch
# 处理完后清理显存
text, images, meta = convert_single_pdf(pdf_path, models)
torch.cuda.empty_cache() -
错误处理
try:
text, images, meta = convert_single_pdf(pdf_path, models)
except Exception as e:
print(f"转换失败: {e}")
# 降级处理:使用基础OCR
text = fallback_ocr(pdf_path)
🔍 常见问题
Q1: 如何处理大文件?
# 分批处理大文件
def convert_large_pdf(pdf_path, chunk_size=50):
"""分批处理大PDF"""
models = load_all_models()
full_text = ""
start_page = 0
while True:
try:
text, _, meta = convert_single_pdf(
pdf_path,
models,
start_page=start_page,
max_pages=chunk_size
)
full_text += text
if meta['pages'] < chunk_size:
break
start_page += chunk_size
except Exception as e:
print(f"处理页面 {start_page} 时出错: {e}")
break
return full_text
Q2: 如何提高准确率?
# 使用更高分辨率
text, _, _ = convert_single_pdf(
pdf_path,
models,
dpi=300, # 提高DPI
force_ocr=True # 强制OCR
)
Q3: 如何自定义输出格式?
def custom_format_output(text):
"""自定义输出格式"""
# 添加文档头
output = "# 文档标题\n\n"
output += text
# 后处理:修正格式
output = output.replace("##", "\n##") # 标题前加空行
output = output.replace("\n\n\n", "\n\n") # 删除多余空行
return output
📚 资源链接
- GitHub: https://github.com/VikParuchuri/marker
- 文档: https://github.com/VikParuchuri/marker/blob/master/README.md
- 模型下载: 首次运行自动下载
- 问题反馈: https://github.com/VikParuchuri/marker/issues
⚠️ 注意事项
- 首次运行会下载模型文件(约2GB)
- GPU版本需要CUDA 11.8+
- 推荐16GB+内存和8GB+显存
- 某些复杂版面可能需要手动调整
- 扫描版PDF效果可能不如原生PDF
🆚 使用场景推荐
选择 Marker 当:
- 需要快速批量处理大量PDF
- 对处理速度有较高要求
- 文档结构相对标准
- 有GPU资源可用
选择其他工具当:
- 需要最高准确率 → MinerU/Nougat
- 处理复杂学术论文 → Nougat
- 简单文本提取 → PyMuPDF
- 需要深度定制 → MinerU
🔄 更新日志
- 2024.06: v0.2.9 - 优化表格识别
- 2024.03: v0.2.5 - 添加GPU加速支持
- 2024.01: v0.2.0 - 支持EPUB和MOBI格式
- 2023.10: v0.1.0 - 首次发布