把 Microsoft MarkItDown 做成本地文档转换 API:PDF/Office 转 Markdown 后,用 cpolar 接收远程上传
把 Microsoft MarkItDown 做成本地文档转换 APIPDF/Office 转 Markdown 后用 cpolar 接收远程上传同事丢过来一份 PDF、Word 或 PPT想快速变成 Markdown如果每次都手动打开工具、另存、复制流程很碎。更麻烦的是远程同事或自动化流程不在你的电脑旁边没法直接调用你本地的转换环境。这篇文章做一个实用方案把 Microsoft 开源的MarkItDown封装成本地 FastAPI 服务提供一个/convert文件上传接口本机完成 PDF/Office 等文件到 Markdown 的转换需要临时给远程同事或工作流使用时再用 cpolar 暴露本地8000端口。适合这些场景远程同事临时上传 PDF/Word拿回 Markdown 文本自动化脚本把合同、产品文档、会议纪要转成 Markdown本地保留转换环境不把服务长期部署到公网给后续知识库整理、文档清洗、内容归档提供统一入口。说明本文只做“文档转 Markdown API”不延伸到知识库入库也不做模型服务部署。1. 整体流程流程很简单远程用户 / 自动化脚本 │ │ 上传 PDF / DOCX / PPTX / XLSX ▼ cpolar 公网临时地址 │ ▼ 本地 FastAPI 服务 :8000 │ ▼ Microsoft MarkItDown │ ▼ 返回 Markdown 文本为什么要加 cpolar因为转换服务跑在本地电脑上默认只能本机访问。cpolar 可以把本地8000端口临时映射成一个公网 HTTPS 地址远程同事不用 VPN、不用进内网就能通过接口上传文件。但注意这类服务处理的往往是文档原文通常包含敏感信息。公网暴露必须加鉴权并且建议只临时开放。2. 准备 Python 环境MarkItDown 要求 Python 3.10 或更高版本。先创建项目目录mkdir markitdown-api cd markitdown-api创建并激活虚拟环境python3 -m venv .venv source .venv/bin/activateWindows PowerShell 可以用python -m venv .venv .\.venv\Scripts\Activate.ps1安装依赖pip install -U pip pip install markitdown[all] fastapi uvicorn python-multipart如果只想先支持常见 Office 和 PDF也可以按需安装 MarkItDown 的可选依赖例如pip install markitdown[pdf,docx,pptx,xlsx] fastapi uvicorn python-multipart本文为了减少格式缺依赖导致的转换失败示例使用pip install markitdown[all] fastapi uvicorn python-multipart3. 先确认 MarkItDown 本身可用写 API 之前建议先用命令行确认 MarkItDown 能正常转换文件。准备一个测试文件比如test.docx test.pdf test.pptx执行markitdown test.docx -o output.md或者把结果直接输出到终端markitdown test.pdf如果这一步能得到 Markdown 内容再继续封装 API。这样排查问题会更简单命令行都失败优先检查文件格式、Python 版本、依赖安装命令行成功但 API 失败再检查上传文件保存、路径、权限等问题。4. 编写 FastAPI 转换服务在项目根目录创建main.pyfrom pathlib import Path from tempfile import TemporaryDirectory from uuid import uuid4 from fastapi import FastAPI, File, Header, HTTPException, UploadFile from fastapi.responses import PlainTextResponse from markitdown import MarkItDown app FastAPI(titleLocal MarkItDown API) # 简单 API Token。生产环境建议改成环境变量或更完整的鉴权方案。 API_TOKEN change-this-token # 单文件大小限制20MB可按机器性能调整。 MAX_FILE_SIZE 20 * 1024 * 1024 # 允许的扩展名。按需增减避免把未知文件直接丢给转换器。 ALLOWED_SUFFIXES { .pdf, .docx, .pptx, .xlsx, .xls, .csv, .json, .xml, .html, .htm, .txt, .md, } # 官方 Python APIMarkItDown(enable_pluginsFalse).convert(path).text_content md_converter MarkItDown(enable_pluginsFalse) def check_token(x_api_token: str | None) - None: if x_api_token ! API_TOKEN: raise HTTPException(status_code401, detailInvalid API token) app.get(/health) def health(): return {status: ok} app.post(/convert, response_classPlainTextResponse) async def convert_file( file: UploadFile File(...), x_api_token: str | None Header(defaultNone), ): check_token(x_api_token) original_name file.filename or upload.bin suffix Path(original_name).suffix.lower() if suffix not in ALLOWED_SUFFIXES: raise HTTPException( status_code400, detailfUnsupported file type: {suffix or no suffix}, ) content await file.read() if len(content) MAX_FILE_SIZE: raise HTTPException(status_code413, detailFile too large) with TemporaryDirectory() as tmpdir: safe_name f{uuid4().hex}{suffix} input_path Path(tmpdir) / safe_name input_path.write_bytes(content) try: result md_converter.convert(str(input_path)) except Exception as exc: raise HTTPException( status_code500, detailfConvert failed: {type(exc).__name__}: {exc}, ) from exc return result.text_content这里用了 MarkItDown README 中给出的 Python APIfrom markitdown import MarkItDown md MarkItDown(enable_pluginsFalse) result![把 Microsoft MarkItDown 做成本地文档转换 APIPDF/Office 转 Markdown 后用 cpolar 接收远程上传 - 发布前检查图](https://i-blog.csdnimg.cn/img_convert/img/20260701-backfill/topic-20260604-afternoon-002/topic-20260604-afternoon-002-safety-check.png) md.convert(test.xlsx) print(result.text_content)所以在 FastAPI 中我们先把上传文件保存到临时目录再调用result md_converter.convert(str(input_path)) markdown result.text_content这样比直接猜测内部方法更稳也方便和命令行行为对齐。5. 启动本地 API 服务启动服务uvicorn main:app --host 0.0.0.0 --port 8000看到类似输出即可Uvicorn running on http://0.0.0.0:8000先检查健康接口curl http://127.0.0.1:8000/health预期返回{status:ok}6. 本地测试 /convert 接口准备一个测试文档例如demo.docx然后执行curl -X POST http://127.0.0.1:8000/convert \ -H X-API-Token: change-this-token \ -F filedemo.docx \ -o demo.md查看转换结果head -40 demo.md如果想直接在终端查看curl -X POST http://127.0.0.1:8000/convert \ -H X-API-Token: change-this-token \ -F filedemo.pdf测试错误 Tokencurl -i -X POST http://127.0.0.1:8000/convert \ -H X-API-Token: wrong-token \ -F filedemo.docx应该返回401。测试不支持的文件类型curl -i -X POST http://127.0.0.1:8000/convert \ -H X-API-Token: change-this-token \ -F filedemo.exe应该返回400。7. 用 cpolar 暴露本地 8000 端口本地 API 确认没问题后再用 cpolar 暴露cpolar http 8000启动后cpolar 会生成一个公网访问地址形式类似https://xxxx.cpolar.top假设你的公网地址是https://abcd-1234.cpolar.top远程同事就可以这样调用curl -X POST https://abcd-1234.cpolar.top/convert \ -H X-API-Token: change-this-token \ -F filedemo.docx \ -o demo.md自动化流程也可以直接接入这个接口。例如 Python 脚本import requests url https://abcd-1234.cpolar.top/convert headers {X-API-Token: change-this-token} with open(demo.pdf, rb) as f: files {file: (demo.pdf, f, application/pdf)} resp requests.post(url, headersheaders, filesfiles, timeout120) resp.raise_for_status() with open(demo.md, w, encodingutf-8) as f: f.write(resp.text)这样就能把“本地文档转换能力”临时变成一个远程可调用 API。8. 推荐的项目结构最终目录可以这样放markitdown-api/ ├── .venv/ ├── main.py ├── demo.docx └── demo.md如果后续要长期使用建议再补一个requirements.txtpip freeze requirements.txt以后在新机器上恢复环境python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt9. 常见问题处理9.1 上传接口提示 422FastAPI 文件上传依赖python-multipart。确认已经安装pip install python-multipart接口参数要用-F filedemo.docx不要把文件当 JSON 传。9.2 转换出来的 Markdown 内容不完整MarkItDown 更适合把文档转成给 LLM、文本分析、自动化流程使用的 Markdown不是高保真排版还原工具。如果源文件里有复杂排版、扫描图片、嵌入对象转换结果需要人工检查。建议先用简单 DOCX/PDF 做通路测试对扫描 PDF确认 OCR 相关依赖和识别效果对重要文件保留原文件和转换后的 Markdown 供人工核对。9.3 cpolar 地址能打开但接口返回 401检查请求头是否带了-H X-API-Token: change-this-token也建议把main.py里的 Token 改成更复杂的值例如API_TOKEN mdit-2026-your-random-token更进一步可以改成从环境变量读取import os API_TOKEN os.environ.get(MARKITDOWN_API_TOKEN, change-this-token)启动前设置export MARKITDOWN_API_TOKENmdit-2026-your-random-token uvicorn main:app --host 0.0.0.0 --port 80009.4 大文件转换很慢或失败本文示例限制单文件 20MBMAX_FILE_SIZE 20 * 1024 * 1024如果机器性能有限不建议直接放开限制。文档转换会占 CPU、内存和磁盘临时空间。尤其是大型 PDF、PPT、Excel转换耗时会明显增加。更稳的做法限制文件大小限制允许的文件类型只在需要时打开 cpolar转换完成后关闭服务或换新 Token。10. 安全建议不要把它当成无门槛公网服务这个方案的重点是“临时暴露本地能力”不是把文档转换接口长期裸奔在公网。至少要做到必须加鉴权示例里用了X-API-Token不要删除。只临时开放 cpolar用完就停止cpolar http 8000不要长期挂着。限制文件大小和类型不要允许任意文件上传。谨慎处理敏感文档合同、客户资料、财务文件、内部方案不建议随便通过公网接口传输。不要使用高权限目录处理上传文件示例使用临时目录并且文件名用 UUID 重写避免路径穿越和覆盖本地文件。注意 MarkItDown 的 I/O 权限MarkItDown 官方也提醒转换器会以当前进程权限访问资源。处理不可信输入时应该限制输入来源、文件类型和运行权限。11. 小结这套方案把文档转换拆成了三个清晰步骤MarkItDown 负责转换 FastAPI 负责上传接口 cpolar 负责临时公网访问本地使用时访问http://127.0.0.1:8000/convert远程临时使用时访问https://你的cpolar地址/convert对团队协作来说它的价值不是“又搭了一个服务”而是把原本手动、零散的文档处理动作变成一个可复用的 API远程同事、脚本、自动化流程都能按同一套方式上传文件并拿回 Markdown。如果只是临时协作开 FastAPI cpolar 就够了如果要长期使用再考虑队列、日志、权限系统、对象存储和更完整的审计能力。

相关新闻

电话录音秒变文字稿:20年CTO亲授AI语音转文字避坑指南

电话录音秒变文字稿:20年CTO亲授AI语音转文字避坑指南

更多请点击: https://kaifayun.com 第一章:电话录音秒变文字稿:20年CTO亲授AI语音转文字避坑指南 电话录音转文字看似“点一下就完成”,但真实产线中,92%的失败案例源于三个隐形陷阱:音频信噪比不足、说话…

2026/7/19 16:11:18阅读更多 →
VS配置claude code

VS配置claude code

一、国内基本是使用API key代理 / 中转地址的方式访问,必备工具 API key令牌:sk开头代理地址cc Switch软件(建议使用) 二、VS中安装claude code插件三、国内基本是使用API key代理 / 中转地址的方式访问,所以VS需要关闭…

2026/7/19 16:11:18阅读更多 →
Redis集群的两种访问方式

Redis集群的两种访问方式

Redis集群的访问方式,核心分为两大类:直接连接集群节点和通过集群代理访问。两者的本质区别在于「客户端是否需要感知集群拓扑」,下面讲透两种方式的原理、优缺点和适用场景。 一、方式1:直接连接集群节点(客户端直连&…

2026/7/19 16:09:18阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →