【免费下载链接】doc7
Turn documents into AI-ready Markdown with visual understanding
doc7 是一款把 PDF、Office、扫描件、截图、图表和公式转成 AI-ready Markdown 的文档转换工具。它的公开包github.com/magicrew/doc7与 CLI 共用同一套转换引擎,你可以在自己的 Go 程序里通过Read、Convert、ConvertBatch三大 API 直接调用,并用ProgressFunc回调实时跟踪每一页的转换进度。本文带你快速上手这三个入口的用法、选项默认值、进度事件与类型化错误处理。
三大入口 API 总览:先选对函数
doc7 的三个公开入口对应三种输入场景,选错函数是最常见的初学者错误:
| API | 输入类型 | 典型场景 | 定义位置 |
|---|---|---|---|
Read | 本地文件、目录、HTTP(S) URL、ZIP | 输入形态不确定时的统一入口 | api_read.go |
Convert | 单个本地文档或图片目录 | 确定是单个本地文件 | api.go |
ConvertBatch | 本地目录(递归) | 批量转换整个文件夹 | api.go |
简单记忆:
- 用户可能传给你的是文件、链接还是压缩包?用
Read,它会在结果里告诉你最终是单文档(document)还是批量(batch); - 确定是单个本地文件,用
Convert,返回最精简的Summary; - 确定是一个文档目录,用
ConvertBatch,返回逐文件明细BatchItem。
一键上手:用 Read 转换单个文档
首先在项目里引入公开包(不需要导入任何internal包):
go get github.com/magicrew/doc7一个最小可用的示例,把本地 PDF 交给配置好的 OpenAI 兼容视觉模型:
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) } }三个要点:
- 用
doc7.DefaultReadOptions()起步,只覆盖需要修改的字段,其余保持与 CLIread命令一致的默认值(见 api_read.go); ReadResult的Document和Batch两个指针字段互斥,输入是单个文件时填Document,输入是目录或 ZIP 时填Batch,用result.Mode(document或batch)判断;result.Document.MergedMarkdown就是合并后的 Markdown 文件路径,可直接喂给 RAG 入库。
ReadOptions在基础选项之上多了一组批量与安全相关字段(见 api_read.go):
| 字段 | 含义 |
|---|---|
FileWorkers | 批处理时并行处理的文件数 |
ArchiveMaxFiles/ArchiveMaxBytes | ZIP 解压的文件数与体积上限,防止恶意压缩包 |
DownloadMaxBytes/DownloadTimeout | 远程 URL 下载的体积上限与超时 |
Convert:单文档转换与关键选项
Convert接收一个本地路径和Options,返回Summary(定义见 api_types.go)。Summary字段可以直接用于日志和可观测性:
| 字段 | 说明 |
|---|---|
MergedMarkdown/ManifestPath | 合并 Markdown 与 manifest 产物路径 |
PagesTotal/PagesSuccess/PagesFailed | 页面总数与成功、失败页数 |
PagesCached | 命中缓存的页数(配合Resume断点续转) |
GroundingWarnings | 文本层校验(Text Grounding)无法确认而保留首遍结果的页数 |
Options中与日常开发最相关的字段:
- 模型接入:
Provider、BaseURL、Model、APIKey、Timeout; - 页面控制:
Pages(1 起始的闭区间页码,如"3-5")、DPI(渲染分辨率)、Merge(是否合并为单文件); - 并发与重试:
Workers(页面并发)、RetryCount; - 恢复与缓存:
Resume(跳过已成功页,只补失败页)。
DefaultOptions()的默认值与 CLI 完全一致(见 api_defaults.go):
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) } }默认值一览:PromptName: auto、Merge: true、Workers: 5、RetryCount: 3、DPI: 220、KeepImages: true、MaxTokens: 8192、ContextFallbacks: 2、MinImageDimension: 720、Timeout: 120s。其中 context fallback 是指模型因上下文不足拒绝请求时,doc7 自动降低图片分辨率重试的机制,最多重试ContextFallbacks次,图片最长边最低降到MinImageDimension像素。
ConvertBatch:递归批量转换整个目录
ConvertBatch递归转换inputDir下所有受支持的文档,返回BatchSummary(见 api_types.go):
| 字段 | 说明 |
|---|---|
FilesTotal/FilesDone/FilesFailed | 文件级统计 |
DryRun | 为true时只扫描不转换,适合先估价 |
StartedAt/FinishedAt | 批次起止时间 |
Items | 每个文档一条BatchItem,含各自的Status、页面统计和Error |
func main() { options := doc7.DefaultBatchOptions() options.OutputRoot = "out" options.BaseURL = "http://127.0.0.1:1234/v1" options.Model = "qwen3.5-4b" options.FileWorkers = 2 summary, err := doc7.ConvertBatch(context.Background(), "inbox", options) if err != nil { panic(err) } for _, item := range summary.Items { if item.Error != nil { log.Printf("file %d failed: %s", item.Index, item.Error.Message) } } }批量场景的两个实用技巧:
- 先跑一次
DryRun: true得到FilesTotal,再按文件数决定FileWorkers; - 批处理中断后用
Resume: true重跑,已成功的文档与页面会自动跳过。
进度回调详解:ProgressFunc 与 ProgressEvent
三个入口都支持同一个进度回调类型ProgressFunc(见 api_types.go),把它赋值给Options.Progress或BatchOptions.Progress即可:
options.Progress = func(event doc7.ProgressEvent) { switch event.Stage { case doc7.ProgressPageCompleted: fmt.Printf("page %d/%d %s\n", event.PagesCompleted, event.PagesTotal, event.Status) case doc7.ProgressFileCompleted: fmt.Printf("file %d/%d done\n", event.Index, event.Total) } }六种进度阶段
阶段常量定义在 api_types.go:
| 阶段 | 触发时机 | 常用字段 |
|---|---|---|
ProgressRenderStarted/ProgressRenderCompleted/ProgressRenderFailed | 文档渲染为页面图像的起止 | Input、OutputDir、Error |
ProgressPageCompleted | 单页转换完成 | Page、PagesCompleted、PagesTotal、Cached、Duration、Status |
ProgressFileStarted/ProgressFileCompleted | 批处理中单个文件开始/结束 | Index、Total、PagesSuccess、PagesFailed |
ProgressEvent的关键字段(结构定义见 api_types.go):
Page/PagesTotal/PagesCompleted:单页进度三件套,做进度条用它们就够了;SourcePagesTotal:启用Pages页面选择时,与选中页数区分的源文档总页数;Cached:该页是否命中缓存,配合Resume续转时有用;Duration:该页或该文件的处理耗时;Error *PageError:非空表示失败,Kind是稳定的机器可读错误分类;Index/Total:仅批处理文件事件有值。
⚠️ 注意:启用并发(Workers > 1)时,页面和文件事件可能并行到达,回调内不要假设事件严格有序,聚合计数请使用原子操作或加锁。
回调的底层实现会把内部引擎的extract.ProgressEvent和batch.ProgressEvent适配为统一类型,代码见 api_progress.go。
类型化错误处理:用 errors.As 精准重试
转换失败时,doc7 返回统一的*doc7.Error,带稳定的错误分类和Retryable标志(见 api_error.go):
| ErrorKind | 含义 | 典型应对 |
|---|---|---|
ConfigError | 配置缺失或非法 | 检查 BaseURL/Model |
AuthError | API Key 无效 | 检查凭据 |
RateLimitError/TimeoutError/ServerError | 限流、超时、服务端错误 | Retryable为真,指数退避重试 |
RenderError | 本地渲染依赖失败(缺 LibreOffice 等) | 运行doc7 doctor检查 |
PartialError | 部分页成功部分失败 | 用Resume补转失败页 |
result, err := doc7.Read(ctx, "report.pdf", options) if err != nil { var appErr *doc7.Error if errors.As(err, &appErr) { switch appErr.Kind { case doc7.RateLimitError: // 退避后重试 case doc7.AuthError: // 提示用户检查 API Key } } }实践建议清单
- 默认值起步:始终从
DefaultReadOptions()/DefaultOptions()/DefaultBatchOptions()派生,只改必要字段,避免漏配; - 统一走 Read:对外暴露的转换接口优先用
Read,让用户可以传文件、目录、URL 或 ZIP,无需你写输入分发逻辑; - 上下文取消:把
context.Context贯穿到底,长任务可被上层优雅取消; - 断点续转:失败后开启
Resume: true重跑同一OutputDir,成功页走缓存,只补失败页; - 进度做 UI:
ProgressEvent.PagesCompleted / PagesTotal驱动进度条,Cached字段区分新转与命中缓存; - 错误分类驱动重试:只根据
ErrorKind和Retryable做重试,不要解析错误文案。
相关资料
- 公开 API 定义:api.go、api_read.go、api_types.go、api_error.go
- 默认值与 CLI 对齐:api_defaults.go
- 进度事件适配:api_progress.go
- 内部编排实现:internal/read/read.go、internal/extract/extractor.go、internal/batch/batch.go
- 中文 README 中的 Go 嵌入章节:README.zh-CN.md
- 转换质量基准测试:benchmarks/visual-report/README.md
【免费下载链接】doc7
Turn documents into AI-ready Markdown with visual understanding
相关推荐
如何高效使用zTree_v3:从API方法到回调函数的完全指南
如何高效使用zTree_v3:从API方法到回调函数的完全指南 zTree_v3是一款功能强大的jQuery树形插件,它提供了丰富的API方法和灵活的回调函数,
前端UI库/组件Ultra-Pull-To-Refresh API完全参考:接口参数与回调机制详解
Ultra Pull To Refresh API完全参考:接口参数与回调机制详解 Ultra Pull To Refresh是一款功能强大的Android下拉
移动开发UI组件LlamaIndex Bedrock 嵌入集成详解:BedrockEmbedding 类 API 参考与源码级实战
LlamaIndex Bedrock 嵌入集成详解:BedrockEmbedding 类 API 参考与源码级实战 本文基于 LlamaIndex 仓库中 do
人工智能RAG大模型
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考