Marker 能够快速准确地将文档转换为 Markdown、JSON、分块文本和 HTML。
如需了解我们的托管 API 或本地部署的文档智能解决方案,请查看我们的平台。

与 Llamaparse、Mathpix 等云服务以及其他开源工具相比,Marker 的基准测试表现优异。
以上结果是串行处理单个 PDF 页面的情况。在批处理模式下,Marker 的速度显著更快,预计在 H100 上的吞吐量可达 25 页/秒。
有关详细的速度和准确性基准测试,以及如何运行自己的基准测试的说明,请参阅下文。
为了获得最高的准确性,可以传递 --use_llm 标志,让 Marker 与 LLM 协同工作。这将处理诸如跨页合并表格、处理行内数学公式、正确格式化表格以及从表单中提取值等任务。它可以使用任何 Gemini 或 Ollama 模型。默认使用 gemini-2.0-flash。详情请见下文。
下表对比了 Marker、仅使用 Gemini Flash 以及 Marker 结合 use_llm 模式的表现:

如你所见,use_llm 模式提供了比单独使用 Marker 或 Gemini 更高的准确性。
| 文件类型 | Markdown | JSON | |
|---|---|---|---|
| Think Python | 教科书 | 查看 | 查看 |
| Switch Transformers | arXiv 论文 | 查看 | 查看 |
| Multi-column CNN | arXiv 论文 | 查看 | 查看 |
我们的模型权重使用修改后的 AI Pubs Open Rail-M 许可证(研究、个人使用以及融资/收入低于 200 万美元的初创公司可免费使用),我们的代码采用 GPL 许可证。如需更广泛的商业许可或移除 GPL 要求,请访问我们的定价页面。
Marker 提供托管 API 和简易本地部署方案 - 注册免费,我们会提供测试积分。
该 API:
- 支持 PDF、图像、PPT、PPTX、DOC、DOCX、XLS、XLSX、HTML、EPUB 文件
- 价格是主流云服务竞争对手的 1/4
- 速度快 - 处理 250 页 PDF 约需 15 秒
- 支持 LLM 模式
- 高可用性(99.99%)
我们在 Discord 讨论未来的开发。
你需要 Python 3.10+ 和 PyTorch。
安装命令:
pip install marker-pdf
如果你需要处理 PDF 以外的文档,需要安装额外的依赖:
pip install marker-pdf[full]
首先,进行一些配置:
TORCH_DEVICE=cuda。--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 后端 - 参见下文。
- --force_ocr:强制对整个文档进行 OCR 处理,即使页面可能包含可提取的文本。这也会正确格式化行内数学公式。
- --block_correction_prompt:如果 LLM 模式激活,这是一个可选的提示词,用于校正 Marker 的输出。这对于你想应用于输出的自定义格式或逻辑很有用。
- --strip_existing_ocr:移除文档中所有现有的 OCR 文本,并使用 surya 重新进行 OCR。
- --redo_inline_math:如果你想要最高质量的行内数学公式转换,请将此选项与 --use_llm 一起使用。
- --disable_image_extraction:不从 PDF 中提取图像。如果你同时指定了 --use_llm,则图像将被描述替换。
- --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 支持的语言列表在这里。如果不需要 OCR,Marker 可以处理任何语言。
marker /path/to/input/folder
marker 支持上面 marker_single 的所有相同选项。--workers 是同时运行的转换工作进程数。默认会自动设置,但你可以增加它以提高吞吐量,代价是更多的 CPU/GPU 使用。Marker 在每个工作进程峰值时使用 5GB VRAM,平均使用 3.5GB。NUM_DEVICES=4 NUM_WORKERS=15 marker_chunk_convert ../pdf_in ../md_out
NUM_DEVICES 是要使用的 GPU 数量。应为 2 或更多。NUM_WORKERS 是在每个 GPU 上运行的并行进程数。有关可以传递的额外参数,请参阅 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,))
查看处理器以获取更多提取和操作块的示例。
你也可以使用定义不同转换流程的其他转换器:
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,也可以通过 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
你可以通过 ExtractionConverter 运行结构化提取。这需要首先设置一个 llm 服务(详情见此处)。你将获得一个包含提取值的 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 输出将包括:
$$ 包围)HTML 输出类似于 markdown 输出:
img 标签包含<math> 标签包围pre 标签中JSON 输出将组织成树状结构,叶节点是块。叶节点的示例包括单个列表项、一段文本或一张图片。
输出将是一个列表,每个列表项代表一个页面。在内部 Marker 模式中,每个页面都被视为一个块。有不同的块类型来表示不同的元素。
页面具有以下键:
id - 块的唯一标识符。block_type - 块的类型。可能的块类型可以在 marker/schema/__init__.py 中看到。截至撰写本文时,它们是 ["Line", "Span", "FigureGroup", "TableGroup", "ListGroup", "PictureGroup", "Page", "Caption", "Code", "Figure", "Footnote", "Form", "Equation", "Handwriting", "TextInlineMath", "ListItem", "PageFooter", "PageHeader", "Picture", "SectionHeader", "Table", "Text", "TableOfContents", "Document"]。html - 页面的 HTML。注意,这将包含对子节点的递归引用。如果你想要完整的 html,必须用子内容替换 content-ref 标签。你可以在 marker/output.py:json_to_html 中看到一个例子。该函数将接受 JSON 输出中的一个块,并将其转换为 HTML。polygon - 页面的 4 角多边形,格式为 (x1,y1), (x2,y2), (x3, y3), (x4, y4)。(x1,y1) 是左上角,坐标顺时针排列。children - 子块。子块有两个额外的键:
section_hierarchy - 表示块所属的部分。1 表示 h1 标签,2 表示 h2,依此类推。images - base64 编码的图像。键是块 id,数据是编码后的图像。请注意,页面的子块也可以有自己的子块(树状结构)。
{
"id": "/page/10/Page/366",
"block_type": "Page",
"html": "<content-ref src='/page/10/SectionHeader/0'></content-ref><content-ref src='/page/10/SectionHeader/1'></content-ref><content-ref src='/page/10/Text/2'></content-ref><content-ref src='/page/10/Text/3'></content-ref><content-ref src='/page/10/Figure/4'></content-ref><content-ref src='/page/10/SectionHeader/5'></content-ref><content-ref src='/page/10/SectionHeader/6'></content-ref><content-ref src='/page/10/TextInlineMath/7'></content-ref><content-ref src='/page/10/TextInlineMath/8'></content-ref><content-ref src='/page/10/Table/9'></content-ref><content-ref src='/page/10/SectionHeader/10'></content-ref><content-ref src='/page/10/Text/11'></content-ref>",
"polygon": [[0.0, 0.0], [612.0, 0.0], [612.0, 792.0], [0.0, 792.0]],
"children": [
{
"id": "/page/10/SectionHeader/0",
"block_type": "SectionHeader",
"html": "<h1>Supplementary Material for <i>Subspace Adversarial Training</i> </h1>",
"polygon": [
[217.845703125, 80.630859375], [374.73046875, 80.630859375],
[374.73046875, 107.0],
[217.845703125, 107.0]
],
"children": null,
"section_hierarchy": {
"1": "/page/10/SectionHeader/1"
},
"images": {}
},
...
]
}
分块格式类似于 JSON,但将所有内容扁平化为单个列表而不是树。只显示每个页面的顶级块。它还在每个块内部包含完整的 HTML,因此你无需遍历树来重建它。这为 RAG 提供了灵活且简单的分块功能。
所有输出格式都将返回一个元数据字典,包含以下字段:
```json
{
"table_of_contents":