- Add debug_font_path, demo_docs_dir, e2e_api_base_url to config.py - Fix hardcoded paths in pp_structure_debug.py, create_demo_images.py - Fix hardcoded paths in test files - Update .env.example with new configuration options - Update .gitignore to exclude AI development files (.claude/, openspec/, AGENTS.md, CLAUDE.md) - Add production startup script (start-prod.sh) - Add README.md with project documentation - Add 1panel Docker deployment files (docker-compose.yml, Dockerfiles, nginx.conf) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
163 lines
5.2 KiB
Python
163 lines
5.2 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Create demo images for testing Tool_OCR
|
||
"""
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# Add backend to path for imports
|
||
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
||
|
||
from PIL import Image, ImageDraw, ImageFont
|
||
from app.core.config import settings
|
||
|
||
# Demo docs directory from settings
|
||
DEMO_DIR = Path(settings.demo_docs_dir)
|
||
|
||
def create_text_image(text, filename, size=(800, 600), font_size=40):
|
||
"""Create an image with text"""
|
||
# Create white background
|
||
img = Image.new('RGB', size, color='white')
|
||
draw = ImageDraw.Draw(img)
|
||
|
||
# Try to use a font from settings, fallback to default
|
||
try:
|
||
font = ImageFont.truetype(settings.debug_font_path, font_size)
|
||
except Exception:
|
||
font = ImageFont.load_default()
|
||
|
||
# Calculate text position (centered)
|
||
bbox = draw.textbbox((0, 0), text, font=font)
|
||
text_width = bbox[2] - bbox[0]
|
||
text_height = bbox[3] - bbox[1]
|
||
position = ((size[0] - text_width) // 2, (size[1] - text_height) // 2)
|
||
|
||
# Draw text
|
||
draw.text(position, text, fill='black', font=font)
|
||
|
||
# Save image
|
||
img.save(filename)
|
||
print(f"Created: {filename}")
|
||
|
||
def create_multiline_text_image(lines, filename, size=(800, 1000), font_size=30):
|
||
"""Create an image with multiple lines of text"""
|
||
img = Image.new('RGB', size, color='white')
|
||
draw = ImageDraw.Draw(img)
|
||
|
||
try:
|
||
font = ImageFont.truetype(settings.debug_font_path, font_size)
|
||
except Exception:
|
||
font = ImageFont.load_default()
|
||
|
||
# Draw each line
|
||
y = 50
|
||
for line in lines:
|
||
draw.text((50, y), line, fill='black', font=font)
|
||
y += font_size + 20
|
||
|
||
img.save(filename)
|
||
print(f"Created: {filename}")
|
||
|
||
def create_table_image(filename, size=(800, 600)):
|
||
"""Create a simple table image"""
|
||
img = Image.new('RGB', size, color='white')
|
||
draw = ImageDraw.Draw(img)
|
||
|
||
try:
|
||
font = ImageFont.truetype(settings.debug_font_path, 24)
|
||
except Exception:
|
||
font = ImageFont.load_default()
|
||
|
||
# Draw table borders
|
||
# Header row
|
||
draw.rectangle([50, 50, 750, 100], outline='black', width=2)
|
||
# Row 1
|
||
draw.rectangle([50, 100, 750, 150], outline='black', width=2)
|
||
# Row 2
|
||
draw.rectangle([50, 150, 750, 200], outline='black', width=2)
|
||
# Row 3
|
||
draw.rectangle([50, 200, 750, 250], outline='black', width=2)
|
||
|
||
# Vertical lines
|
||
draw.line([250, 50, 250, 250], fill='black', width=2)
|
||
draw.line([450, 50, 450, 250], fill='black', width=2)
|
||
draw.line([650, 50, 650, 250], fill='black', width=2)
|
||
|
||
# Add text
|
||
draw.text((60, 65), "姓名", fill='black', font=font)
|
||
draw.text((260, 65), "年齡", fill='black', font=font)
|
||
draw.text((460, 65), "部門", fill='black', font=font)
|
||
draw.text((660, 65), "職位", fill='black', font=font)
|
||
|
||
draw.text((60, 115), "張三", fill='black', font=font)
|
||
draw.text((260, 115), "28", fill='black', font=font)
|
||
draw.text((460, 115), "技術部", fill='black', font=font)
|
||
draw.text((660, 115), "工程師", fill='black', font=font)
|
||
|
||
draw.text((60, 165), "李四", fill='black', font=font)
|
||
draw.text((260, 165), "32", fill='black', font=font)
|
||
draw.text((460, 165), "銷售部", fill='black', font=font)
|
||
draw.text((660, 165), "經理", fill='black', font=font)
|
||
|
||
draw.text((60, 215), "王五", fill='black', font=font)
|
||
draw.text((260, 215), "25", fill='black', font=font)
|
||
draw.text((460, 215), "人事部", fill='black', font=font)
|
||
draw.text((660, 215), "專員", fill='black', font=font)
|
||
|
||
img.save(filename)
|
||
print(f"Created: {filename}")
|
||
|
||
def main():
|
||
# Create basic text images
|
||
basic_dir = DEMO_DIR / "basic"
|
||
basic_dir.mkdir(parents=True, exist_ok=True)
|
||
create_text_image(
|
||
"這是中文繁體測試文檔\nTool_OCR 系統測試",
|
||
basic_dir / "chinese_traditional.png"
|
||
)
|
||
|
||
create_text_image(
|
||
"这是中文简体测试文档\nTool_OCR 系统测试",
|
||
basic_dir / "chinese_simple.png"
|
||
)
|
||
|
||
create_text_image(
|
||
"This is English Test Document\nTool_OCR System Testing",
|
||
basic_dir / "english.png"
|
||
)
|
||
|
||
# Create multiline document
|
||
layout_lines = [
|
||
"Tool_OCR 文檔處理系統",
|
||
"",
|
||
"一、系統簡介",
|
||
"Tool_OCR 是一個強大的文檔識別系統,支援批次處理、",
|
||
"版面分析、表格識別等功能。",
|
||
"",
|
||
"二、主要功能",
|
||
"1. 批次文件上傳與處理",
|
||
"2. OCR 文字識別(支援中英文)",
|
||
"3. 版面保留 PDF 導出",
|
||
"4. 表格結構識別",
|
||
"5. 多種格式導出(TXT, JSON, Excel, MD, PDF)",
|
||
]
|
||
layout_dir = DEMO_DIR / "layout"
|
||
layout_dir.mkdir(parents=True, exist_ok=True)
|
||
create_multiline_text_image(layout_lines, layout_dir / "document.png")
|
||
|
||
# Create table image
|
||
tables_dir = DEMO_DIR / "tables"
|
||
tables_dir.mkdir(parents=True, exist_ok=True)
|
||
create_table_image(tables_dir / "simple_table.png")
|
||
|
||
print("\n✅ Demo images created successfully!")
|
||
print(f"\n📁 Location: {DEMO_DIR}")
|
||
print("\nYou can now test these images with Tool_OCR:")
|
||
print(" - Basic OCR: demo_docs/basic/")
|
||
print(" - Layout: demo_docs/layout/")
|
||
print(" - Tables: demo_docs/tables/")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|