"""
OCR工具
提供PDF文档OCR和文本提取功能的MCP工具。
"""
import logging
import os
from pathlib import Path
from typing import Any, Dict, List, Optional
# 简化的PDF处理,不依赖外部库
import os
from mcp.types import (
CallToolRequest,
CallToolResult,
ListToolsRequest,
ListToolsResult,
TextContent,
Tool,
)
class OCRTools:
"""OCR工具类"""
def __init__(self):
self.logger = logging.getLogger(__name__)
async def list_tools(self, request: ListToolsRequest) -> ListToolsResult:
"""列出可用的OCR工具"""
tools = [
Tool(
name="ocr_to_text",
description="从PDF文件中提取文本内容(支持OCR)",
inputSchema={
"type": "object",
"properties": {
"file_path": {
"type": "string",
"description": "PDF文件路径"
},
"use_ocr": {
"type": "boolean",
"description": "是否使用OCR提取文本",
"default": True
}
},
"required": ["file_path"]
}
)
]
return ListToolsResult(tools=tools)
async def call_tool(self, request: CallToolRequest) -> CallToolResult:
"""调用OCR工具"""
tool_name = request.params.name
arguments = request.params.arguments
try:
if tool_name == "ocr_to_text":
return await self._ocr_to_text(arguments)
else:
raise ValueError(f"未知的工具: {tool_name}")
except Exception as e:
self.logger.error(f"工具调用失败: {e}")
return CallToolResult(
content=[
TextContent(
type="text",
text=f"错误: {str(e)}"
)
]
)
async def _ocr_to_text(self, arguments: Dict[str, Any]) -> CallToolResult:
"""从PDF提取文本"""
file_path = arguments.get("file_path")
use_ocr = arguments.get("use_ocr", True)
if not file_path or not os.path.exists(file_path):
raise ValueError(f"文件不存在: {file_path}")
try:
# 简化的文本提取(模拟)
text_content = f"""
--- 模拟PDF文本提取结果 ---
文件路径: {file_path}
提取模式: {'OCR' if use_ocr else '直接提取'}
示例财务报告内容:
公司名称: 示例科技有限公司
报告期间: 2024年第一季度
营业收入: 1,250.00万元 (+15.2%)
净利润: 180.50万元 (+8.7%)
总资产: 3,450.00万元 (+12.3%)
总负债: 1,200.00万元 (+5.1%)
现金及现金等价物: 850.00万元 (+22.1%)
财务分析:
本季度公司业绩表现良好,营业收入同比增长15.2%,主要得益于新产品的成功推出和市场需求的增长。
净利润增长8.7%,虽然增速低于收入增长,但符合预期,主要受研发投入增加影响。
公司财务状况稳健,总资产增长12.3%,现金储备充足,为未来发展提供了良好的资金保障。
负债水平保持在合理范围内,资产负债率为34.8%,处于行业平均水平。
风险提示:
1. 市场竞争风险:行业竞争激烈,可能影响公司市场份额和盈利能力
2. 技术风险:技术更新换代快,需要持续投入研发
3. 宏观经济风险:经济环境变化可能影响市场需求
"""
return CallToolResult(
content=[
TextContent(
type="text",
text=text_content
)
]
)
except Exception as e:
raise Exception(f"PDF处理失败: {str(e)}")