| | |
| | """ |
| | Simple test runner for template.docx conversion |
| | Tests only the core functionality without LibreOffice |
| | """ |
| |
|
| | import os |
| | import sys |
| | from pathlib import Path |
| |
|
| | |
| | sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) |
| |
|
| | from app import ( |
| | validate_docx_structure, |
| | preprocess_docx_for_perfect_conversion, |
| | analyze_template_font_sizes, |
| | setup_local_arial_font |
| | ) |
| |
|
| | def main(): |
| | """Test the template conversion system""" |
| | print("🎯 Template.docx Conversion System Test") |
| | print("=" * 50) |
| |
|
| | |
| | script_dir = Path(__file__).parent.absolute() |
| | print(f"📁 Script directory: {script_dir}") |
| |
|
| | |
| | print("📁 Checking required files...") |
| |
|
| | arial_path = script_dir / "arial.ttf" |
| | template_path = script_dir / "template.docx" |
| | |
| | if not arial_path.exists(): |
| | print(f"❌ Arial font not found: {arial_path}") |
| | return False |
| | print(f"✅ Arial font found: {arial_path}") |
| | |
| | if not template_path.exists(): |
| | print(f"❌ Template not found: {template_path}") |
| | return False |
| | print(f"✅ Template found: {template_path}") |
| | |
| | |
| | print("\n🔤 Setting up Arial font...") |
| | if setup_local_arial_font(): |
| | print("✅ Arial font setup successful") |
| | else: |
| | print("⚠️ Arial font setup had issues (may still work)") |
| | |
| | |
| | print("\n📏 Analyzing template font sizes...") |
| | font_mapping = analyze_template_font_sizes(str(template_path)) |
| | |
| | if font_mapping: |
| | print(f"✅ Found {len(font_mapping)} text patterns with font sizes") |
| | |
| | |
| | important_patterns = { |
| | 'size_12': ['{{serial_number}}', '{{date}}', 'الرقم التسلسلي', 'التاريخ'], |
| | 'size_13': ['{{name_1}}', '{{location_1}}', 'اسم المالك', 'يسكن'], |
| | 'size_14': ['الطرف البائع', 'الطرف المشتري'] |
| | } |
| | |
| | for size_name, patterns in important_patterns.items(): |
| | found_patterns = [] |
| | for pattern in patterns: |
| | for text, size in font_mapping.items(): |
| | if pattern in text: |
| | found_patterns.append(f"{pattern}→{size}pt") |
| | break |
| | |
| | if found_patterns: |
| | print(f" • {size_name}: {', '.join(found_patterns[:3])}") |
| | else: |
| | print("❌ Font size analysis failed") |
| | return False |
| | |
| | |
| | print("\n🔍 Validating DOCX structure...") |
| | validation_info = validate_docx_structure(str(template_path)) |
| | |
| | print(f"✅ Validation completed:") |
| | print(f" • Tables: {validation_info.get('has_tables', False)}") |
| | print(f" • Images: {validation_info.get('has_images', False)}") |
| | print(f" • RTL content: {validation_info.get('rtl_content_detected', False)}") |
| | print(f" • Placeholders: {validation_info.get('placeholder_count', 0)}") |
| | print(f" • Font families: {len(validation_info.get('font_families', set()))}") |
| | |
| | |
| | print("\n🔧 Testing preprocessing...") |
| | try: |
| | processed_path = preprocess_docx_for_perfect_conversion(str(template_path), validation_info) |
| | |
| | if processed_path != str(template_path): |
| | print("✅ Preprocessing applied successfully") |
| | print(f" • Font settings applied") |
| | print(f" • Arial font set as default") |
| | print(f" • Specific font sizes applied") |
| | |
| | |
| | try: |
| | os.unlink(processed_path) |
| | print(" • Temporary file cleaned up") |
| | except: |
| | pass |
| | else: |
| | print("ℹ️ No preprocessing needed") |
| | |
| | except Exception as e: |
| | print(f"❌ Preprocessing failed: {e}") |
| | return False |
| | |
| | |
| | print("\n" + "=" * 50) |
| | print("🎉 Template Conversion System Ready!") |
| | print("\n📋 Summary:") |
| | print("✅ Arial font from fonts/ directory will be used") |
| | print("✅ Font sizes will be preserved:") |
| | print(" • Size 12: Serial numbers, dates, times") |
| | print(" • Size 13: Names, IDs, locations, phones") |
| | print(" • Size 14: 'الطرف البائع', 'الطرف المشتري'") |
| | print(" • Size 12: All other text (default)") |
| | print("✅ RTL Arabic text will be handled correctly") |
| | print("✅ Tables and images will be preserved") |
| | print(f"✅ {validation_info.get('placeholder_count', 0)} placeholders will be maintained") |
| | |
| | print("\n🚀 To use the system:") |
| | print("1. Run: python app.py") |
| | print("2. Open the Gradio interface") |
| | print("3. Upload template.docx") |
| | print("4. Download the converted PDF") |
| | |
| | return True |
| |
|
| | if __name__ == "__main__": |
| | success = main() |
| | if success: |
| | print("\n✅ All tests passed! System is ready to use.") |
| | else: |
| | print("\n❌ Some tests failed. Please check the setup.") |
| | |
| | input("\nPress Enter to exit...") |
| | sys.exit(0 if success else 1) |
| |
|