--- name: vision-model-batch-extraction description: "使用本地视觉模型从PDF批量提取结构化数据(单词+释义),生成Word文档。适用于标准文本提取工具因表格排版失败时的场景。" author: agent --- # 视觉模型批量结构化提取 & 通用 Word 文档生成 涵盖两大场景: 1. **PDF批量提取**(主场景):将双栏排版PDF逐页转图后,用本地Ollama视觉模型批量提取结构化数据,生成分组Word文档。 2. **通用Word生成**(辅助场景):从零创建Word文档(自我介绍、简历、报告等),无需PDF源,直接通过python-docx脚本生成。 ## 适用场景 - PDF是双栏表格排版(左栏单词、右栏释义) - 标准文本提取工具(pdfminer、pymupdf.get_text)因排版复杂提取不全 - 需要保持条目顺序和分组(如每天60词) ## 完整流程 ### Step 1:PDF转图 ```bash pip install pymupdf python -c " import fitz, os doc = fitz.open('book.pdf') os.makedirs('img', exist_ok=True) for i in range(len(doc)): doc[i].get_pixmap(dpi=150).save(f'img/p{i+1}.png') doc.close() " ``` ### Step 2:Ollama视觉API调用 ```python with open('page.png', 'rb') as f: img_b64 = base64.b64encode(f.read()).decode() data = json.dumps({ 'model': 'huihui_ai/qwen2.5-vl-abliterated:7b', 'messages': [{ 'role': 'user', 'content': '列出这一页所有单词和中文释义,格式:单词 - 中文释义', 'images': [img_b64] # 必须list,即使只有一张 }], 'stream': False }).encode() # 调用 http://localhost:11434/api/chat ``` ### Step 3:解析输出 ```python import re for line in text.split('\n'): clean = re.sub(r'^\d+[\.\s]+', '', line.strip()) if ' - ' in clean: word, meaning = clean.split(' - ', 1) ``` ### Step 4:生成Word文档(python-docx) - 每60词一组,标`═══ Day N ═══` - 格式:**word加粗** + `释义正常` - 中文字体:`rPr.get_or_add_rFonts().set(qn('w:eastAsia'), 'SimSun')` - 每10页自动保存一次 ### Step 5:格式修复 - `- `前缀修复:去掉前缀后重设run内容 - 释义重复修复:检查run[0]是否包含run[1]内容 ### Step 6:质量验证 让小Q逐页核对(只输出单词,更快),对比文档。 ## 性能 - CPU推理(Ryzen 9 9955HX):12-15秒/页 - 254页总计:约50分钟 ## 通用 Word 文档生成(从零创建) 除 PDF 批量提取外,python-docx 也可用于从零生成 Word 文档。适用于自我介绍、简历、报告等场景。 ### 前置条件 ```bash pip install python-docx python -c "from docx import Document; print('OK')" ``` ### 典型流程 ```python from docx import Document doc = Document() doc.add_heading('标题', level=0) p = doc.add_paragraph() p.add_run('标签:').bold = True p.add_run('内容') doc.add_paragraph('列表项', style='List Bullet') doc.save(r'C:\Users\32295\Desktop\输出.docx') ``` ### 常见陷阱 | 陷阱 | 解决 | |------|------| | `from python-docx import` 报错 | 正确:`from docx import Document`(无连字符) | | 字符串内换行 SyntaxError | 用多个 `add_paragraph` 或三引号 | | 反斜杠路径 UnicodeEscapeError | 用 raw string `r'C:\...'` 或正斜杠 | | get 到 shell 执行 | 脚本用 `write_file` 保存后 `python` 执行,不要用 `execute_code` | ### 交付方式 1. 脚本写桌面 → `write_file(path='~/Desktop/gen_xxx.py')` 2. 终端执行 → `python ~/Desktop/gen_xxx.py` 3. 返回用户 → `MEDIA:~/Desktop/输出.docx` ## 关联参考 - `references/quick-vision-inspection.md` — 快速单张截图分析模式(当主模型不支持 vision 时用本地小模型实时查看)