datalab-to/marker
GitHub: datalab-to/marker
Marker 是一款基于深度学习的高精度文档转换工具,可将 PDF 及多种文档格式快速转换为 Markdown、JSON 等结构化输出。
Stars: 37497 | Forks: 2637
Datalab
State of the Art models for Document Intelligence
# Marker Marker 能够快速准确地将文档转换为 markdown、JSON、chunks 和 HTML 格式。 - 支持转换所有语言的 PDF、图片、PPTX、DOCX、XLSX、HTML、EPUB 文件 - 格式化表格、表单、公式、行内数学公式、链接、参考文献和代码块 - 提取并保存图片 - 移除页眉/页脚及其他杂乱元素 - 可通过自定义格式和逻辑进行扩展 - 在给定 JSON schema 的情况下支持结构化提取 (beta) - 可选择通过 LLM(以及您自己的 prompt)提升准确率 - 支持 GPU、CPU 或 MPS 运行 ## 体验 Datalab 托管平台 我们的托管平台运行我们最新的开源模型 [Chandra](https://github.com/datalab-to/chandra) —— 准确率比 Marker 更高,默认零数据留存,具备 SOC 2 Type 2 认证,并支持自定义 BAA。 商业用途的自托管需要许可证 —— 请参阅[商业用途](#commercial-usage)。如需本地部署许可,请[联系我们](https://www.datalab.to/contact?utm_source=gh-marker-onprem)。 ## 性能表现
与 Llamaparse 和 Mathpix 等云服务以及其他开源工具相比,Marker 在基准测试中表现优异。
上述结果为串行处理单个 PDF 页面。在批处理模式下,Marker 的速度要快得多,在 H100 上的预期吞吐量可达 25 页/秒。
有关详细的速度和准确率基准测试,以及如何运行您自己的基准测试的说明,请参阅[下文](#benchmarks)。
## 混合模式
为了获得最高的准确率,请传入 `--use_llm` 标志以在 marker 之外结合使用 LLM。这将执行诸如合并跨页表格、处理行内数学公式、正确格式化表格以及从表单中提取值等操作。它可以使用任何 gemini 或 ollama 模型。默认情况下,它使用 `gemini-2.0-flash`。详情请参阅[下文](#llm-services)。
以下是将 marker、单独的 gemini flash 以及结合 use_llm 的 marker 进行表格基准测试的对比:
如您所见,use_llm 模式比单独使用 marker 或 gemini 提供了更高的准确率。
## 示例
| PDF | 文件类型 | Markdown | JSON |
|-----|-----------|------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
| [Think Python](https://greenteapress.com/thinkpython/thinkpython.pdf) | 教科书 | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/markdown/thinkpython/thinkpython.md) | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/json/thinkpython.json) |
| [Switch Transformers](https://arxiv.org/pdf/2101.03961.pdf) | arXiv 论文 | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/markdown/switch_transformers/switch_trans.md) | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/json/switch_trans.json) |
| [多列 CNN](https://arxiv.org/pdf/1804.07821.pdf) | arXiv 论文 | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/markdown/multicolcnn/multicolcnn.md) | [查看](https://github.com/VikParuchuri/marker/blob/master/data/examples/json/multicolcnn.json) |
# 商业用途
我们的模型权重使用修改版的 AI Pubs Open RAIL-M 许可证(对研究、个人使用以及融资/收入低于 200 万美元的初创公司免费),我们的代码遵循 GPL 协议。如需更广泛的商业许可或移除 GPL 要求,请访问我们的定价页面[此处](https://www.datalab.to/pricing?utm_source=gh-marker)。
# 安装说明
您需要 python 3.10+ 和 [PyTorch](https://pytorch.org/get-started/locally/)。
安装命令:
```
pip install marker-pdf
```
如果您想在 PDF 以外的文档上使用 marker,您需要通过以下命令安装额外的依赖项:
```
pip install marker-pdf[full]
```
# 使用方法
首先,是一些配置说明:
- 您的 torch device 将被自动检测,但您也可以手动覆盖。例如,`TORCH_DEVICE=cuda`。
- 某些 PDF,甚至是数字 PDF,其中的文本可能存在乱码。设置 `--force_ocr` 可强制对所有行进行 OCR,或者使用 `strip_existing_ocr` 保留所有数字文本并移除现有的 OCR 文本。
- 如果您关心行内数学公式,请设置 `force_ocr` 将行内数学公式转换为 LaTeX。
## 交互式应用
我包含了一个 streamlit 应用程序,让您可以通过一些基本选项交互式地尝试 marker。运行命令:
```
pip install streamlit streamlit-ace
marker_gui
```
## 转换单个文件
```
marker_single /path/to/file.pdf
```
您可以传入 PDF 或图片。
选项:
- `--page_range TEXT`:指定要处理的页面。接受以逗号分隔的页码和范围。例如:`--page_range "0,5-10,20"` 将处理第 0 页、第 5 到 10 页以及第 20 页。
- `--output_format [markdown|json|html|chunks]`:指定输出结果的格式。
- `--output_dir PATH`:保存输出文件的目录。默认为 settings.OUTPUT_DIR 中指定的值。
- `--paginate_output`:对输出进行分页,使用 `\n\n{PAGE_NUMBER}` 并在后面加上 `-` * 48,然后是 `\n\n`
- `--use_llm`:使用 LLM 提高准确率。您需要配置 LLM 后端 - 请参阅[下文](#llm-services)。
- `--force_ocr`:强制对整个文档进行 OCR 处理,即使是那些可能包含可提取文本的页面。这也能正确格式化行内数学公式。
- `--block_correction_prompt`:如果 LLM 模式处于激活状态,此可选 prompt 将用于纠正 marker 的输出。这对于您想应用于输出的自定义格式或逻辑非常有用。
- `--strip_existing_ocr`:移除文档中所有现有的 OCR 文本,并使用 surya 重新进行 OCR。
- `--redo_inline_math`:如果您想要绝对最高质量的行内数学公式转换,请将此选项与 `--use_llm` 结合使用。
- `--disable_image_extraction`:不要从 PDF 中提取图片。如果您同时指定了 `--use_llm`,则图片将被替换为描述。
- `--debug`:启用 debug 模式以获取额外的日志和诊断信息。
- `--processors TEXT`:通过提供完整的模块路径(以逗号分隔)来覆盖默认的处理器。例如:`--processors "module1.processor1,module2.processor2"`
- `--config_json PATH`:包含额外设置的 JSON 配置文件的路径。
- `config --help`:列出所有可用的构建器、处理器和转换器及其相关配置。这些值可用于构建 JSON 配置文件,以便进一步微调 marker 的默认设置。
- `--converter_cls`:可选 `marker.converters.pdf.PdfConverter`(默认)或 `marker.converters.table.TableConverter`。`PdfConverter` 将转换整个 PDF,而 `TableConverter` 将仅提取并转换表格。
- `--llm_service`:如果传入了 `--use_llm`,则指定要使用的 llm 服务。默认为 `marker.services.gemini.GoogleGeminiService`。
- `--help`:查看可以传递给 marker 的所有标志。(它支持比上面列出的多得多的选项)
surya OCR 支持的语言列表在[这里](https://github.com/VikParuchuri/surya/blob/master/surya/recognition/languages.py)。如果您不需要 OCR,marker 可以处理任何语言的文档。
## 转换多个文件
```
marker /path/to/input/folder
```
- `marker` 支持上述 `marker_single` 的所有相同选项。
- `--workers` 是同时运行的转换 worker 数量。默认情况下这是自动设置的,但您可以增加它以提高吞吐量,代价是增加 CPU/GPU 的使用率。在峰值时,Marker 每个 worker 将使用 5GB 的 VRAM,平均使用 3.5GB。
## 在多个 GPU 上转换多个文件
```
NUM_DEVICES=4 NUM_WORKERS=15 marker_chunk_convert ../pdf_in ../md_out
```
- `NUM_DEVICES` 是要使用的 GPU 数量。应该为 `2` 或更大。
- `NUM_WORKERS` 是在每个 GPU 上运行的并行进程数。
## 从 python 中使用
请查看 `marker/converters/pdf.py` 中的 `PdfConverter` 类,了解可以传递的其他参数。
```
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered
converter = PdfConverter(
artifact_dict=create_model_dict(),
)
rendered = converter("FILEPATH")
text, _, images = text_from_rendered(rendered)
```
`rendered` 将是一个 pydantic basemodel,根据请求的输出类型具有不同的属性。使用 markdown 输出(默认)时,您将拥有 `markdown`、`metadata` 和 `images` 属性。对于 json 输出,您将拥有 `children`、`block_type` 和 `metadata`。
### 自定义配置
您可以使用 `ConfigParser` 传递配置。要查看所有可用选项,请执行 `marker_single --help`。
```
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.config.parser import ConfigParser
config = {
"output_format": "json",
"ADDITIONAL_KEY": "VALUE"
}
config_parser = ConfigParser(config)
converter = PdfConverter(
config=config_parser.generate_config_dict(),
artifact_dict=create_model_dict(),
processor_list=config_parser.get_processors(),
renderer=config_parser.get_renderer(),
llm_service=config_parser.get_llm_service()
)
rendered = converter("FILEPATH")
```
### 提取块
每个文档由一个或多个页面组成。页面包含块,块本身也可以包含其他块。可以通过编程方式操作这些块。
以下是从文档中提取所有表单的示例:
```
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.schema import BlockTypes
converter = PdfConverter(
artifact_dict=create_model_dict(),
)
document = converter.build_document("FILEPATH")
forms = document.contained_blocks((BlockTypes.Form,))
```
查看处理器以获取更多提取和操作块的示例。
## 其他转换器
您还可以使用其他定义了不同转换 pipeline 的转换器:
### 提取表格
`TableConverter` 将仅转换并提取表格:
```
from marker.converters.table import TableConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered
converter = TableConverter(
artifact_dict=create_model_dict(),
)
rendered = converter("FILEPATH")
text, _, images = text_from_rendered(rendered)
```
它采用与 PdfConverter 相同的配置。您可以指定配置 `force_layout_block=Table` 以避免布局检测,并假定每一页都是一个表格。设置 `output_format=json` 可同时获取单元格边界框。
您也可以通过 CLI 运行此命令
```
marker_single FILENAME --use_llm --force_layout_block Table --converter_cls marker.converters.table.TableConverter --output_format json
```
### 仅 OCR
如果您只想运行 OCR,也可以通过 `OCRConverter` 完成。设置 `--keep_chars` 以保留单个字符和边界框。
```
from marker.converters.ocr import OCRConverter
from marker.models import create_model_dict
converter = OCRConverter(
artifact_dict=create_model_dict(),
)
rendered = converter("FILEPATH")
```
它采用与 PdfConverter 相同的配置。
您也可以通过 CLI 运行此命令
```
marker_single FILENAME --converter_cls marker.converters.ocr.OCRConverter
```
### 结构化提取 (beta)
您可以通过 `ExtractionConverter` 运行结构化提取。这需要先设置 llm 服务(详情请参阅[此处](#llm-services))。您将获得包含提取值的 JSON 输出。
```
from marker.converters.extraction import ExtractionConverter
from marker.models import create_model_dict
from marker.config.parser import ConfigParser
from pydantic import BaseModel
class Links(BaseModel):
links: list[str]
schema = Links.model_json_schema()
config_parser = ConfigParser({
"page_schema": schema
})
converter = ExtractionConverter(
artifact_dict=create_model_dict(),
config=config_parser.generate_config_dict(),
llm_service=config_parser.get_llm_service(),
)
rendered = converter("FILEPATH")
```
Rendered 将包含一个 `original_markdown` 字段。如果您下次运行转换器时将其作为 `existing_markdown` 配置键传入,则可以跳过重新解析文档。
# 输出格式
## Markdown
Markdown 输出将包含:
- 图片链接(图片将保存在同一文件夹中)
- 格式化的表格
- 嵌入的 LaTeX 公式(由 `$$` 标记)
- 由三个反引号标记的代码
- 脚注的上标
## HTML
HTML 输出类似于 markdown 输出:
- 图片通过 `img` 标签包含
- 公式由 `标签:AI风险缓解, Kubernetes, Markdown, OCR, PDF转换, 凭据扫描, 数据提取, 文档智能, 深度学习, 逆向工具