Files
2026-07-13 08:58:29 +00:00

352 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- WEHUB_ZH_README -->
> [!NOTE]
> 本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
> [English](./README.en.md) · [原始项目](https://github.com/microsoft/markitdown) · [上游 README](https://github.com/microsoft/markitdown/blob/HEAD/README.md)
> 原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
# MarkItDown
[![PyPI](https://img.shields.io/pypi/v/markitdown.svg)](https://pypi.org/project/markitdown/)
![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown)
[![由 AutoGen 团队构建](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)
> [!IMPORTANT]
> MarkItDown 以当前进程的权限执行 I/O 操作。与 open() 或 requests.get() 类似,它会访问进程自身能够访问的资源。在不受信任的环境中请对输入进行清理,并调用你的用例所需的最精简的 `convert_*` 函数(例如 `convert_stream()` 或 `convert_local()`)。更多信息请参阅文档的[安全注意事项](#security-considerations)部分。
MarkItDown 是一个轻量级 Python 工具,用于将各种文件转换为 Markdown,以便与 LLM(大语言模型)及相关文本分析流水线配合使用。在这方面,它与 [textract](https://github.com/deanmalmgren/textract), 最为相似,但更侧重于将重要的文档结构和内容保留为 Markdown(包括:标题、列表、表格、链接等)。虽然输出结果通常具有合理的可呈现性且易于阅读,但它主要是供文本分析工具使用的——对于面向人类阅读的高保真文档转换场景,可能并非最佳选择。
MarkItDown 目前支持从以下格式转换:
- PDF
- PowerPoint
- Word
- Excel
- 图像(EXIF 元数据和 OCR
- 音频(EXIF 元数据和语音转录)
- HTML
- 基于文本的格式(CSV、JSON、XML)
- ZIP 文件(遍历内容)
- YouTube URL
- EPub
- ……以及更多!
## 为什么选择 Markdown
Markdown 极其接近纯文本,标记和格式极少,但仍能提供一种表示重要文档结构的方式。主流的 LLM,例如 OpenAI 的 GPT-4o,本身就"说" Markdown,并且经常在未经提示的情况下将 Markdown 融入其响应中。这表明它们在海量的 Markdown 格式文本上进行了训练,并对其理解深刻。作为附带好处,Markdown 惯例在 token 效率方面也非常高。
## 前置条件
MarkItDown 需要 Python 3.10 或更高版本。建议使用虚拟环境以避免依赖冲突。
使用标准 Python 安装,你可以通过以下命令创建并激活虚拟环境:
```bash
python -m venv .venv
source .venv/bin/activate
```
如果使用 `uv`,可以这样创建虚拟环境:
```bash
uv venv --python=3.12 .venv
source .venv/bin/activate
# NOTE: Be sure to use 'uv pip install' rather than just 'pip install' to install packages in this virtual environment
```
如果你使用 Anaconda,可以这样创建虚拟环境:
```bash
conda create -n markitdown python=3.12
conda activate markitdown
```
## 安装
要安装 MarkItDown,使用 pip`pip install 'markitdown[all]'`。或者,你也可以从源码安装:
```bash
git clone git@github.com:microsoft/markitdown.git
cd markitdown
pip install -e 'packages/markitdown[all]'
```
## 使用方法
### 命令行
```bash
markitdown path-to-file.pdf > document.md
```
或使用 `-o` 来指定输出文件:
```bash
markitdown path-to-file.pdf -o document.md
```
你也可以通过管道传入内容:
```bash
cat path-to-file.pdf | markitdown
```
### 可选依赖
MarkItDown 提供可选依赖以激活各种文件格式的支持。在本文档前面部分,我们通过 `[all]` 选项安装了所有可选依赖。不过,你也可以单独安装它们以获得更精细的控制。例如:
```bash
pip install 'markitdown[pdf, docx, pptx]'
```
将仅安装 PDF、DOCX 和 PPTX 文件所需的依赖。
目前,有以下可选依赖可用:
* `[all]` 安装所有可选依赖
* `[pptx]` 安装 PowerPoint 文件所需的依赖
* `[docx]` 安装 Word 文件所需的依赖
* `[xlsx]` 安装 Excel 文件所需的依赖
* `[xls]` 安装旧版 Excel 文件所需的依赖
* `[pdf]` 安装 PDF 文件所需的依赖
* `[outlook]` 安装 Outlook 邮件所需的依赖
* `[az-doc-intel]` 安装 Azure 文档智能所需的依赖
* `[az-content-understanding]` 安装 Azure 内容理解所需的依赖
* `[audio-transcription]` 安装 wav 和 mp3 文件音频转录所需的依赖
* `[youtube-transcription]` 安装获取 YouTube 视频转录所需的依赖
### 插件
MarkItDown 还支持第三方插件。插件默认处于禁用状态。要列出已安装的插件:
```bash
markitdown --list-plugins
```
要启用插件,使用:
```bash
markitdown --use-plugins path-to-file.pdf
```
要查找可用的插件,请在 GitHub 上搜索标签 `#markitdown-plugin`。要开发插件,请参阅 `packages/markitdown-sample-plugin`
#### markitdown-ocr 插件
`markitdown-ocr` 插件为 PDF、DOCX、PPTX 和 XLSX 转换器增加了 OCR 支持,使用 LLM Vision 从嵌入图像中提取文本——采用与 MarkItDown 已有的图像描述功能相同的 `llm_client` / `llm_model` 模式。无需新的机器学习库或二进制依赖。
**安装:**
```bash
pip install markitdown-ocr
pip install openai # or any OpenAI-compatible client
```
**使用方法:**
传入与你用于图像描述相同的 `llm_client``llm_model`
```python
from markitdown import MarkItDown
from openai import OpenAI
md = MarkItDown(
enable_plugins=True,
llm_client=OpenAI(),
llm_model="gpt-4o",
)
result = md.convert("document_with_images.pdf")
print(result.text_content)
```
如果未提供 `llm_client`,插件仍会加载,但 OCR 会被静默跳过,转而使用标准的内置转换器。
详细文档请参阅 [`packages/markitdown-ocr/README.md`](packages/markitdown-ocr/README.md)。
### Azure 内容理解
[Azure 内容理解](https://learn.microsoft.com/azure/ai-services/content-understanding/) 提供更高质量的转换,支持结构化字段提取(YAML 前置元数据)、多模态支持(文档、图像、音频、视频)以及可配置的分析器。
安装:`pip install 'markitdown[az-content-understanding]'`
#### 何时使用内容理解
当你需要超越内置转换器或文档智能集成所提供的功能时,内容理解是理想之选:
- **音频和视频文件** — CU(内容理解)是视频的唯一选项,也是音频的更高质量云端选项。内置转换器不支持视频,且仅提供基础的音频转录。
- **结构化字段提取** — [预置](https://learn.microsoft.com/azure/ai-services/content-understanding/concepts/prebuilt-analyzers) 或[自定义](https://learn.microsoft.com/azure/ai-services/content-understanding/how-to/customize-analyzer-content-understanding-studio?tabs=portal) 分析器可提取领域特定字段(发票金额、收据日期、合同条款),并以 YAML 前置元数据的形式序列化输出。内置转换器和文档智能集成均不公开字段信息。
- **更高质量的文档提取** — 基于云端的布局分析和 OCR,适用于扫描版 PDF、复杂表格和多页文档。
- **所有模态的统一 API** — 一个 `cu_endpoint` 即可处理文档、图像、音频和视频,并自动进行分析器路由。
| 功能 | 内置转换器 | Azure 文档智能 | Azure 内容理解 |
|------------|---------------------|-----------------------------|-----------------------------|
| 文档转换 | 离线、按格式提取 | 云端布局提取 | 云端多模态提取 |
| 结构化字段 | 不可用 | 此集成不公开 | 来自分析器字段的 YAML 前置元数据 |
| 自定义分析器 | 不可用 | 此集成中不可配置 | 支持,使用 `cu_analyzer_id` |
| 音频和视频 | 基础音频,不支持视频 | 不支持 | 音频和视频分析器 |
| 成本 | 仅本地计算 | Azure API 调用计费 | Azure API 调用计费 |
**CLI:**
```bash
markitdown path-to-file.pdf --use-cu --cu-endpoint "<content_understanding_endpoint>"
```
**Python API:**
```python
from markitdown import MarkItDown
# Zero-config — auto-selects analyzer per file type
md = MarkItDown(cu_endpoint="<content_understanding_endpoint>")
result = md.convert("report.pdf") # documents → prebuilt-documentSearch
result = md.convert("meeting.mp4") # video → prebuilt-videoSearch
result = md.convert("call.wav") # audio → prebuilt-audioSearch
print(result.markdown)
```
**使用自定义分析器**(用于领域特定字段提取):
```python
md = MarkItDown(
cu_endpoint="<content_understanding_endpoint>",
cu_analyzer_id="my-invoice-analyzer",
)
result = md.convert("invoice.pdf")
print(result.markdown)
# Output includes YAML front matter with extracted fields:
# ---
# contentType: document
# fields:
# VendorName: CONTOSO LTD.
# InvoiceDate: '2019-11-15'
# ---
# <!-- page 1 -->
# ...
```
当设置 ``cu_analyzer_id`` 时,转换器会根据分析器的模态自动将其限定为兼容的文件类型。不兼容的类型(例如,使用文档分析器处理音频文件)会自动路由到默认的预构建分析器。
**费用说明:** 每次对 CU 路由格式的 ``convert()`` 调用均为一次计费的 Azure API 调用。使用 ``cu_file_types`` 可限制哪些格式路由到 CU:
```python
from markitdown.converters import ContentUnderstandingFileType
md = MarkItDown(
cu_endpoint="<content_understanding_endpoint>",
cu_file_types=[ContentUnderstandingFileType.PDF], # only PDFs use CU
)
```
更多关于 Azure Content Understanding 的信息,请参见[此处](https://learn.microsoft.com/azure/ai-services/content-understanding/).)。
### Azure Document Intelligence
使用 Microsoft Document Intelligence 进行转换:
```bash
markitdown path-to-file.pdf -o document.md -d -e "<document_intelligence_endpoint>"
```
更多关于如何设置 Azure Document Intelligence 资源的信息,请参见[此处](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/how-to-guides/create-document-intelligence-resource?view=doc-intel-4.0.0))。
### Python API
Python 基本用法:
```python
from markitdown import MarkItDown
md = MarkItDown(enable_plugins=False) # Set to True to enable plugins
result = md.convert("test.xlsx")
print(result.text_content)
```
Python 中的 Document Intelligence 转换:
```python
from markitdown import MarkItDown
md = MarkItDown(docintel_endpoint="<document_intelligence_endpoint>")
result = md.convert("test.pdf")
print(result.text_content)
```
如需使用大语言模型生成图片描述(目前仅支持 pptx 和图片文件),请提供 ``llm_client`` 和 ``llm_model``
```python
from markitdown import MarkItDown
from openai import OpenAI
client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o", llm_prompt="optional custom prompt")
result = md.convert("example.jpg")
print(result.text_content)
```
### Docker
```sh
docker build -t markitdown:latest .
docker run --rm -i markitdown:latest < ~/your-file.pdf > output.md
```
## 贡献
本项目欢迎贡献和建议。大多数贡献需要您同意一份贡献者许可协议(CLA),声明您有权且确实授予我们使用您贡献的权利。详情请访问 https://cla.opensource.microsoft.com.。
当您提交拉取请求(Pull Request)时,CLA 机器人会自动判断您是否需要提供 CLA,并适当装饰 PR(例如状态检查、评论)。只需按照机器人提供的说明操作即可。您只需在所有使用我们 CLA 的仓库中执行一次。
本项目已采用 [Microsoft 开放源代码行为准则](https://opensource.microsoft.com/codeofconduct/).)。更多信息请参阅[行为准则常见问题解答](https://opensource.microsoft.com/codeofconduct/faq/)),或通过 [opencode@microsoft.com](mailto:opencode@microsoft.com) 联系以提出其他问题或意见。
### 如何贡献
您可以通过查看 Issue 或帮助审核 PR 来提供帮助。任何 Issue 或 PR 都欢迎,但我们也标记了一些"开放供贡献"和"开放供审核"的内容,以方便社区贡献。当然,这些都只是建议,欢迎您以任何方式贡献。
<div align="center">
| | 全部 | 特别需要社区帮助 |
| ---------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| **Issues** | [全部 Issues](https://github.com/microsoft/markitdown/issues)) | [开放供贡献的 Issues](https://github.com/microsoft/markitdown/issues?q=is%3Aissue+is%3Aopen+label%3A%22open+for+contribution%22)) |
| **PRs** | [全部 PRs](https://github.com/microsoft/markitdown/pulls)) | [开放供审核的 PRs](https://github.com/microsoft/markitdown/pulls?q=is%3Apr+is%3Aopen+label%3A%22open+for+reviewing%22)) |
</div>
### 运行测试和检查
- 进入 MarkItDown 包目录:
```sh
cd packages/markitdown
```
- 在您的环境中安装 ``hatch`` 并运行测试:
```sh
pip install hatch # 安装 hatch 的其他方式:https://hatch.pypa.io/dev/install/
hatch shell
hatch test
```
(备选)使用已安装所有依赖项的 Devcontainer
```sh
# 在 Devcontainer 中重新打开项目,然后运行:
hatch test
```
- 在提交 PR 前运行 pre-commit 检查:``pre-commit run --all-files``
### 安全注意事项
MarkItDown 以当前进程的权限执行 I/O 操作。与 ``open()`` 或 ``requests.get()`` 类似,它可以访问进程本身能访问的资源。
**对输入进行消毒:** 不要将不受信任的输入直接传递给 MarkItDown。如果输入的任何部分可能受不受信任的用户或系统控制(例如在托管或服务端应用中),则必须在调用 MarkItDown 之前对其进行验证和限制。根据您的环境,这可能包括限制文件路径、限制 URI 方案和网络目标,以及阻止访问私有地址、环回地址、链路本地地址或元数据服务地址。
**仅调用您需要的转换方法:** 优先使用最适合您用例的最小转换 API。MarkItDown 的 ``convert()`` 方法设计上较为宽松,可以处理本地文件、远程 URI 和字节流。如果您的应用程序只需要读取本地文件,请改用 ``convert_local()``。如果您需要对 URI 获取进行更多控制,请自行调用 ``requests.get()``,并将响应对象传递给 ``convert_response()``。如需最大程度的控制,请打开要转换的输入流,然后调用 ``convert_stream()``。
### 贡献第三方插件
您还可以通过创建和分享第三方插件来贡献。更多详情请参见 ``packages/markitdown-sample-plugin``。
## 商标
本项目可能包含项目、产品或服务的商标或徽标。对 Microsoft 商标或徽标的授权使用必须遵守并遵循 [Microsoft 商标与品牌指南](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).)。在本项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 的赞助。任何第三方商标或徽标的使用均须遵守第三方的政策。