跳到主要内容

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时间
Marker120秒25秒
Nougat600秒180秒
MinerU200秒45秒

💡 最佳实践

  1. 模型预加载

    # 在应用启动时加载一次
    global_models = load_all_models()

    # 后续转换直接使用
    text, _, _ = convert_single_pdf(pdf_path, global_models)
  2. 批量处理优化

    # 使用更大的批处理大小
    text, _, _ = convert_single_pdf(
    pdf_path,
    models,
    batch_multiplier=8 # 根据GPU显存调整
    )
  3. 内存管理

    import torch

    # 处理完后清理显存
    text, images, meta = convert_single_pdf(pdf_path, models)
    torch.cuda.empty_cache()
  4. 错误处理

    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

📚 资源链接

⚠️ 注意事项

  • 首次运行会下载模型文件(约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 - 首次发布