用Python + FastAPI搭建PDF翻译微服务:从文件上传到结果回调(完整代码)
在业务系统里集成 PDF 翻译能力最常见的需求不是翻译一句话而是上传一个 PDF异步拿到翻译后的 PDF。这篇文章用 Python FastAPI 搭建一个最小可用的 PDF 翻译微服务覆盖文件上传、任务队列、翻译调用、结果回调四个核心环节。一、系统架构整个服务分为三层API 层FastAPI 提供/upload和/status/{task_id}接口。任务层后台线程池处理翻译任务避免阻塞请求。存储层本地目录保存上传文件和翻译结果。Client → FastAPI → Task Queue → Translator → Callback/Status API为了简化演示翻译环节调用一个模拟的翻译接口。生产环境中可以替换为真实的 PDF 翻译 API 或本地模型。二、环境准备Python 3.10FastAPI Uvicornaiofiles异步文件操作requests调用翻译 APIpipinstallfastapi uvicorn aiofiles requests python-multipart三、项目结构pdf_translate_service/ ├── main.py # FastAPI 主服务 ├── worker.py # 后台翻译任务 ├── storage/ # 上传文件和结果存储 └── callbacks/ # 回调日志四、核心代码实现1. 任务模型与内存状态# main.pyimportosimportuuidimportshutilfromdatetimeimportdatetimefromtypingimportOptionalfromfastapiimportFastAPI,File,UploadFile,BackgroundTasksfrompydanticimportBaseModelimportworker appFastAPI(titlePDF Translation Microservice)UPLOAD_DIRstorage/uploadsRESULT_DIRstorage/resultsos.makedirs(UPLOAD_DIR,exist_okTrue)os.makedirs(RESULT_DIR,exist_okTrue)# 内存中的任务状态生产环境建议用 Redistasks{}classTaskStatus(BaseModel):task_id:strstatus:str# pending / processing / completed / failedoriginal:Optional[str]Noneresult:Optional[str]Nonemessage:Optional[str]Nonecreated_at:strupdated_at:str2. 文件上传接口app.post(/upload,response_modelTaskStatus)asyncdefupload_pdf(background_tasks:BackgroundTasks,file:UploadFileFile(...),callback_url:Optional[str]None):ifnotfile.filename.endswith(.pdf):return{error:Only PDF files are supported}task_idstr(uuid.uuid4())upload_pathos.path.join(UPLOAD_DIR,f{task_id}.pdf)withopen(upload_path,wb)asf:shutil.copyfileobj(file.file,f)nowdatetime.utcnow().isoformat()tasks[task_id]{task_id:task_id,status:pending,original:upload_path,result:None,message:File uploaded, waiting for processing,created_at:now,updated_at:now,}background_tasks.add_task(worker.process_translation,task_id,upload_path,callback_url)returnTaskStatus(**tasks[task_id])3. 状态查询接口app.get(/status/{task_id},response_modelTaskStatus)asyncdefget_status(task_id:str):iftask_idnotintasks:return{error:Task not found}returnTaskStatus(**tasks[task_id])4. 后台翻译任务 worker.py# worker.pyimportosimporttimeimportrequestsfromdatetimeimportdatetime RESULT_DIRstorage/resultsdefprocess_translation(task_id:str,file_path:str,callback_url:strNone):模拟异步翻译任务frommainimporttasks tasks[task_id][status]processingtasks[task_id][message]Translating PDF...tasks[task_id][updated_at]datetime.utcnow().isoformat()try:# 模拟翻译耗时time.sleep(3)# 生产环境替换为真实翻译 API# response requests.post(# https://api.pdftranslator.org/v1/translate,# files{file: open(file_path, rb)},# data{target_lang: zh}# )# response.raise_for_status()result_pathos.path.join(RESULT_DIR,f{task_id}_translated.pdf)# 这里用原文件占位真实场景保存翻译后的 PDFwithopen(file_path,rb)assrc,open(result_path,wb)asdst:dst.write(src.read())tasks[task_id][status]completedtasks[task_id][result]result_path tasks[task_id][message]Translation completedifcallback_url:send_callback(callback_url,tasks[task_id])exceptExceptionase:tasks[task_id][status]failedtasks[task_id][message]str(e)tasks[task_id][updated_at]datetime.utcnow().isoformat()defsend_callback(url:str,payload:dict):try:requests.post(url,jsonpayload,timeout10)exceptrequests.RequestExceptionase:print(fCallback failed:{e})五、运行与测试启动服务uvicorn main:app--host0.0.0.0--port8000--reload上传 PDFcurl-XPOSThttp://localhost:8000/upload\-Ffilesample.pdf\-Fcallback_urlhttp://your-callback-server.com/notify查询状态curlhttp://localhost:8000/status/{task_id}六、生产环境建议任务队列内存tasks仅适合演示生产环境用 Celery Redis 或 RQ。文件存储上传到对象存储S3/OSS避免本地磁盘容量限制。并发控制翻译 API 通常有 QPS 限制用 Semaphore 或令牌桶限流。错误重试网络抖动时自动重试记录失败任务便于人工介入。回调可靠性回调失败时持久化到数据库支持手动补偿。七、总结这套 FastAPI 微服务的核心思路是把翻译一个 PDF拆成接收文件 → 异步处理 → 查询/回调结果三个标准化步骤。接口简单、易于集成也便于后续替换不同的翻译后端。如果你正在把 PDF 翻译能力接入自己的业务系统这个骨架应该能帮你快速跑通第一个版本。标签FastAPI、Python、PDF翻译、微服务、AI翻译

相关新闻

终极MacBook电池保护指南:Charge Limiter完全使用教程

终极MacBook电池保护指南:Charge Limiter完全使用教程

终极MacBook电池保护指南:Charge Limiter完全使用教程 【免费下载链接】charge-limiter macOS app to set battery charge limit for Intel MacBooks 项目地址: https://gitcode.com/gh_mirrors/ch/charge-limiter MacBook电池保护是每个苹果用户都应该关注的…

2026/10/17 22:52:27 阅读更多 →
三步完成STL到STEP转换:让3D打印文件变身高精度CAD模型

三步完成STL到STEP转换:让3D打印文件变身高精度CAD模型

三步完成STL到STEP转换:让3D打印文件变身高精度CAD模型 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾经遇到过这样的情况:在3D打印机上完美工作的STL文件&…

2026/10/16 17:09:59 阅读更多 →
-40℃冻不僵,80℃烤不趴:一台国产高低温电机,凭什么拿下头部车企的10万次踏板耐久极限测试?

-40℃冻不僵,80℃烤不趴:一台国产高低温电机,凭什么拿下头部车企的10万次踏板耐久极限测试?

一、一个踏板,要经历怎样的“酷刑”才能装车?汽车后围踏板,就是车尾那个供人踩着上下车、装卸行李的“台阶”。看起来不起眼,却是整车安全链路里不容有失的一环。主机厂的验证逻辑很朴素:既然用户可能在任何环境里踩上…

2026/10/17 10:50:41 阅读更多 →

最新新闻

PowerPoint内嵌JS运行器:零基础JavaScript教学课件实战

PowerPoint内嵌JS运行器:零基础JavaScript教学课件实战

简介:本资源是一份面向零编程基础学习者的《JavaScript基础教程》课件PPT,专为Web前端入门设计,解决初学者对JavaScript核心语法、运行机制与实践应用的认知断层问题。课件系统覆盖50个关键知识点,包括变量声明(var/le…

2026/10/17 22:52:48 阅读更多 →
Vue3+Web3.js区块链DApp实战:从架构设计到合约部署

Vue3+Web3.js区块链DApp实战:从架构设计到合约部署

简介:《区块链应用开发:Vue3Webjs的DApp实战》是一份聚焦Vue3与Web3.js的DApp开发实战教程,面向具有一定前端基础、希望切入区块链领域的开发者,系统解决从以太坊智能合约到去中心化应用集成的核心问题。全书共94页,单…

2026/10/17 22:52:48 阅读更多 →
H5页面实现扫码功能:Web端二维码识别实战指南

H5页面实现扫码功能:Web端二维码识别实战指南

1. 项目概述:为什么H5页面扫码不再是“前端玄学”,而是可落地的标配能力“h5页面实现扫码功能”这八个字,过去三年里我至少在十多个项目需求评审会上听到过——有某高校实验室的校园服务小程序跳转页,有某快消品牌线下活动的互动H…

2026/10/17 22:52:48 阅读更多 →
Factsage热力学计算入门:相图、平衡模块与数据库避坑指南

Factsage热力学计算入门:相图、平衡模块与数据库避坑指南

简介:这是一份聚焦Factsage软件实际应用的专题培训课件,适合材料科学、冶金工程、耐火材料等领域的研究人员、工程师及高校师生。课件共1个PPT文件,约2.59MB,虽体量不大,但内容系统完整,围绕反应热力学计算…

2026/10/17 22:52:48 阅读更多 →
pyKT工程落地实战:从Excel数据到线上API的完整链路

pyKT工程落地实战:从Excel数据到线上API的完整链路

1. 这不是又一篇“复现教程”,而是知识追踪领域一次真实的工程化落地手记“知识追踪14:知识追踪标准复现pyKT介绍(3)”——看到这个标题,你大概率会下意识划走。太像学术流水线上的编号文档了:第14期、第3篇…

2026/10/17 22:52:48 阅读更多 →
Ubuntu源码编译OpenCV全功能指南:虚拟环境隔离与GTK/FFMPEG配置

Ubuntu源码编译OpenCV全功能指南:虚拟环境隔离与GTK/FFMPEG配置

1. 为什么OpenCV在Ubuntu上总让人抓狂搞计算机视觉的,没被OpenCV的环境折腾过,那基本算是没入行。我见过太多人,代码逻辑写得漂漂亮亮,结果卡在cv2.imshow()弹不出窗口,或者import cv2直接报ImportError,一…

2026/10/17 22:51:47 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →