完成差旅发票录入流程
This commit is contained in:
21
scripts/README.md
Normal file
21
scripts/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
last_reviewed: 2026-06-11
|
||||
---
|
||||
|
||||
# scripts — 测试脚本目录
|
||||
|
||||
存放用于测试各模块功能的独立脚本,可直接运行。
|
||||
|
||||
## 脚本清单
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `test_multimodal.py` | 测试 PDF 多模态提取完整链路(PDF 渲染 + LLM 提取) |
|
||||
| `test_travel_info.py` | 测试差旅信息提取函数(数据从 `data/.invoice_cache` 缓存加载) |
|
||||
|
||||
## 运行方式
|
||||
|
||||
```bash
|
||||
uv run python scripts/test_multimodal.py
|
||||
uv run python scripts/test_travel_info.py
|
||||
```
|
||||
81
scripts/test_multimodal.py
Normal file
81
scripts/test_multimodal.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""测试 PDF 多模态提取完整链路
|
||||
|
||||
用法:
|
||||
python scripts/test_multimodal.py
|
||||
"""
|
||||
|
||||
import io
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Windows 终端强制 UTF-8
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
sys.path.insert(0, str(ROOT)) # noqa: E402
|
||||
|
||||
from src.doc.llm_extractor import extract_document # noqa: E402
|
||||
from src.doc.pdf import render_pdf_to_images # noqa: E402
|
||||
|
||||
|
||||
def test_render() -> None:
|
||||
"""测试 PDF 渲染"""
|
||||
pdf_path = ROOT / "事前申请单.pdf"
|
||||
if not pdf_path.exists():
|
||||
print(f"跳过: {pdf_path.name} 不存在")
|
||||
return
|
||||
|
||||
print("=" * 60)
|
||||
print("测试 PDF 渲染")
|
||||
print("=" * 60)
|
||||
try:
|
||||
images = render_pdf_to_images(pdf_path, dpi=150)
|
||||
if images:
|
||||
print(f"成功渲染 {len(images)} 页")
|
||||
for i, img_b64 in enumerate(images):
|
||||
print(f" 第 {i + 1} 页: base64 长度 {len(img_b64)} 字符")
|
||||
else:
|
||||
print("渲染返回空列表!")
|
||||
except ImportError as e:
|
||||
print(f"导入失败: {e}")
|
||||
except Exception as e:
|
||||
print(f"渲染异常: {e}")
|
||||
|
||||
|
||||
def test_multimodal_extract() -> None:
|
||||
"""测试完整的多模态提取链路"""
|
||||
pdf_path = ROOT / "事前申请单.pdf"
|
||||
if not pdf_path.exists():
|
||||
print(f"跳过: {pdf_path.name} 不存在")
|
||||
return
|
||||
|
||||
print()
|
||||
print("=" * 60)
|
||||
print("测试多模态提取")
|
||||
print("=" * 60)
|
||||
try:
|
||||
result = extract_document(pdf_path)
|
||||
if result:
|
||||
print("提取成功:")
|
||||
import json
|
||||
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2))
|
||||
else:
|
||||
print("提取返回空字典!")
|
||||
except Exception as e:
|
||||
print(f"提取异常: {e}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
test_render()
|
||||
test_multimodal_extract()
|
||||
print()
|
||||
print("测试完成!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
54
scripts/test_travel_info.py
Normal file
54
scripts/test_travel_info.py
Normal file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env python3
|
||||
"""直接测试 extract_travel_info 函数
|
||||
|
||||
所有数据从 .invoice_cache 缓存中自动加载,无需手动构造样本数据。
|
||||
|
||||
用法:
|
||||
python scripts/test_travel_info.py
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# 项目根目录
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
sys.path.insert(0, str(ROOT)) # noqa: E402
|
||||
|
||||
from src.doc.llm_extractor import extract_travel_info # noqa: E402
|
||||
|
||||
|
||||
def main() -> None:
|
||||
source_dir = ROOT / "scripts" / "data"
|
||||
|
||||
if not source_dir.exists():
|
||||
print(f"源文件目录不存在: {source_dir}")
|
||||
sys.exit(1)
|
||||
|
||||
print("=" * 60)
|
||||
print("测试 extract_travel_info(数据来自缓存)")
|
||||
print("=" * 60)
|
||||
print(f"源文件目录: {source_dir}")
|
||||
print()
|
||||
|
||||
try:
|
||||
result = extract_travel_info(
|
||||
source_dir=source_dir,
|
||||
)
|
||||
print()
|
||||
print("=" * 60)
|
||||
print("提取结果:")
|
||||
print("=" * 60)
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2))
|
||||
print()
|
||||
print("测试通过!")
|
||||
except Exception as e:
|
||||
print(f"测试失败: {e}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user