
你手里有一份50页的行业报告老板说下班前给他要点总结。或者你下载了一篇20页的英文论文导师明天要讨论。再或者你有一份30页的合同想知道里面有没有坑。你当然可以硬啃。但如果你能让AI先读完然后你直接问它呢今天我们来部署两样东西一个负责把PDF拆碎读懂MinerU一个负责回答你的问题复用第10篇的Dify。两个一接就是你的私有PDF智能助手。为什么不用ChatGPT或者是其他软件直接传PDF能用但有几个问题第一文件大小限制。免费版ChatGPT传PDF有大小和页数限制大文件传不上去。第二隐私。合同、财务报告、客户资料你确定要传到其它的服务器他们拿你的数据训练模型怎么办其实也不用担心毕竟互联网没有秘密大家懂的都懂第三解析质量。ChatGPT对PDF里的表格、公式、图文混排的处理经常出错——表格变成乱码公式丢失图片被忽略。MinerU就是来解决第三个问题的。上海AI Lab开源的文档解析工具专门干一件事把PDF精准转成结构化的Markdown。表格是表格公式是公式图片是图片不乱。认识MinerUMinerU做的事情看着简单——PDF转Markdown——但背后的技术不简单。它要识别PDF的版面结构标题、正文、页眉页脚、分栏、提取表格合并单元格、跨页表格、识别公式LaTeX、分离图片和文字。转出来的Markdown长这样## 3.2 营收数据 | 季度 | 营收亿元 | 同比增长 | |------|-------------|---------| | Q1 | 12.5 | 15% | | Q2 | 15.8 | 26% | 营收增长主要受海外市场扩张驱动见图3。 表格还是表格公式还是公式。不是一坨乱七八糟的纯文本。部署MinerUMinerU是Python包用Docker封装最省心。注意MinerU原名Magic-PDFpip包名从magic-pdf改为了mineru。如果你用最新版把Dockerfile里的pip install magic-pdf[full]换成pip install mineru[full]对应的Python import路径也变了magic_pdf→mineru。本文代码基于magic-pdf版本编写两个版本的API略有差异部署前建议看一下官方文档确认。创建项目目录mkdir-p/home/mineru-pdfcd/home/mineru-pdfDockerfileFROM python:3.11-slim RUN apt-get update apt-get install -y \ libgl1 libglib2.0-0 libgomp1 \ rm -rf /var/lib/apt/lists/* RUN pip install magic-pdf[full] flask WORKDIR /app COPY app.py . EXPOSE 5002 CMD [python, app.py]app.pyfromflaskimportFlask,request,send_file,jsonifyimportosimporttempfilefrommagic_pdf.pipe.UNIPipeimportUNIPipefrommagic_pdf.rw.DiskReaderWriterimportDiskReaderWriterimportjson appFlask(__name__)app.route(/parse,methods[POST])defparse_pdf():iffilenotinrequest.files:returnjsonify({error:No file}),400filerequest.files[file]withtempfile.TemporaryDirectory()astmpdir:pdf_pathos.path.join(tmpdir,input.pdf)file.save(pdf_path)# 读取PDFwithopen(pdf_path,rb)asf:pdf_bytesf.read()# 解析image_writerDiskReaderWriter(tmpdir)pipeUNIPipe(pdf_bytes,{_pdf_type:,model_list:[]},image_writer)pipe.pipe_classify()pipe.pipe_analyze()pipe.pipe_parse()# 导出Markdowncontent_listpipe.pipe_mk_uni_format(tmpdir,drop_modenone)# 拼接Markdown文本md_contentforitemincontent_list:md_contentitem.get(text,)\n\nreturnjsonify({markdown:md_content,pages:len(content_list)})if__name____main__:app.run(host0.0.0.0,port5002)docker-compose.ymlservices:mineru:build:.ports:-5002:5002restart:alwaysvolumes:-mineru-models:/root/.cache# 缓存模型文件避免重启重新下载-/home/mineru-pdf/web:/app/web# 只挂载前端页面不覆盖app.pyvolumes:mineru-models:启动dockercompose up-d--build第一次启动时会自动下载模型文件大概1-2GB需要几分钟。构建镜像本身不含模型模型在首次调用时从网络拉取并缓存到容器里。跑起来后测试curl-XPOST-Ffiletest.pdfhttp://localhost:5002/parse返回JSON里面是解析后的Markdown文本。加个网页前端和第12篇一样的套路——写个HTML页面拖PDF进去显示解析结果。!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0titlePDF智能解析/titlestyle*{margin:0;padding:0;box-sizing:border-box;}body{font-family:system-ui,sans-serif;background:#f5f5f5;padding:20px;}.container{max-width:800px;margin:0 auto;}h1{text-align:center;margin-bottom:20px;}.upload-area{border:2px dashed #ccc;border-radius:12px;padding:40px;text-align:center;background:white;cursor:pointer;transition:border-color 0.3s;}.upload-area:hover{border-color:#2563eb;}input[typefile]{display:none;}.btn{display:block;width:100%;padding:12px;margin-top:16px;background:#2563eb;color:white;border:none;border-radius:8px;font-size:16px;cursor:pointer;}.btn:disabled{background:#999;}.loading{text-align:center;padding:20px;color:#666;}.result{margin-top:20px;background:white;border-radius:12px;padding:24px;white-space:pre-wrap;line-height:1.8;max-height:600px;overflow-y:auto;}.result h2{margin:16px 0 8px;}.actions{margin-top:16px;display:flex;gap:10px;}.actions a{flex:1;text-align:center;text-decoration:none;}/style/headbodydivclasscontainerh1PDF智能解析/h1divclassupload-areaonclickdocument.getElementById(fileInput).click()p点击或拖拽PDF文件到这里/pinputtypefileidfileInputaccept.pdf/divdivclassloadingidloadingstyledisplay:none;解析中PDF越大等待越久.../divdivclassresultidresultstyledisplay:none;/divdivclassactionsidactionsstyledisplay:none;aclassbtnidcopyBtnhref#复制全文/aaclassbtniddownloadBtnhref#downloadparsed.md下载Markdown/a/div/divscriptletmdContent;document.getElementById(fileInput).addEventListener(change,async(e){constfilee.target.files[0];if(!file)return;document.getElementById(loading).style.displayblock;document.getElementById(result).style.displaynone;document.getElementById(actions).style.displaynone;constformDatanewFormData();formData.append(file,file);try{constresawaitfetch(/api/parse,{method:POST,body:formData});constdataawaitres.json();mdContentdata.markdown;document.getElementById(result).textContentmdContent;document.getElementById(result).style.displayblock;document.getElementById(actions).style.displayflex;// 下载链接constblobnewBlob([mdContent],{type:text/markdown});document.getElementById(downloadBtn).hrefURL.createObjectURL(blob);}catch(err){alert(解析失败err.message);}finally{document.getElementById(loading).style.displaynone;}});document.getElementById(copyBtn).addEventListener(click,(e){e.preventDefault();navigator.clipboard.writeText(mdContent);e.target.textContent已复制!;setTimeout(()e.target.textContent复制全文,2000);});/script/body/html把这个HTML放到/home/mineru-pdf/web/index.html。Nginx反代nano/etc/nginx/conf.d/pdf.confserver { listen 80; server_name pdf.你的域名.com; client_max_body_size 100M; # PDF可能很大 location / { root /home/mineru-pdf/web; index index.html; } location /api/parse { proxy_pass http://127.0.0.1:5002/parse; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 300s; # 大PDF解析慢超时调长 } }nginx-tnginx-sreload certbot--nginx-dpdf.你的域名.com实测效果我传了三份PDF测试测试120页学术论文英文含公式和图表解析结果正文准确公式正确转成了LaTeX图表被提取为图片参考文献完整。之前用ChatGPT传同一篇PDF公式全丢了表格变成乱码。MinerU完胜。测试215页财报中文含大量表格解析结果所有表格都正确转成了Markdown表格格式合并单元格处理正确。文字部分无乱码。页眉页脚被正确过滤掉了。测试330页合同扫描版PDF解析结果部分丢失。MinerU对文字版PDF效果极好但纯扫描件图片格式需要先OCR。MinerU支持接入OCR需额外配置PaddleOCR但默认模式不处理扫描件。这是个限制用的时候注意。进阶接Dify做PDF智能问答光解析出来Markdown还不够——你想要的是问AI关于PDF的问题。这时候第10篇部署的Dify就派上用场了用MinerU把PDF解析成Markdown把Markdown上传到Dify知识库在Dify里创建一个聊天助手关联这个知识库直接问Dify“这份报告里Q2的营收是多少”——AI从解析内容里找到答案回复你流程就是PDF → MinerU解析 → Markdown → Dify知识库 → AI问答你可以把这个流程自动化——在MinerU的Flask API里加一个路由解析完自动调Dify API上传到知识库。用户上传PDF后直接就能在Dify里问问题了。限制和注意扫描件PDF需要额外配置OCR。如果你的PDF是扫描的不是文字版在MinerU里开启OCR模式需要安装PaddleOCR。大文件100页以上的PDF解析可能要1-2分钟确保Nginx超时设够长。内存MinerU处理大PDF时内存占用较高1-2GB2G内存的VPS可能吃力。解析精度复杂版面多栏、嵌套表格、脚注密集偶尔会出错。90%以上的常规PDF没问题特别复杂的排版需要人工检查。到这一步咱们的VPS上又多一个PDF解析工具了VPS已经不够用了。上传PDF拿到结构化Markdown再喂给Dify做问答。论文、合同、报告——都不用自己硬啃了。整套链路全是自己的MinerU解析、Dify问答、API中转站管模型、VPS跑服务。数据不出你的服务器。