magicrew/doc7
GitHub: magicrew/doc7
doc7 利用用户自有的多模态视觉模型,将各类复杂文档转换为 AI 友好的 Markdown,无需独立 OCR 栈且不按页计费。
Stars: 223 | Forks: 4
doc7
任意文档输入。输出 AI 友好的 Markdown。
将 PDF、Office 文件、扫描件、截图、图表、公式和图表转换为可供您的 AI 搜索、引用和推理的 Markdown。
简体中文 · English
GitHub · Releases · 基准测试
[](https://github.com/magicrew/doc7/actions/workflows/build.yml) [](https://github.com/magicrew/doc7/releases) [](./LICENSE)
[](#快速开始)
`doc7` 通过您自己的 OpenAI 兼容多模态模型,将 PDF、Office 文件、扫描件、截图、图表、公式和图表转换为 Markdown。无需额外的 OCR 栈。没有文档处理服务的锁定。
## 快速开始
安装 doc7,在 LM Studio 或 Ollama 中启动本地视觉模型,然后转换一份文档:
```
# macOS 或 Linux
curl -fsSL https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.sh | bash
# Windows PowerShell
irm https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.ps1 | iex
# 转换文档
doc7 report.pdf
```
首次运行会自动发现本地模型 endpoint,并将所选模型保存在本机上。如需使用远程 endpoint,请使用 `doc7 setup` 进行配置。
## 理解复杂页面
[](./examples/attention-is-all-you-need/input.webp)
这是 *Attention Is All You Need* 中纯图像渲染的一页。没有文本层。doc7 恢复了论文标识、Figure 2、展示的公式、缩放原理、技术脚注,以及两个注意力图内部有序的关系,将其转化为可搜索的 Markdown。
相同的 pipeline 可以处理完整的论文和多页报告,然后将有序的页面重建为一个文档。
`doc7` 会读取整个页面,而不是仅仅停留在字符提取上。引入任何 OpenAI 兼容的多模态模型,包括私有或本地部署。不需要繁琐的 OCR 栈,doc7 也不按页收取文档解析费用。
## 基于真实输入的测量
[](./benchmarks/visual-report/README.md)
两份纯图像 PDF。十五个可机器检查的视觉事实。MarkItDown OCR 和 doc7 通过同一个本地 OpenAI 兼容的 endpoint 使用了完全相同的 `qwen3.5-9b` 模型。Docling 使用了其标准的本地 pipeline。
在这次运行中,doc7 恢复了 **15/15** 被检查的事实,而带有 OCR 插件的 MarkItDown 为 9/15,Docling 标准 pipeline 为 3/15。
## 一个 Pipeline 处理所有格式
[](#支持的输入)
不同的格式进入相同的页面理解 pipeline。文本、表格、公式、图表、图表关系、图像含义和可见的 UI 状态最终输出为一个可搜索的 Markdown 文档。
## 以 CLI 为核心
[](#快速开始)
同一个二进制程序提供了交互式 CLI、批处理、模型检查、MCP、Go SDK 以及异步 HTTP 服务。
## 详细设置与使用
**下载:** [macOS、Linux 和 Windows CLI 压缩包](https://github.com/magicrew/doc7/releases)
无需管理员权限即可安装最新版本。
macOS 或 Linux:
```
curl -fsSL https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.sh | bash
```
Windows PowerShell:
```
irm https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.ps1 | iex
```
安装程序是推荐的 macOS 安装方式。它会下载经过校验和验证的版本,并将其安装在您的用户目录下,因此不需要管理员帐户或 Apple Developer ID。直接打开浏览器下载的二进制文件则不同:macOS 可能会给该文件添加隔离属性。如果您选择手动解压压缩包,请在解压后在终端中运行包含的命令:
```
xattr -dr com.apple.quarantine
```
这会移除本地下载的隔离属性;它不是 Apple 签名或公证。官方的 Developer ID 签名和公证需要 Apple Developer Program 帐户,并计划在未来的签名发布渠道中提供。
启动 LM Studio 或 Ollama,加载本地视觉模型,并转换文件:
```
doc7 report.pdf
doc7 screenshot.png
```
这是完整的首次运行流程。doc7 会检测系统语言,发现正在运行的本地模型服务器,读取其真实的模型 ID,在多个模型可用时供您选择,验证图像理解能力,并将选择保存在本机上。未经身份验证的 LM Studio 和 Ollama endpoint 不需要 API key。
`chat` 是一个在已配置的本地模型上运行的小型 agent。普通消息会直接发送给模型,不需要文档。运行它时如果不附带消息,则会进入交互式会话:
```
doc7 chat "Hello, introduce yourself"
doc7 chat
```
当用户明确提供文件、目录或 URL 并要求 doc7 处理它时,模型可以调用受限的 `convert_document` 工具:
```
doc7 chat "Turn report.pdf into knowledge-base Markdown"
```
这里没有关键字或特定语言的意图解析器。模型通过兼容 OpenAI 的 Tool Calling 决定是否使用工具。对于模糊的文件名,Chat 可以在授权目录内使用结构化的只读文件系统工具集(`pwd`, `ls`, `find`, `file`, `stat`, `wc` 和 `realpath`),然后在转换前要求您选择候选文件。它永远不会接收任意的 shell 字符串:没有管道、重定向、脚本、写入、网络命令或进程控制。
会话从当前工作目录以及现有的桌面、文档和下载目录开始。其他目录需要在本地终端中输入显式路径。`head` 和 `tail` 是独立的预览工具,因为它们向模型公开的文本内容有限;Chat 在使用它们之前会要求确认。
不支持 Tool Calling 的模型仍然可以聊天;请使用 `doc7 ` 作为稳定的直接转换入口。
同一个聊天 agent 可以用自然语言指导首次配置。它可以显示有效的配置路径,发现本地 LM Studio 或 Ollama 暴露的模型,并通过真实的视觉探测验证候选模型:
```
doc7> Use the local LM Studio model that can understand images
doc7> Switch the interface to English
doc7> Check whether my current model configuration works
```
配置更改首先会进行 dry-run(空运行)。agent 会调用 `ask_user` 显示明确的选择,只有用户确认后才会写入文件。使用 `doc7 --yes chat "..."` 可以显式地一次性授权非机密更改。
当远程 endpoint 需要 API key 时,Chat 可以启动隐藏的本地输入提示;模型可能会看到输入的字节数和凭据来源,但绝不会看到 key 的内容。在非交互式环境中,请使用 `doc7 setup config --api-key-stdin`。
检查或更改本地配置:
```
doc7 config show
doc7 config path
doc7 config set # list editable keys, current values, and descriptions
doc7 config set language en # en, zh-CN, or auto
doc7 setup # run local model discovery again
```
`doc7 config` 打印有效的配置文件路径。本地化标签旁边保留了稳定的英文键名,因此您无需猜测即可编辑值:
```
doc7 config set model
doc7 config set base_url http://127.0.0.1:1234/v1
doc7 config set credential_store env
```
通常的路径是用户配置目录下的 `doc7/config.yaml`。如果当前目录或其父目录之一中存在 `.doc7.yaml`,doc7 将显示并使用该有效路径。使用 `--config ` 可以显式选择文件。
更新已安装的 CLI:
```
doc7 update --check
doc7 update
```
更新程序会读取最新的稳定版 GitHub Release,为当前平台下载匹配的包,并验证 `checksums.txt`。在 Windows 上,替换操作会推迟到正在运行的可执行文件退出后才进行;安装目录必须可由当前用户写入。
也支持远程的 OpenAI 兼容 endpoint。在首次进行远程转换之前,doc7 会明确警告文档内容将离开本机。
API key 保存在系统 keychain、Windows 凭据管理器、显式选择的环境变量或本地凭据文件中。它们绝不会存储在此仓库或发布压缩包中。
Windows x86_64 压缩包包含 CLI 和启动器。Windows Portable 软件包还捆绑了文档渲染器,因此它们可以解压到诸如 `C:\doc7` 之类的短路径中,适用于限制软件安装的机器。模型始终在您配置的 endpoint 运行;它并不内嵌在 CLI 压缩包中。
## 您的本地模型,近乎零的边际成本
doc7 不出售文档额度,也不按页面、图像或转换收费。在您自己的笔记本电脑、工作站、服务器或私有推理机器上运行量化多模态模型,处理该硬件能够承受的尽可能多的文档。当硬件已经存在时,另一份文档的边际成本趋近于它消耗的电力和运行时间。
- **无文档 API 计量。** 重复和批量转换不会为每一页产生新的 doc7 账单。
- **使用您已拥有的硬件。** 量化的开源模型将可用的 CPU、GPU 和统一内存转变为可重用的文档处理 endpoint。
- **一个模型,多种文档类型。** 相同的 endpoint 可以理解文本、表格、公式、图表、流程图、截图和图像含义,而无需独立的 OCR、布局、表格和公式模型栈。
- **保持文档私密。** 本地或私有 endpoint 将文档内容保留在您控制的基础设施内。
如果内存需求合适,小型量化视觉模型可以在普通机器上运行。质量、速度和最低硬件要求取决于您选择的模型和量化方式;doc7 不规定模型大小,也不声称所有模型都能产生相同的结果。
## 本地推理与云端文档 API 对比
云定价因地区、模型、功能和用量而异。持久的差异在于成本结构:云端文档 API 按页面、图像或功能调用计量;本地 doc7 推理主要使用您控制的硬件和电力。
| 选项 | 典型计费单位 | 文档量增长时的成本 | 文档位置 |
| --- | --- | --- | --- |
| **doc7 + 本地量化 VLM** | 无 doc7 按页或按调用收费 | 主要是现有的硬件、电力和运维 | 本地或私有基础设施 |
| [AWS Textract](https://aws.amazon.com/textract/pricing/) | 页面,按 API 和分析功能定价 | 使用量随页面和启用功能而增加 | 云 API |
| [Google Document AI](https://cloud.google.com/products/document-ai/pricing) | 页面,通常按处理器和量级定价 | 使用量随页面和处理器类型而增加 | 云 API |
| [Azure Document Intelligence](https://azure.microsoft.com/en-us/pricing/details/document-intelligence/) | 页面、模型和定价层 | 使用量随页面和所选功能而增加 | 云 API |
| [Alibaba Cloud OCR](https://help.aliyun.com/zh/ocr/product-overview/product-billing/) | 按量付费调用或预付费资源包 | 持续处理会消耗调用次数或资源包配额 | 云 API |
| [Tencent Cloud OCR](https://buy.cloud.tencent.com/price/ocr) | 通过预付费或后付费计费的 API 调用 | 持续处理会消耗调用次数或资源包配额 | 云 API |
| [Baidu AI Cloud OCR](https://cloud.baidu.com/doc/OCR/s/Jk3h7xtsd) | API 调用、免费额度和付费使用量 | 持续处理会消耗调用次数或配额 | 云 API |
当团队希望拥有托管容量且不想自己运营模型时,云 API 依然非常有用。doc7 则专为相反的情况而设计:重用本地或私有模型,消除经常性的文档解析账单,并将长期文档转换转变为您拥有的基础设施。
## 开放基准测试详情
| 系统 | Attention 论文 | 视觉报告 | 综合 | 原始 Markdown |
| --- | ---: | ---: | ---: | ---: |
| **#1 doc7 + qwen3.5-9b** | **7/7** | **8/8** | **15/15** | **5,293 字节** |
| MarkItDown 0.1.6 + OCR 0.1.0 + qwen3.5-9b | 3/7 | 6/8 | 9/15 | 13,142 字节 |
| Docling 2.113.0 standard | 1/7 | 2/8 | 3/15 | 2,571,445 字节 |
| MarkItDown 0.1.6 default | N/A | N/A | N/A | 0 字节 |
论文案例检查标识、Figure 2、两个有序的注意力流向、展示的公式、缩放原理和技术脚注。视觉报告案例检查文本、KPI 卡片、图表数据和趋势、表格、公式语义和 LaTeX、工作流顺序以及 UI 状态。
MarkItDown 的默认路径对这两个纯图像输入返回了空文件,因此报告为 `N/A`,而不是赋予具有误导性的零能力得分。其官方 OCR 插件是单独计分的。Docling 的原始 Markdown 非常大,因为它将页面图像嵌入为 Base64;字节数是诊断指标,而不是质量得分。
[Attention 输入](./examples/attention-is-all-you-need/input.pdf) · [doc7 输出](./examples/attention-is-all-you-need/output.md) · [Attention 基准测试](./benchmarks/attention-is-all-you-need/README.md) · [视觉报告基准测试](./benchmarks/visual-report/README.md)
运行元数据:`2026-07-30` · `darwin/arm64`。每个原始输出、SHA-256摘要、评分规则和机器可读的结果都已提交以供检查。不包含任何模型 endpoint 或凭据。
这些是专注的视觉理解案例,而不是通用的产品排名。
论文输入是基于 *Attention Is All You Need* 第 4 页的学术基准测试组合,不属于 doc7 的 MIT 许可协议范围。[阅读来源和许可记录](./examples/attention-is-all-you-need/source.json)。
要进行固定的大规模评估,请使用 [olmOCR-Bench 适配器](./benchmarks/olmocr/README.md)。它支持上游 1,403 个 PDF / 7,010 个事实的测试套件,而无需重新分发其第三方文档;在发布完整的固定运行结果之前,doc7 不声称拥有完整套件的排名。
## 不同的架构
| 主要方法 | 代表性项目 | 发生了什么 | 您需要运营什么 |
| --- | --- | --- | --- |
| 格式和文本提取 | [MarkItDown](https://github.com/microsoft/markitdown) 默认路径 | 特定于文件的解析器恢复文本和基本结构 | Python 包和可选插件 |
| 视觉模型 OCR 包装器 | [Zerox](https://github.com/getomni-ai/zerox) | 页面变成图像并发送给特定于提供商的视觉 SDK | Node/Python SDK、GraphicsMagick/Ghostscript 以及提供商凭据 |
| 专用文档 AI 栈 | [MinerU](https://github.com/opendatalab/MinerU), [Docling](https://github.com/docling-project/docling) | OCR、布局、表格、公式和文档模型作为 pipeline 协同工作 | 模型权重、runtime 和特定于文档的基础设施 |
| 全页面视觉理解 | **doc7** | 页面由您的多模态模型渲染和重建 | 跨平台 CLI、Go SDK、MCP 工具、异步 HTTP 服务以及您现有的模型 endpoint |
模型仍然是您的选择。`doc7` 不规定模型大小,也不声称未经测量的质量。使用私有的开源模型,不需要外部的文档处理服务,也没有 doc7 的使用配额。
## 模型、依赖项和恢复工作流
发现 OpenAI 兼容视觉 endpoint 暴露的模型 ID:
```
doc7 models --base-url http://localhost:8000/v1
```
LM Studio 默认使用 `http://127.0.0.1:1234/v1`。启动其本地服务器,然后使用该 URL 及其返回的模型 ID 之一。
保存 endpoint 和一个返回的模型 ID:
```
doc7 setup config \
--base-url http://localhost:8000/v1 \
--model
```
经过身份验证的 endpoint 可以使用 `DOC7_API_KEY` 或 `doc7 setup config --api-key-stdin`。要使用其他环境变量,请使用 `--api-key-env` 显式设置,例如 `--api-key-env OPENAI_API_KEY`。doc7 绝不会自动扫描特定于提供商的环境变量,并且未经身份验证的 endpoint 不需要占位符 key;doc7 会省略 `Authorization` 标头。
检查本地依赖项,并向模型发送一个真实的微小图像请求:
```
doc7 doctor --check-model
```
传入您要处理的文档,以使命令检查特定于格式的依赖项:
```
doc7 doctor report.docx --check-model
```
读取文档:
```
doc7 read report.pdf -o report-doc7
```
当某个页面需要其他模型或设置时,仅重新处理选定的源页面。页码从 1 开始,范围包含边界,并且原始页码保留在输出和清单中:
```
doc7 read report.pdf -o report-pages-5-7 --pages 5,7
doc7 read report.pdf -o report-pages-10-12 --pages 10-12
```
清单记录了 `source_page_count` 和 `page_selection`;选定的页面仍然被写入为 `page_005.md`、`page_007.md` 等。清单和页面元数据中的产物路径是相对于输出目录的,因此完整的结果可以在另一台机器上移动或解压。
如果一份长文档在完成时只有少数几页失败,请重试现有输出而不是从头开始:
```
doc7 read report.pdf -o report-doc7 --resume
doc7 read report.pdf -o report-doc7 --resume --pages 5,7
```
不使用 `--pages` 时,doc7 会自动选择现有清单中所有失败的页面。显式选择必须仅包含失败的页面,并且输入的 SHA-256 必须仍然匹配。成功的页面保持逐字节不变。先前的清单归档在 `history/` 下;新清单记录了已处理和保留的页数以及每页的模型来源信息,包括混合模型运行。如果没有剩余的失败页面,`--resume` 会验证页面产物并重建丢失的合并 Markdown,而无需调用模型。
或者将合并后的 Markdown 直接通过管道传递给另一个工具:
```
doc7 read report.pdf --stdout > report.md
```
通过提供其逻辑文件名和扩展名,从 stdin 读取二进制输入:
```
cat report.pdf | doc7 read - --stdin-name report.pdf --stdout > report.md
```
Stdin 输入默认限制为 1,024 MB。使用 `--stdin-max-mb` 更改限制。
递归读取目录:
```
doc7 read ./documents -o ./knowledge
```
对于大型目录,`--file-workers` 控制一次处理多少个文档,而 `--workers` 控制每个文档内的页面请求。文件级并发默认值为 `1`;仅当渲染器和模型 endpoint 能够处理合并的负载时才增加它。
直接读取远程文档:
```
doc7 read https://example.com/report.pdf -o ./report-doc7
```
## 作为服务运行
启动本地异步 HTTP 服务:
```
doc7 serve --addr 127.0.0.1:8787 --data-dir ./doc7-server
```
提交一个本地文档或 ZIP 压缩包:
```
curl -F file=@report.pdf http://127.0.0.1:8787/v1/jobs
```
HTTP 服务接受与 multipart 字段相同的页面选择:
```
curl -F file=@report.pdf -F pages=5,7 http://127.0.0.1:8787/v1/jobs
```
响应包含一个作业 ID。轮询返回的状态 URL,然后下载合并的 Markdown 或完整的产物 ZIP:
```
curl http://127.0.0.1:8787/v1/jobs/
curl -o report.md http://127.0.0.1:8787/v1/jobs//markdown
curl -o report-artifacts.zip http://127.0.0.1:8787/v1/jobs//artifacts
```
重试同一作业中每个失败的页面,或显式指定的失败页面子集:
```
curl -X POST -H 'Content-Type: application/json' \
-d '{}' http://127.0.0.1:8787/v1/jobs//resume
curl -X POST -H 'Content-Type: application/json' \
-d '{"pages":"5,7"}' http://127.0.0.1:8787/v1/jobs//resume
```
恢复使用服务器当前的模型配置。您可以停止服务,更改模型,然后在恢复作业之前使用相同的 `--data-dir` 重启它。在更改作业之前,无效的选择会返回 `409 resume_rejected`。
`GET /healthz` 不需要身份验证。仅在提供 bearer token 的情况下绑定到 localhost 以外的地址,该 token 通过由 `--auth-token-env` 命名的环境变量(默认值:`DOC7_SERVER_TOKEN`)提供:
```
DOC7_SERVER_TOKEN='replace-me' doc7 serve --addr 0.0.0.0:8787
curl -H 'Authorization: Bearer replace-me' http://127.0.0.1:8787/v1/jobs
```
该服务接受上传的文件和 ZIP 压缩包。对于 URL 源,请使用 CLI 或 Go `Read` API,由调用者控制网络策略。
## 从 AI 工具中使用
doc7 包含一个带有类型化 `convert_to_markdown` 工具的 MCP 服务器。配置您的 MCP 客户端以通过 stdio 启动该二进制文件:
```
{
"mcpServers": {
"doc7": {
"command": "/absolute/path/to/doc7",
"args": ["mcp"],
"env": {
"DOC7_BASE_URL": "http://127.0.0.1:1234/v1",
"DOC7_MODEL": "qwen3.5-0.8b",
"DOC7_CREDENTIAL_STORE": "env"
}
}
}
}
```
该工具接受本地路径、目录、HTTP(S) URL 或 ZIP 压缩包,并返回 Markdown 以及结构化的转换元数据。自动创建的产物保存在用户缓存目录下;使用 `doc7 mcp --output-root ` 覆盖它。要重试持久化输出中失败的页面,请传入相同的 `input` 和 `output_dir` 并加上 `resume: true`;`pages` 可将重试限制在失败页面的子集内。
## 使用 Docker 运行
Docker 镜像包含 LibreOffice、MuPDF、Chromium 和 CJK 字体。它以非 root 用户身份运行 HTTP 服务,并将配置和作业持久化存储在命名卷中:
```
export DOC7_MODEL=qwen3.5-0.8b
export DOC7_SERVER_TOKEN=replace-me
docker compose pull
docker compose up --no-build
```
发布的镜像是 `ghcr.io/magicrew/doc7:latest`,同时包含 `linux/amd64` 和 `linux/arm64` 架构。当您想在本地构建当前源码时,请使用 `docker compose up --build`。
默认的模型 endpoint 是 `http://host.docker.internal:1234/v1`,适用于 Docker Desktop 上的 LM Studio。为其他 endpoint 设置 `DOC7_BASE_URL`。在容器健康检查就绪后,将文件提交到 `http://127.0.0.1:8787/v1/jobs`。
如果构建环境需要代理,请不要将主机的 `127.0.0.1` 代理地址传入 Docker Desktop。请使用从容器可见的主机地址:
```
export DOC7_BUILD_HTTP_PROXY=http://host.docker.internal:7890
export DOC7_BUILD_HTTPS_PROXY=http://host.docker.internal:7890
docker compose up --build
```
无需修改 doc7 即可使用特定领域的转换 prompt:
```
doc7 read ./reports --prompt-file ./prompt.md
```
对于包含嵌入文本层的 PDF 和 Office 文件,启用可选的精确值检查:
```
doc7 read report.pdf --text-grounding
```
页面图像仍然是主要来源。doc7 不运行 OCR,也不用提取的文本替换视觉结果。它会检查来自嵌入文本层的精确数字、代码和文档标识符,要求视觉模型确认候选的修正,并在其他情况下保留第一遍的 Markdown,同时提供 `grounding_warnings` 计数和页面级详细信息。此模式可能会发出额外的模型请求,并且默认处于关闭状态。
模型请求使用 `temperature: 0` 以实现可重复的转录。默认情况下,每页的上限为 8,192 个输出 token。如果由于 prompt 和图像超出其上下文窗口导致提供商拒绝请求,或者出于同样的原因在配置的输出限制之前停止生成,doc7 会自动以较低分辨率的请求图像进行重试。原始渲染的页面将保留用于产物和基础验证。默认情况下允许两次回退,直到最长边降至 720 像素;可以通过 `--context-fallbacks`、`--min-image-dimension`、`DOC7_CONTEXT_FALLBACKS` 或 `DOC7_MIN_IMAGE_DIMENSION` 配置它们。
如果模型达到了配置的 `--max-tokens` 值,或者所有的上下文回退都已耗尽,doc7 会将该页面标记为失败,而不是默默写入被截断的 Markdown。当回退成功时,页面元数据会记录 `request_image_max_dimension` 和 `context_fallbacks_used`。仅仅提高 `--max-tokens` 并不能超过提供商的上下文窗口。
## 在 Go 中嵌入
公开的 `github.com/magicrew/doc7` 包暴露了相同的转换引擎,而无需使用者导入 `internal` 包。当源可以是本地文件、目录、HTTP(S) URL 或 ZIP 压缩包时,请使用 `Read`:
```
package main
import (
"context"
"log"
"github.com/magicrew/doc7"
)
func main() {
options := doc7.DefaultReadOptions()
options.OutputDir = "report-doc7"
options.BaseURL = "http://127.0.0.1:1234/v1"
options.Model = "qwen3.5-4b"
result, err := doc7.Read(context.Background(), "report.pdf", options)
if err != nil {
log.Fatal(err)
}
if result.Document != nil {
log.Println(result.Document.MergedMarkdown)
}
}
```
`Read` 返回类型化的文档结果或递归批处理结果。使用页面选择时,摘要会公开选定的 `PagesTotal` 和源文档的 `SourcePagesTotal`。在 `ReadOptions`、`Options` 或 `BatchOptions` 上设置 `Resume` 以重试现有的失败页面;`Pages` 可将重试限制在失败页面的子集内。当您需要显式的单文档或仅目录 API 时,请使用 `Convert` 和 `ConvertBatch`:
```
package main
import (
"context"
"github.com/magicrew/doc7"
)
func main() {
options := doc7.DefaultOptions()
options.OutputDir = "report-doc7"
options.BaseURL = "http://127.0.0.1:1234/v1"
options.Model = "qwen3.5-4b"
_, err := doc7.Convert(context.Background(), "report.pdf", options)
if err != nil {
panic(err)
}
}
```
这三个入口点都提供类型化的摘要和进度回调;启用并发时,页面和文件事件可能会并发到达。
## 转换后保留的信息
| 页面上的信息 | Markdown 结果 |
| --- | --- |
| 标题、段落、列表、引用和代码 | 原生 Markdown 结构 |
| 表格和电子表格 | 包含值和单位的 Markdown 或 HTML 表格 |
| 数学符号 | 行内或展示 LaTeX |
| 图表 | 作为可搜索文本的标签、数值、趋势和结论 |
| 流程图和工作流 | 节点、顺序、分组和关系 |
| 截图和应用程序状态 | 可见的状态、错误、控件和操作 |
| 电子邮件 | 标题、HTML 或文本正文、内嵌图像和附件清单 |
| Jupyter notebooks | Markdown 单元、源代码、执行计数、文本输出、traceback 和可视化输出 |
| 有意义的布局 | 比较、层次结构、顺序和空间关系 |
## 支持的输入
| 类别 | 格式 |
| --- | --- |
| 文档 | PDF, DOC/DOCX/DOCM, DOT/DOTX/DOTM, ODT, RTF |
| 演示文稿 | PPT/PPTX/PPTM, POT/POTX/POTM, PPS/PPSX/PPSM, ODP |
| 电子表格 | XLS/XLSX/XLSM, XLT/XLTX/XLTM, ODS |
| 电子书 | EPUB |
| 电子邮件和网页存档 | EML, MHTML/MHT, Outlook MSG |
| 笔记本 | Jupyter Notebook (IPYNB) |
| 图像 | PNG, JPEG, GIF, WebP, BMP, TIFF(包括多页 TIFF), SVG, 有序图像目录 |
| 原生文本和数据 | Markdown, TXT, CSV, TSV, JSON, XML, YAML |
| 网页和压缩包 | HTML, HTTP/HTTPS URL, ZIP 压缩包, 嵌套文档目录 |
Office 和 OpenDocument 文件需要 LibreOffice。PDF 渲染在可用时使用 MuPDF,平台特定的替代方案由 `doc7 doctor` 报告。HTML、SVG、EPUB、EML、MHTML/MHT、MSG 和 IPYNB 渲染需要 Chrome、Chromium 或 Edge。Windows 发布压缩包包含拖放批处理文件。
EML、MHTML/MHT 和 Outlook MSG 在本地解析;不需要 Microsoft Outlook。
原生文本和数据格式在本地转换,不需要 VLM。视觉格式,包括作为页面渲染的电子邮件和 Jupyter notebooks,使用配置的 OpenAI 兼容多模态 endpoint。
## 专为 AI 打造的输出
每次运行都会将合并的 Markdown 以及页面级 Markdown、渲染的页面图像、元数据和清单保存在一起。这使得结果非常适用于:
- RAG 摄取和语义搜索;
- agent 知识库;
- 研究和文档分析;
- 视觉报告和截图的可搜索归档;
- 需要页面级出处的可审计 pipeline。
当只需要 Markdown 和元数据时,请使用 `--keep-images=false`。渲染的图像将从完成的输出中移除,并且相同的缓存仍然适用于后续运行。
下载远程文件受大小和超时限制。ZIP 压缩包在解压具有针对目录遍历、软链接、文件数量和解压大小的保护措施。视觉模型的输出在写入之前会进行规范化处理:不可验证的图像和链接目标将被移除,但其可见标签会保留。API key 保持可选,绝不会写入清单。
## 安全性
`doc7` 使用当前用户的权限运行本地渲染器,如 LibreOffice 和 Chrome。请将不受信任的 Office 文件、HTML、SVG、EML 或 MSG 消息、IPYNB notebooks 以及压缩包内容视为活动输入,并在隔离的帐户或容器中处理不受信任的工作负载。电子邮件和 notebook 的 HTML 已经过净化,远程资源和本地文件引用已被移除,嵌入的 BMP/TIFF 图像在渲染前已进行规范化处理。模型 API key 作为 bearer 凭据发送到配置的 endpoint;在处理敏感文件之前请验证 endpoint。HTTP 服务默认绑定到 localhost,对于非本地绑定地址需要 bearer token,限制上传大小,隔离每个作业目录,并仅在配置的保留期内保留已完成的作业。MCP 服务器以其宿主进程的权限运行;在共享或不受信任的环境中请限制公开的路径和 URL 访问。
## 许可协议
doc7 在 [MIT 许可协议](./LICENSE) 下发布。
运行 `doc7 --help` 以获取完整的 CLI 帮助信息。标签:EVTX分析, Markdown, OCR, RAG, 多模态模型, 数据预处理, 文档结构分析, 文档转换, 日志审计