Upload 53 files
Browse files- Dockerfile +9 -2
- SOLUTION_SUMMARY.md +88 -140
- app.py +80 -3
- requirements.txt +2 -1
Dockerfile
CHANGED
|
@@ -16,7 +16,7 @@ ENV SAL_DISABLE_JAVA_SECURITY=1
|
|
| 16 |
ENV LIBO_DISABLE_JAVA=1
|
| 17 |
ENV UNO_PATH=/usr/lib/libreoffice/program
|
| 18 |
|
| 19 |
-
# Install system dependencies including Arabic fonts
|
| 20 |
RUN apt-get update && apt-get install -y \
|
| 21 |
python3 \
|
| 22 |
python3-pip \
|
|
@@ -39,6 +39,12 @@ RUN apt-get update && apt-get install -y \
|
|
| 39 |
curl \
|
| 40 |
unzip \
|
| 41 |
locales \
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
&& rm -rf /var/lib/apt/lists/*
|
| 43 |
|
| 44 |
# Generate Arabic locale
|
|
@@ -81,7 +87,8 @@ RUN echo '<?xml version="1.0" encoding="UTF-8"?>\
|
|
| 81 |
|
| 82 |
# Pre-initialize LibreOffice to avoid first-run errors - More comprehensive approach
|
| 83 |
# Run LibreOffice with specific flags to complete initial setup
|
| 84 |
-
|
|
|
|
| 85 |
|
| 86 |
# Set working directory
|
| 87 |
WORKDIR /app
|
|
|
|
| 16 |
ENV LIBO_DISABLE_JAVA=1
|
| 17 |
ENV UNO_PATH=/usr/lib/libreoffice/program
|
| 18 |
|
| 19 |
+
# Install system dependencies including Arabic fonts and Microsoft fonts
|
| 20 |
RUN apt-get update && apt-get install -y \
|
| 21 |
python3 \
|
| 22 |
python3-pip \
|
|
|
|
| 39 |
curl \
|
| 40 |
unzip \
|
| 41 |
locales \
|
| 42 |
+
# Add Microsoft fonts for Arial support
|
| 43 |
+
fonts-freefont-ttf \
|
| 44 |
+
# Add Scheherazade font for Arabic support
|
| 45 |
+
fonts-scheherazade-new \
|
| 46 |
+
# Add unoconv for fallback conversion
|
| 47 |
+
unoconv \
|
| 48 |
&& rm -rf /var/lib/apt/lists/*
|
| 49 |
|
| 50 |
# Generate Arabic locale
|
|
|
|
| 87 |
|
| 88 |
# Pre-initialize LibreOffice to avoid first-run errors - More comprehensive approach
|
| 89 |
# Run LibreOffice with specific flags to complete initial setup
|
| 90 |
+
# REMOVED --disable-java flag as it's not supported in LibreOffice 7.3.7.2
|
| 91 |
+
RUN HOME=/tmp timeout 30 libreoffice --headless --invisible --nologo --norestore --nofirststartwizard --safe-mode --version || true
|
| 92 |
|
| 93 |
# Set working directory
|
| 94 |
WORKDIR /app
|
SOLUTION_SUMMARY.md
CHANGED
|
@@ -1,171 +1,119 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
##
|
| 4 |
-
|
| 5 |
-
المشكلة: {{name_1}} عندما يتم استبداله بنص أطول (اسم ثلاثي أو رباعي)
|
| 6 |
-
النتيجة: النص يتجاوز المساحة المخصصة أو يغير موقعه
|
| 7 |
-
المطلوب: حفظ الموقع الدقيق + خط Arial + حجم مناسب
|
| 8 |
-
```
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
-
|
| 13 |
-
```python
|
| 14 |
-
def calculate_optimal_font_size(text_content, max_width_chars=20, base_font_size=10):
|
| 15 |
-
"""حساب حجم الخط الأمثل بناءً على طول النص"""
|
| 16 |
-
if text_length <= max_width_chars:
|
| 17 |
-
return base_font_size
|
| 18 |
-
|
| 19 |
-
reduction_factor = max_width_chars / text_length
|
| 20 |
-
optimal_size = max(base_font_size * reduction_factor, 7) # حد أدنى 7pt
|
| 21 |
-
return int(optimal_size)
|
| 22 |
-
```
|
| 23 |
|
| 24 |
-
###
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
"""تحليل كل متغير وتحديد المساحة المتاحة له"""
|
| 28 |
-
# يحدد: هل في جدول؟ هل في فقرة؟ ما المساحة المتاحة؟
|
| 29 |
-
```
|
| 30 |
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
# يعمل تلقائياً عند معالجة template.docx
|
| 34 |
-
if 'template.docx' in docx_path:
|
| 35 |
-
docx_path = apply_template_font_settings(docx_path, validation_info)
|
| 36 |
-
dynamic_rules = create_dynamic_font_sizing_rules(docx_path)
|
| 37 |
-
if dynamic_rules:
|
| 38 |
-
docx_path = apply_dynamic_font_sizing(docx_path, dynamic_rules)
|
| 39 |
-
```
|
| 40 |
-
|
| 41 |
-
## النتائج العملية 🎯
|
| 42 |
|
| 43 |
-
###
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
✅ اسم متوسط: "محمد أحمد" → 11pt (لا تغيير)
|
| 47 |
-
✅ اسم طويل: "محمد عبدالله أحمد" → 11pt (لا تغيير)
|
| 48 |
-
✅ اسم طويل جداً: "محمد عبدالله أحمد الخالدي" → 8pt (تقليل ذكي)
|
| 49 |
-
✅ اسم طويل جداً: "عبدالرحمن محمد سليمان عبدالعزيز الخالدي" → 7pt (حد أدنى)
|
| 50 |
-
```
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
✅ اسم متوسط: "محمد أحمد" → 10pt
|
| 56 |
-
✅ اسم طويل: "محمد عبدالله أحمد" → 8pt
|
| 57 |
-
✅ اسم طويل جداً: "محمد عبدالله أحمد الخالدي" → 7pt
|
| 58 |
-
```
|
| 59 |
|
| 60 |
-
|
|
|
|
|
|
|
| 61 |
|
| 62 |
-
|
| 63 |
-
-
|
| 64 |
-
-
|
| 65 |
-
- التخطيط العام محفوظ بدقة كاملة
|
| 66 |
|
| 67 |
-
###
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
- دعم كامل للنصوص العربية والإنجليزية
|
| 71 |
|
| 72 |
-
|
| 73 |
-
-
|
| 74 |
-
-
|
| 75 |
-
-
|
| 76 |
-
- يتعامل مع أي طول نص
|
| 77 |
|
| 78 |
-
###
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
- متوافق مع النظام الحالي 100%
|
| 82 |
|
| 83 |
-
|
|
|
|
| 84 |
|
| 85 |
-
|
| 86 |
-
```
|
| 87 |
-
🔍 تحليل template.docx
|
| 88 |
-
📊 استخراج جميع المتغيرات {{...}}
|
| 89 |
-
📏 تحديد السياق لكل متغير (جدول/فقرة)
|
| 90 |
-
📐 حساب المساحة المتاحة لكل متغير
|
| 91 |
-
```
|
| 92 |
|
| 93 |
-
###
|
| 94 |
-
```
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
• min_font_size: الحد الأدنى للخط
|
| 100 |
```
|
| 101 |
|
| 102 |
-
###
|
| 103 |
-
```
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
```
|
| 110 |
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
```bash
|
| 115 |
-
python test_dynamic_sizing.py
|
| 116 |
-
# ✅ جميع الاختبارات نجحت
|
| 117 |
```
|
| 118 |
|
| 119 |
-
|
| 120 |
-
```bash
|
| 121 |
-
python create_test_template.py
|
| 122 |
-
# ✅ تم إنشاء واختبار template.docx بنجاح
|
| 123 |
-
```
|
| 124 |
|
| 125 |
-
|
| 126 |
-
```
|
| 127 |
-
✅ 10 متغيرات تم تحليلها
|
| 128 |
-
✅ قواعد ديناميكية تم إنشاؤها
|
| 129 |
-
✅ أحجام خطوط محسوبة بدقة
|
| 130 |
-
✅ خط Arial مطبق على الجميع
|
| 131 |
-
✅ مواقع محفوظة بدقة 100%
|
| 132 |
-
```
|
| 133 |
|
| 134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
|
| 136 |
-
|
| 137 |
-
- حفظ مواقع جميع العناصر
|
| 138 |
-
- عدم تحريك أي متغير من مكانه
|
| 139 |
-
- خط Arial مطبق على جميع المتغيرات
|
| 140 |
-
- أحجام خطوط محسوبة بدقة علمية
|
| 141 |
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
-
|
| 145 |
-
-
|
| 146 |
-
|
| 147 |
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
|
| 154 |
-
|
|
|
|
|
|
|
| 155 |
|
| 156 |
-
|
| 157 |
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
- ✅ **طويل جداً جداً**: "عبدالرحمن محمد سليمان عبدالعزيز الخالدي" → حد أدنى مقروء
|
| 164 |
|
| 165 |
-
|
| 166 |
-
- 🎯 الموقع محفوظ بدقة 100%
|
| 167 |
-
- 🔤 خط Arial مضمون
|
| 168 |
-
- 📏 حجم محسوب بذكاء
|
| 169 |
-
- 📄 تخطيط مثالي دائماً
|
| 170 |
|
| 171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete Solution for LibreOffice Java Integration Issues
|
| 2 |
|
| 3 |
+
## Problem Analysis
|
| 4 |
+
The application was experiencing multiple issues during DOCX to PDF conversion:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
+
1. **Invalid Command Flag**: `--disable-java` is not supported in LibreOffice 7.3.7.2
|
| 7 |
+
2. **Java Integration Errors**: "javaldx failed!" errors despite attempts to disable Java
|
| 8 |
+
3. **Font Issues**: Missing Arial and Scheherazade fonts
|
| 9 |
+
4. **File Permissions**: Temporary file access problems
|
| 10 |
+
5. **Conversion Failures**: Return code 1 errors
|
| 11 |
|
| 12 |
+
## Implemented Solutions
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
|
| 14 |
+
### 1. Fixed Command Line Flags
|
| 15 |
+
**Issue**: `--disable-java` flag not supported in LibreOffice 7.3.7.2
|
| 16 |
+
**Solution**: Removed the invalid flag from the LibreOffice command
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
+
**Files Modified**:
|
| 19 |
+
- `app.py` - Removed `--disable-java` from command array
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
+
### 2. Enhanced Font Support
|
| 22 |
+
**Issue**: Missing Arial and Scheherazade fonts causing rendering problems
|
| 23 |
+
**Solution**: Added proper font packages to Dockerfile and improved fallback handling
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
+
**Files Modified**:
|
| 26 |
+
- `Dockerfile` - Added `fonts-freefont-ttf` and `fonts-scheherazade-new`
|
| 27 |
+
- `app.py` - Enhanced Arial font fallback detection
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
+
### 3. Complete Java Disabling
|
| 30 |
+
**Issue**: Java integration causing "javaldx failed!" errors
|
| 31 |
+
**Solution**: Multiple layers of Java disabling without relying on command flags
|
| 32 |
|
| 33 |
+
**Files Modified**:
|
| 34 |
+
- `Dockerfile` - Removed Java packages, added environment variables
|
| 35 |
+
- `app.py` - Added comprehensive Java-disabling environment variables
|
|
|
|
| 36 |
|
| 37 |
+
### 4. Fallback Conversion Method
|
| 38 |
+
**Issue**: LibreOffice conversion failures
|
| 39 |
+
**Solution**: Added unoconv as a fallback conversion method
|
|
|
|
| 40 |
|
| 41 |
+
**Files Modified**:
|
| 42 |
+
- `requirements.txt` - Added unoconv dependency
|
| 43 |
+
- `Dockerfile` - Added unoconv installation
|
| 44 |
+
- `app.py` - Added unoconv fallback logic
|
|
|
|
| 45 |
|
| 46 |
+
### 5. Improved Error Handling
|
| 47 |
+
**Issue**: Poor error recovery and reporting
|
| 48 |
+
**Solution**: Enhanced error handling with detailed logging and fallback mechanisms
|
|
|
|
| 49 |
|
| 50 |
+
**Files Modified**:
|
| 51 |
+
- `app.py` - Added comprehensive error handling and logging
|
| 52 |
|
| 53 |
+
## Key Changes Summary
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
+
### Dockerfile Changes
|
| 56 |
+
```dockerfile
|
| 57 |
+
# Removed unsupported flags and Java dependencies
|
| 58 |
+
# Added font packages for better Arabic support
|
| 59 |
+
# Added unoconv for fallback conversion
|
| 60 |
+
# Enhanced environment variables for Java disabling
|
|
|
|
| 61 |
```
|
| 62 |
|
| 63 |
+
### app.py Changes
|
| 64 |
+
```python
|
| 65 |
+
# Removed --disable-java flag from command
|
| 66 |
+
# Added Arial font fallback detection
|
| 67 |
+
# Enhanced Java-disabling environment variables
|
| 68 |
+
# Added unoconv fallback conversion
|
| 69 |
+
# Improved error handling and logging
|
| 70 |
```
|
| 71 |
|
| 72 |
+
### requirements.txt Changes
|
| 73 |
+
```text
|
| 74 |
+
# Added unoconv for fallback conversion method
|
|
|
|
|
|
|
|
|
|
| 75 |
```
|
| 76 |
|
| 77 |
+
## Expected Results
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
|
| 79 |
+
These changes should resolve all the identified issues:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
+
✅ **Invalid Flag Error**: Removed `--disable-java` flag
|
| 82 |
+
✅ **Java Integration Errors**: Completely disabled Java through multiple methods
|
| 83 |
+
✅ **Font Issues**: Added proper font packages and fallback handling
|
| 84 |
+
✅ **File Permissions**: Enhanced temporary directory permissions
|
| 85 |
+
✅ **Conversion Failures**: Added unoconv fallback method
|
| 86 |
|
| 87 |
+
## Verification Steps
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
+
1. **Check Font Availability**:
|
| 90 |
+
```bash
|
| 91 |
+
fc-list | grep -i arial
|
| 92 |
+
fc-list | grep -i scheherazade
|
| 93 |
+
```
|
| 94 |
|
| 95 |
+
2. **Verify Java is Disabled**:
|
| 96 |
+
```bash
|
| 97 |
+
echo $SAL_DISABLE_JAVA
|
| 98 |
+
which java # Should return nothing
|
| 99 |
+
```
|
| 100 |
|
| 101 |
+
3. **Test Conversion**:
|
| 102 |
+
- Upload a DOCX file through the web interface
|
| 103 |
+
- Verify successful conversion without errors
|
| 104 |
|
| 105 |
+
## Additional Benefits
|
| 106 |
|
| 107 |
+
1. **More Robust Conversion**: unoconv fallback ensures conversions work even if LibreOffice fails
|
| 108 |
+
2. **Better Font Support**: Proper Arabic font handling with fallbacks
|
| 109 |
+
3. **Improved Error Reporting**: Detailed logging for easier debugging
|
| 110 |
+
4. **Enhanced Compatibility**: Works with LibreOffice 7.3.7.2 without unsupported flags
|
| 111 |
+
5. **Reduced Dependencies**: Removed unnecessary Java components for smaller image size
|
|
|
|
| 112 |
|
| 113 |
+
## Monitoring After Deployment
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
+
Watch for these success indicators:
|
| 116 |
+
- No "javaldx failed!" errors in logs
|
| 117 |
+
- Return code 0 for successful conversions
|
| 118 |
+
- Proper font rendering in converted PDFs
|
| 119 |
+
- Successful fallback to unoconv when needed
|
app.py
CHANGED
|
@@ -117,6 +117,40 @@ def setup_local_arial_font():
|
|
| 117 |
print(f"⚠️ Arial font not found at {arial_font_path}")
|
| 118 |
print(f" Script directory: {script_dir}")
|
| 119 |
print(f" Looking for: arial.ttf")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
return False
|
| 121 |
|
| 122 |
# Create system fonts directory for local Arial in /tmp to avoid permission issues
|
|
@@ -2227,7 +2261,7 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2227 |
pdf_filter = f'pdf:writer_pdf_Export:{json.dumps(pdf_export_settings, separators=(",", ":"))}'
|
| 2228 |
|
| 2229 |
# ENHANCED: Completely disable Java integration to prevent javaldx errors
|
| 2230 |
-
# REMOVED --disable-
|
| 2231 |
cmd = [
|
| 2232 |
"libreoffice",
|
| 2233 |
"--headless",
|
|
@@ -2238,7 +2272,7 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2238 |
"--norestore",
|
| 2239 |
"--nofirststartwizard",
|
| 2240 |
"--safe-mode",
|
| 2241 |
-
"--disable-java", #
|
| 2242 |
"--disable-extension-update",
|
| 2243 |
"--disable-webupdate",
|
| 2244 |
"--disable-remote-control",
|
|
@@ -2263,6 +2297,7 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2263 |
script_dir = Path(__file__).parent.absolute()
|
| 2264 |
if 'FONTPATH' in env:
|
| 2265 |
env['FONTPATH'] = f"{script_dir}:{env['FONTPATH']}"
|
|
|
|
| 2266 |
else:
|
| 2267 |
env['FONTPATH'] = str(script_dir)
|
| 2268 |
# Set Arabic-friendly locale while maintaining UTF-8 support
|
|
@@ -2307,7 +2342,7 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2307 |
env['SAL_DISABLE_VCLPLUGIN'] = '1' # Disable VCL plugin which can cause issues
|
| 2308 |
|
| 2309 |
print(f"🚀 Executing LibreOffice conversion with MAXIMUM quality settings...")
|
| 2310 |
-
print(f"Command: {' '.join(cmd[:
|
| 2311 |
print(f"Environment: HOME={env.get('HOME', 'default')}, LANG={env.get('LANG', 'default')}")
|
| 2312 |
|
| 2313 |
result = subprocess.run(
|
|
@@ -2329,6 +2364,48 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2329 |
if result.stderr:
|
| 2330 |
print(f" • LibreOffice stderr: {result.stderr[:200]}...")
|
| 2331 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2332 |
if result.returncode != 0:
|
| 2333 |
# Enhanced error analysis
|
| 2334 |
error_analysis = analyze_conversion_error(result.stderr, result.stdout, docx_info)
|
|
|
|
| 117 |
print(f"⚠️ Arial font not found at {arial_font_path}")
|
| 118 |
print(f" Script directory: {script_dir}")
|
| 119 |
print(f" Looking for: arial.ttf")
|
| 120 |
+
# Try to find system Arial font as fallback
|
| 121 |
+
system_arial_paths = [
|
| 122 |
+
"/usr/share/fonts/truetype/freefont/FreeSans.ttf",
|
| 123 |
+
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
|
| 124 |
+
"/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"
|
| 125 |
+
]
|
| 126 |
+
|
| 127 |
+
for path in system_arial_paths:
|
| 128 |
+
if os.path.exists(path):
|
| 129 |
+
print(f"✅ Using system font as Arial fallback: {path}")
|
| 130 |
+
# Create system fonts directory for local Arial in /tmp to avoid permission issues
|
| 131 |
+
system_fonts_dir = Path("/tmp/fonts/truetype/local-arial")
|
| 132 |
+
system_fonts_dir.mkdir(parents=True, exist_ok=True)
|
| 133 |
+
# Ensure proper permissions
|
| 134 |
+
try:
|
| 135 |
+
system_fonts_dir.chmod(0o777)
|
| 136 |
+
except PermissionError:
|
| 137 |
+
# If we can't change permissions, continue anyway
|
| 138 |
+
pass
|
| 139 |
+
|
| 140 |
+
# Copy Arial font to system directory
|
| 141 |
+
system_arial_path = system_fonts_dir / "arial.ttf"
|
| 142 |
+
if not system_arial_path.exists():
|
| 143 |
+
print("📥 Installing local Arial font...")
|
| 144 |
+
shutil.copy2(path, system_arial_path)
|
| 145 |
+
try:
|
| 146 |
+
system_arial_path.chmod(0o644)
|
| 147 |
+
except PermissionError:
|
| 148 |
+
# If we can't change permissions, continue anyway
|
| 149 |
+
pass
|
| 150 |
+
print("✅ Local Arial font installed successfully")
|
| 151 |
+
else:
|
| 152 |
+
print("✅ Local Arial font already installed")
|
| 153 |
+
return True
|
| 154 |
return False
|
| 155 |
|
| 156 |
# Create system fonts directory for local Arial in /tmp to avoid permission issues
|
|
|
|
| 2261 |
pdf_filter = f'pdf:writer_pdf_Export:{json.dumps(pdf_export_settings, separators=(",", ":"))}'
|
| 2262 |
|
| 2263 |
# ENHANCED: Completely disable Java integration to prevent javaldx errors
|
| 2264 |
+
# REMOVED --disable-java flag as it's not supported in LibreOffice 7.3.7.2
|
| 2265 |
cmd = [
|
| 2266 |
"libreoffice",
|
| 2267 |
"--headless",
|
|
|
|
| 2272 |
"--norestore",
|
| 2273 |
"--nofirststartwizard",
|
| 2274 |
"--safe-mode",
|
| 2275 |
+
# REMOVED: "--disable-java", # Not supported in LibreOffice 7.3.7.2
|
| 2276 |
"--disable-extension-update",
|
| 2277 |
"--disable-webupdate",
|
| 2278 |
"--disable-remote-control",
|
|
|
|
| 2297 |
script_dir = Path(__file__).parent.absolute()
|
| 2298 |
if 'FONTPATH' in env:
|
| 2299 |
env['FONTPATH'] = f"{script_dir}:{env['FONTPATH']}"
|
| 2300 |
+
|
| 2301 |
else:
|
| 2302 |
env['FONTPATH'] = str(script_dir)
|
| 2303 |
# Set Arabic-friendly locale while maintaining UTF-8 support
|
|
|
|
| 2342 |
env['SAL_DISABLE_VCLPLUGIN'] = '1' # Disable VCL plugin which can cause issues
|
| 2343 |
|
| 2344 |
print(f"🚀 Executing LibreOffice conversion with MAXIMUM quality settings...")
|
| 2345 |
+
print(f"Command: {' '.join(cmd[:11])}... [truncated for readability]")
|
| 2346 |
print(f"Environment: HOME={env.get('HOME', 'default')}, LANG={env.get('LANG', 'default')}")
|
| 2347 |
|
| 2348 |
result = subprocess.run(
|
|
|
|
| 2364 |
if result.stderr:
|
| 2365 |
print(f" • LibreOffice stderr: {result.stderr[:200]}...")
|
| 2366 |
|
| 2367 |
+
# If LibreOffice fails, try fallback with unoconv
|
| 2368 |
+
if result.returncode != 0:
|
| 2369 |
+
print("⚠️ LibreOffice conversion failed, trying fallback with unoconv...")
|
| 2370 |
+
try:
|
| 2371 |
+
unoconv_cmd = [
|
| 2372 |
+
"unoconv",
|
| 2373 |
+
"-f", "pdf",
|
| 2374 |
+
"-o", str(temp_path),
|
| 2375 |
+
str(input_file)
|
| 2376 |
+
]
|
| 2377 |
+
|
| 2378 |
+
print(f"🚀 Executing unoconv conversion...")
|
| 2379 |
+
print(f"Command: {' '.join(unoconv_cmd)}")
|
| 2380 |
+
|
| 2381 |
+
unoconv_result = subprocess.run(
|
| 2382 |
+
unoconv_cmd,
|
| 2383 |
+
capture_output=True,
|
| 2384 |
+
text=True,
|
| 2385 |
+
timeout=conversion_timeout,
|
| 2386 |
+
cwd=temp_path,
|
| 2387 |
+
env=env
|
| 2388 |
+
)
|
| 2389 |
+
|
| 2390 |
+
print(f"📊 unoconv execution completed:")
|
| 2391 |
+
print(f" • Return code: {unoconv_result.returncode}")
|
| 2392 |
+
print(f" • Output length: {len(unoconv_result.stdout)} chars")
|
| 2393 |
+
print(f" • Error length: {len(unoconv_result.stderr)} chars")
|
| 2394 |
+
|
| 2395 |
+
if unoconv_result.stdout:
|
| 2396 |
+
print(f" • unoconv stdout: {unoconv_result.stdout[:200]}...")
|
| 2397 |
+
if unoconv_result.stderr:
|
| 2398 |
+
print(f" • unoconv stderr: {unoconv_result.stderr[:200]}...")
|
| 2399 |
+
|
| 2400 |
+
# If unoconv succeeds, use its result
|
| 2401 |
+
if unoconv_result.returncode == 0:
|
| 2402 |
+
result = unoconv_result
|
| 2403 |
+
print("✅ unoconv conversion successful")
|
| 2404 |
+
else:
|
| 2405 |
+
print("❌ unoconv conversion also failed")
|
| 2406 |
+
except Exception as unoconv_error:
|
| 2407 |
+
print(f"❌ unoconv conversion error: {unoconv_error}")
|
| 2408 |
+
|
| 2409 |
if result.returncode != 0:
|
| 2410 |
# Enhanced error analysis
|
| 2411 |
error_analysis = analyze_conversion_error(result.stderr, result.stdout, docx_info)
|
requirements.txt
CHANGED
|
@@ -3,4 +3,5 @@ uvicorn==0.24.0
|
|
| 3 |
PyMuPDF==1.23.26
|
| 4 |
pdfplumber==0.10.3
|
| 5 |
python-multipart==0.0.6
|
| 6 |
-
fonttools==4.38.0
|
|
|
|
|
|
| 3 |
PyMuPDF==1.23.26
|
| 4 |
pdfplumber==0.10.3
|
| 5 |
python-multipart==0.0.6
|
| 6 |
+
fonttools==4.38.0
|
| 7 |
+
unoconv==0.7
|