|
|
|
|
|
"""
|
|
|
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)
|
|
|
|