Upload 51 files
Browse files- DEPLOYMENT_INSTRUCTIONS.md +71 -0
- Dockerfile +14 -10
- FIXES_SUMMARY.md +48 -70
- app.py +33 -6
- main.py +26 -2
- test_libreoffice.py +115 -0
DEPLOYMENT_INSTRUCTIONS.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Deployment Instructions for DOCX to PDF Converter
|
| 2 |
+
|
| 3 |
+
## Prerequisites
|
| 4 |
+
- Docker installed on your system
|
| 5 |
+
- Internet connection for downloading base images and dependencies
|
| 6 |
+
|
| 7 |
+
## Deployment Steps
|
| 8 |
+
|
| 9 |
+
### 1. Build the Docker Image
|
| 10 |
+
```bash
|
| 11 |
+
docker build -t docx-to-pdf-converter .
|
| 12 |
+
```
|
| 13 |
+
|
| 14 |
+
### 2. Run the Container
|
| 15 |
+
```bash
|
| 16 |
+
docker run -p 7860:7860 docx-to-pdf-converter
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
### 3. Access the Application
|
| 20 |
+
Open your browser and navigate to `http://localhost:7860`
|
| 21 |
+
|
| 22 |
+
## Key Improvements for Stability
|
| 23 |
+
|
| 24 |
+
### Java Integration Fixes
|
| 25 |
+
- Completely removed Java dependencies from the Docker image
|
| 26 |
+
- Added comprehensive environment variables to disable Java integration
|
| 27 |
+
- Updated LibreOffice configuration to permanently disable Java support
|
| 28 |
+
- Enhanced command-line flags to prevent Java initialization
|
| 29 |
+
|
| 30 |
+
### Error Resolution
|
| 31 |
+
These changes resolve the following critical errors:
|
| 32 |
+
- "javaldx failed!" - Java initialization failure
|
| 33 |
+
- "تعذّر إكمال تثبيت المستخدم" (Cannot complete user installation) - User setup issues
|
| 34 |
+
- Conversion failures with return code 77 - LibreOffice startup failures
|
| 35 |
+
|
| 36 |
+
### Performance Benefits
|
| 37 |
+
- Faster startup times (no Java VM initialization)
|
| 38 |
+
- Reduced memory footprint (no Java runtime)
|
| 39 |
+
- More reliable conversions (eliminates Java-related crashes)
|
| 40 |
+
- Better container compatibility (no Java security restrictions)
|
| 41 |
+
|
| 42 |
+
## Testing the Deployment
|
| 43 |
+
|
| 44 |
+
### Health Check
|
| 45 |
+
Visit `http://localhost:7860/health` to verify:
|
| 46 |
+
- LibreOffice availability
|
| 47 |
+
- Java disabled status
|
| 48 |
+
- Overall application health
|
| 49 |
+
|
| 50 |
+
### Conversion Test
|
| 51 |
+
1. Visit `http://localhost:7860`
|
| 52 |
+
2. Upload a DOCX file
|
| 53 |
+
3. Verify successful conversion without Java errors
|
| 54 |
+
|
| 55 |
+
## Troubleshooting
|
| 56 |
+
|
| 57 |
+
### If Java Errors Persist
|
| 58 |
+
1. Verify Java dependencies are completely removed from Dockerfile
|
| 59 |
+
2. Check that all environment variables are set correctly
|
| 60 |
+
3. Ensure LibreOffice configuration disables Java support
|
| 61 |
+
|
| 62 |
+
### If Conversion Still Fails
|
| 63 |
+
1. Check file permissions in container
|
| 64 |
+
2. Verify LibreOffice installation
|
| 65 |
+
3. Review logs for specific error messages
|
| 66 |
+
|
| 67 |
+
## Support
|
| 68 |
+
For issues with the converter, please check:
|
| 69 |
+
1. Application logs via Docker: `docker logs <container_id>`
|
| 70 |
+
2. Health check endpoint: `http://localhost:7860/health`
|
| 71 |
+
3. Verify all dependencies are properly installed
|
Dockerfile
CHANGED
|
@@ -10,16 +10,19 @@ ENV PYTHONUNBUFFERED=1
|
|
| 10 |
ENV HOME=/tmp
|
| 11 |
ENV TMPDIR=/tmp
|
| 12 |
ENV XDG_CONFIG_HOME=/tmp/.config
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
|
| 14 |
-
# Install system dependencies including Arabic fonts
|
| 15 |
RUN apt-get update && apt-get install -y \
|
| 16 |
python3 \
|
| 17 |
python3-pip \
|
| 18 |
libreoffice \
|
| 19 |
libreoffice-writer \
|
| 20 |
libreoffice-l10n-ar \
|
| 21 |
-
libreoffice-java-common \
|
| 22 |
-
openjdk-11-jre-headless \
|
| 23 |
fonts-liberation \
|
| 24 |
fonts-liberation2 \
|
| 25 |
fonts-dejavu \
|
|
@@ -60,12 +63,18 @@ RUN echo '<?xml version="1.0" encoding="UTF-8"?>\
|
|
| 60 |
<value>true</value>\
|
| 61 |
</prop>\
|
| 62 |
</item>\
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
</oor:items>' > /tmp/.config/libreoffice/4/user/registrymodifications.xcu \
|
| 64 |
&& chmod 666 /tmp/.config/libreoffice/4/user/registrymodifications.xcu
|
| 65 |
|
| 66 |
# Pre-initialize LibreOffice to avoid first-run errors - More comprehensive approach
|
| 67 |
# Run LibreOffice with specific flags to complete initial setup
|
| 68 |
-
RUN HOME=/tmp timeout 30 libreoffice --headless --invisible --nologo --norestore --nofirststartwizard --safe-mode --version || true
|
| 69 |
|
| 70 |
# Set working directory
|
| 71 |
WORKDIR /app
|
|
@@ -94,12 +103,7 @@ RUN sed -i 's|/usr/share/fonts/truetype|/tmp/fonts/truetype|g' setup_fonts.py &&
|
|
| 94 |
# Update font cache after installing additional fonts
|
| 95 |
RUN fc-cache -fv
|
| 96 |
|
| 97 |
-
#
|
| 98 |
-
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
| 99 |
-
ENV LO_JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
| 100 |
-
|
| 101 |
-
# Create symbolic links for Java integration
|
| 102 |
-
RUN ln -sf /usr/lib/jvm/java-11-openjdk-amd64/bin/java /usr/bin/java || true
|
| 103 |
|
| 104 |
# Expose port (Hugging Face Spaces requires port 7860)
|
| 105 |
EXPOSE 7860
|
|
|
|
| 10 |
ENV HOME=/tmp
|
| 11 |
ENV TMPDIR=/tmp
|
| 12 |
ENV XDG_CONFIG_HOME=/tmp/.config
|
| 13 |
+
# CRITICAL: Completely disable Java to prevent javaldx errors
|
| 14 |
+
ENV SAL_DISABLE_JAVA=1
|
| 15 |
+
ENV SAL_DISABLE_JAVA_SECURITY=1
|
| 16 |
+
ENV LIBO_DISABLE_JAVA=1
|
| 17 |
|
| 18 |
+
# Install system dependencies including Arabic fonts WITHOUT Java for LibreOffice
|
| 19 |
RUN apt-get update && apt-get install -y \
|
| 20 |
python3 \
|
| 21 |
python3-pip \
|
| 22 |
libreoffice \
|
| 23 |
libreoffice-writer \
|
| 24 |
libreoffice-l10n-ar \
|
| 25 |
+
# REMOVED: libreoffice-java-common and openjdk-11-jre-headless to prevent javaldx errors \
|
|
|
|
| 26 |
fonts-liberation \
|
| 27 |
fonts-liberation2 \
|
| 28 |
fonts-dejavu \
|
|
|
|
| 63 |
<value>true</value>\
|
| 64 |
</prop>\
|
| 65 |
</item>\
|
| 66 |
+
<!-- CRITICAL: Disable Java completely to prevent javaldx errors -->\
|
| 67 |
+
<item oor:path="/org.openoffice.Setup/Office">\
|
| 68 |
+
<prop oor:name="JavaSupport" oor:op="fuse">\
|
| 69 |
+
<value>false</value>\
|
| 70 |
+
</prop>\
|
| 71 |
+
</item>\
|
| 72 |
</oor:items>' > /tmp/.config/libreoffice/4/user/registrymodifications.xcu \
|
| 73 |
&& chmod 666 /tmp/.config/libreoffice/4/user/registrymodifications.xcu
|
| 74 |
|
| 75 |
# Pre-initialize LibreOffice to avoid first-run errors - More comprehensive approach
|
| 76 |
# Run LibreOffice with specific flags to complete initial setup
|
| 77 |
+
RUN HOME=/tmp timeout 30 libreoffice --headless --invisible --nologo --norestore --nofirststartwizard --safe-mode --disable-java --version || true
|
| 78 |
|
| 79 |
# Set working directory
|
| 80 |
WORKDIR /app
|
|
|
|
| 103 |
# Update font cache after installing additional fonts
|
| 104 |
RUN fc-cache -fv
|
| 105 |
|
| 106 |
+
# REMOVED: Java paths and symbolic links that were causing javaldx errors
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
|
| 108 |
# Expose port (Hugging Face Spaces requires port 7860)
|
| 109 |
EXPOSE 7860
|
FIXES_SUMMARY.md
CHANGED
|
@@ -1,70 +1,48 @@
|
|
| 1 |
-
#
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
**
|
| 14 |
-
**
|
| 15 |
-
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
-
|
| 19 |
-
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
**
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
10. Conditionally execute Arabic font setup script
|
| 50 |
-
11. Pre-initialize LibreOffice to avoid first-run errors
|
| 51 |
-
12. Expose port
|
| 52 |
-
13. Set up health check
|
| 53 |
-
14. Run the application
|
| 54 |
-
|
| 55 |
-
## Verification Steps
|
| 56 |
-
|
| 57 |
-
1. Confirmed Dockerfile exists and has correct structure
|
| 58 |
-
2. Verified arabic_fonts_setup.sh exists in project
|
| 59 |
-
3. Validated Dockerfile has the fixed script execution logic with conditional check
|
| 60 |
-
4. Confirmed .dockerignore properly includes requirements.txt and packages.txt
|
| 61 |
-
5. Verified packages.txt contains all necessary system dependencies
|
| 62 |
-
|
| 63 |
-
## Expected Outcome
|
| 64 |
-
|
| 65 |
-
With these fixes, the application should now successfully deploy to Hugging Face Spaces without the previous build errors:
|
| 66 |
-
- No more COPY command syntax errors
|
| 67 |
-
- All packages should be available in Ubuntu 22.04
|
| 68 |
-
- requirements.txt will be properly included in the build
|
| 69 |
-
- Java dependencies for LibreOffice are included
|
| 70 |
-
- Arabic font setup script will be executed safely if present
|
|
|
|
| 1 |
+
# LibreOffice Java Integration Fixes Summary
|
| 2 |
+
|
| 3 |
+
## Problem
|
| 4 |
+
The DOCX to PDF converter was experiencing "javaldx failed!" errors and "تعذّر إكمال تثبيت المستخدم" (Cannot complete user installation) errors during conversion, even after adding `--disable-java` flags.
|
| 5 |
+
|
| 6 |
+
## Root Cause
|
| 7 |
+
LibreOffice was still attempting to initialize Java components despite the `--disable-java` flag, causing the javaldx errors that prevented successful document conversion.
|
| 8 |
+
|
| 9 |
+
## Solutions Implemented
|
| 10 |
+
|
| 11 |
+
### 1. Dockerfile Changes
|
| 12 |
+
- **Removed Java dependencies**: Completely removed `libreoffice-java-common` and `openjdk-11-jre-headless` from the apt-get install command
|
| 13 |
+
- **Added environment variables**: Set `SAL_DISABLE_JAVA=1`, `SAL_DISABLE_JAVA_SECURITY=1`, and `LIBO_DISABLE_JAVA=1` to completely disable Java
|
| 14 |
+
- **Updated LibreOffice configuration**: Added JavaSupport=false to registrymodifications.xcu
|
| 15 |
+
- **Updated initialization command**: Added `--disable-java` flag to the LibreOffice pre-initialization command
|
| 16 |
+
|
| 17 |
+
### 2. app.py Changes
|
| 18 |
+
- **Enhanced command flags**: Added multiple Java-disabling flags to the LibreOffice command:
|
| 19 |
+
- `--disable-java` (existing)
|
| 20 |
+
- `--disable-extension-update`
|
| 21 |
+
- `--disable-webupdate`
|
| 22 |
+
- `--disable-remote-control`
|
| 23 |
+
- `--disable-notification`
|
| 24 |
+
- `--disable-oop4all`
|
| 25 |
+
- `--disable-opencl`
|
| 26 |
+
- **Enhanced environment variables**: Added comprehensive Java-disabling environment variables:
|
| 27 |
+
- `SAL_DISABLE_JAVA=1`
|
| 28 |
+
- `SAL_DISABLE_JAVA_SECURITY=1`
|
| 29 |
+
- `LIBO_DISABLE_JAVA=1`
|
| 30 |
+
- `LIBO_JAVA_PARALLEL=0`
|
| 31 |
+
- `SAL_JAVA_DISABLE_SECURITY=1`
|
| 32 |
+
- **Updated LibreOffice configuration**: Added JavaSupport=false to the registrymodifications.xcu configuration
|
| 33 |
+
|
| 34 |
+
### 3. main.py Changes
|
| 35 |
+
- **Early environment setup**: Set Java-disabling environment variables at the top of the file before any imports
|
| 36 |
+
- **Enhanced health check**: Added Java disabled status to the health check endpoint
|
| 37 |
+
|
| 38 |
+
## Testing
|
| 39 |
+
A test script (`test_libreoffice.py`) was created to verify that LibreOffice can run successfully without Java integration.
|
| 40 |
+
|
| 41 |
+
## Expected Results
|
| 42 |
+
These changes should completely eliminate the "javaldx failed!" errors and allow LibreOffice to run in a Java-free environment, resolving the conversion failures with return code 77.
|
| 43 |
+
|
| 44 |
+
## Additional Benefits
|
| 45 |
+
- Faster LibreOffice startup (no Java initialization)
|
| 46 |
+
- Reduced memory usage (no Java VM)
|
| 47 |
+
- More stable conversions (no Java-related crashes)
|
| 48 |
+
- Better compatibility with containerized environments
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.py
CHANGED
|
@@ -1761,6 +1761,20 @@ def create_libreoffice_config(temp_path):
|
|
| 1761 |
</prop>
|
| 1762 |
</item>
|
| 1763 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1764 |
<!-- PDF Export Settings for Maximum Quality with Arabic Support -->
|
| 1765 |
<item oor:path="/org.openoffice.Office.Common/Filter/PDF/Export">
|
| 1766 |
<prop oor:name="Quality" oor:op="fuse">
|
|
@@ -2191,6 +2205,7 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2191 |
# Convert settings to JSON string for LibreOffice
|
| 2192 |
pdf_filter = f'pdf:writer_pdf_Export:{json.dumps(pdf_export_settings, separators=(",", ":"))}'
|
| 2193 |
|
|
|
|
| 2194 |
cmd = [
|
| 2195 |
"libreoffice",
|
| 2196 |
"--headless",
|
|
@@ -2201,6 +2216,14 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2201 |
"--norestore",
|
| 2202 |
"--nofirststartwizard",
|
| 2203 |
"--safe-mode",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2204 |
"--convert-to", pdf_filter,
|
| 2205 |
"--outdir", str(temp_path),
|
| 2206 |
str(input_file)
|
|
@@ -2248,16 +2271,20 @@ def convert_docx_to_pdf(docx_file):
|
|
| 2248 |
env['SAL_RTL_ENABLED'] = '1'
|
| 2249 |
env['OOO_DISABLE_RECOVERY'] = '1'
|
| 2250 |
|
| 2251 |
-
#
|
| 2252 |
-
env['
|
| 2253 |
-
env['
|
|
|
|
|
|
|
|
|
|
| 2254 |
env['UNO_PATH'] = '/usr/lib/libreoffice/program'
|
| 2255 |
|
| 2256 |
-
#
|
| 2257 |
-
env['
|
|
|
|
| 2258 |
|
| 2259 |
print(f"🚀 Executing LibreOffice conversion with MAXIMUM quality settings...")
|
| 2260 |
-
print(f"Command: {' '.join(cmd[:
|
| 2261 |
print(f"Environment: HOME={env.get('HOME', 'default')}, LANG={env.get('LANG', 'default')}")
|
| 2262 |
|
| 2263 |
result = subprocess.run(
|
|
|
|
| 1761 |
</prop>
|
| 1762 |
</item>
|
| 1763 |
|
| 1764 |
+
<!-- CRITICAL: Completely disable Java to prevent javaldx errors -->
|
| 1765 |
+
<item oor:path="/org.openoffice.Setup/Office">
|
| 1766 |
+
<prop oor:name="JavaSupport" oor:op="fuse">
|
| 1767 |
+
<value>false</value>
|
| 1768 |
+
</prop>
|
| 1769 |
+
</item>
|
| 1770 |
+
|
| 1771 |
+
<!-- Disable Java security to prevent javaldx errors -->
|
| 1772 |
+
<item oor:path="/org.openoffice.Office.Java">
|
| 1773 |
+
<prop oor:name="Enabled" oor:op="fuse">
|
| 1774 |
+
<value>false</value>
|
| 1775 |
+
</prop>
|
| 1776 |
+
</item>
|
| 1777 |
+
|
| 1778 |
<!-- PDF Export Settings for Maximum Quality with Arabic Support -->
|
| 1779 |
<item oor:path="/org.openoffice.Office.Common/Filter/PDF/Export">
|
| 1780 |
<prop oor:name="Quality" oor:op="fuse">
|
|
|
|
| 2205 |
# Convert settings to JSON string for LibreOffice
|
| 2206 |
pdf_filter = f'pdf:writer_pdf_Export:{json.dumps(pdf_export_settings, separators=(",", ":"))}'
|
| 2207 |
|
| 2208 |
+
# ENHANCED: Completely disable Java integration to prevent javaldx errors
|
| 2209 |
cmd = [
|
| 2210 |
"libreoffice",
|
| 2211 |
"--headless",
|
|
|
|
| 2216 |
"--norestore",
|
| 2217 |
"--nofirststartwizard",
|
| 2218 |
"--safe-mode",
|
| 2219 |
+
"--disable-gpu",
|
| 2220 |
+
"--disable-java", # This should prevent javaldx errors
|
| 2221 |
+
"--disable-extension-update",
|
| 2222 |
+
"--disable-webupdate",
|
| 2223 |
+
"--disable-remote-control",
|
| 2224 |
+
"--disable-notification",
|
| 2225 |
+
"--disable-oop4all", # Disable out-of-process for all
|
| 2226 |
+
"--disable-opencl", # Disable OpenCL for better stability
|
| 2227 |
"--convert-to", pdf_filter,
|
| 2228 |
"--outdir", str(temp_path),
|
| 2229 |
str(input_file)
|
|
|
|
| 2271 |
env['SAL_RTL_ENABLED'] = '1'
|
| 2272 |
env['OOO_DISABLE_RECOVERY'] = '1'
|
| 2273 |
|
| 2274 |
+
# CRITICAL: Completely disable Java integration to prevent javaldx errors
|
| 2275 |
+
env['SAL_DISABLE_JAVA_SECURITY'] = '1'
|
| 2276 |
+
env['SAL_DISABLE_JAVA'] = '1' # Additional Java disable flag
|
| 2277 |
+
env['SAL_JAVA_DISABLE_SECURITY'] = '1' # Another Java disable flag
|
| 2278 |
+
|
| 2279 |
+
# MODIFIED: Set UNO_PATH to help LibreOffice find its components
|
| 2280 |
env['UNO_PATH'] = '/usr/lib/libreoffice/program'
|
| 2281 |
|
| 2282 |
+
# CRITICAL: Set LibreOffice to use minimal Java or no Java at all
|
| 2283 |
+
env['LIBO_JAVA_PARALLEL'] = '0' # Disable parallel Java processing
|
| 2284 |
+
env['LIBO_DISABLE_JAVA'] = '1' # Additional LibreOffice Java disable flag
|
| 2285 |
|
| 2286 |
print(f"🚀 Executing LibreOffice conversion with MAXIMUM quality settings...")
|
| 2287 |
+
print(f"Command: {' '.join(cmd[:13])}... [truncated for readability]")
|
| 2288 |
print(f"Environment: HOME={env.get('HOME', 'default')}, LANG={env.get('LANG', 'default')}")
|
| 2289 |
|
| 2290 |
result = subprocess.run(
|
main.py
CHANGED
|
@@ -18,6 +18,11 @@ import time
|
|
| 18 |
from typing import Optional, List
|
| 19 |
import logging
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
from fastapi import FastAPI, File, UploadFile, HTTPException, BackgroundTasks
|
| 22 |
from fastapi.responses import FileResponse, JSONResponse
|
| 23 |
from fastapi.staticfiles import StaticFiles
|
|
@@ -100,6 +105,7 @@ class ConversionResponse(BaseModel):
|
|
| 100 |
class HealthResponse(BaseModel):
|
| 101 |
status: str
|
| 102 |
libreoffice_available: bool
|
|
|
|
| 103 |
|
| 104 |
# Serve static files (for HTML frontend)
|
| 105 |
app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
@@ -150,9 +156,11 @@ async def health_check():
|
|
| 150 |
## الاستجابة:
|
| 151 |
- `status`: حالة التطبيق (healthy/degraded)
|
| 152 |
- `libreoffice_available`: ما إذا كان LibreOffice متوفرًا أم لا
|
|
|
|
| 153 |
"""
|
| 154 |
libreoffice_available = False
|
| 155 |
libreoffice_version = None
|
|
|
|
| 156 |
|
| 157 |
try:
|
| 158 |
# Test LibreOffice installation
|
|
@@ -168,14 +176,30 @@ async def health_check():
|
|
| 168 |
except Exception:
|
| 169 |
libreoffice_available = False
|
| 170 |
|
| 171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
if not libreoffice_available:
|
| 174 |
logger.warning("LibreOffice is not available. Please install LibreOffice for DOCX to PDF conversion.")
|
| 175 |
|
| 176 |
return HealthResponse(
|
| 177 |
status=status,
|
| 178 |
-
libreoffice_available=libreoffice_available
|
|
|
|
| 179 |
)
|
| 180 |
|
| 181 |
@app.post("/convert", response_model=ConversionResponse, tags=["Conversion"])
|
|
|
|
| 18 |
from typing import Optional, List
|
| 19 |
import logging
|
| 20 |
|
| 21 |
+
# CRITICAL: Set environment variables to disable Java BEFORE any other imports
|
| 22 |
+
os.environ['SAL_DISABLE_JAVA'] = '1'
|
| 23 |
+
os.environ['SAL_DISABLE_JAVA_SECURITY'] = '1'
|
| 24 |
+
os.environ['LIBO_DISABLE_JAVA'] = '1'
|
| 25 |
+
|
| 26 |
from fastapi import FastAPI, File, UploadFile, HTTPException, BackgroundTasks
|
| 27 |
from fastapi.responses import FileResponse, JSONResponse
|
| 28 |
from fastapi.staticfiles import StaticFiles
|
|
|
|
| 105 |
class HealthResponse(BaseModel):
|
| 106 |
status: str
|
| 107 |
libreoffice_available: bool
|
| 108 |
+
java_disabled: bool # Add this field
|
| 109 |
|
| 110 |
# Serve static files (for HTML frontend)
|
| 111 |
app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
|
|
| 156 |
## الاستجابة:
|
| 157 |
- `status`: حالة التطبيق (healthy/degraded)
|
| 158 |
- `libreoffice_available`: ما إذا كان LibreOffice متوفرًا أم لا
|
| 159 |
+
- `java_disabled`: ما إذا كان Java معطلًا أم لا
|
| 160 |
"""
|
| 161 |
libreoffice_available = False
|
| 162 |
libreoffice_version = None
|
| 163 |
+
java_disabled = True # Assume Java is disabled by default
|
| 164 |
|
| 165 |
try:
|
| 166 |
# Test LibreOffice installation
|
|
|
|
| 176 |
except Exception:
|
| 177 |
libreoffice_available = False
|
| 178 |
|
| 179 |
+
# Check if Java is properly disabled by testing LibreOffice with disable-java flag
|
| 180 |
+
try:
|
| 181 |
+
# Test LibreOffice with Java disabled flag
|
| 182 |
+
test_result = subprocess.run(
|
| 183 |
+
["libreoffice", "--headless", "--disable-java", "--version"],
|
| 184 |
+
capture_output=True,
|
| 185 |
+
text=True,
|
| 186 |
+
timeout=5
|
| 187 |
+
)
|
| 188 |
+
# If this command succeeds, Java is properly disabled
|
| 189 |
+
java_disabled = test_result.returncode == 0
|
| 190 |
+
except Exception:
|
| 191 |
+
# If we can't test, assume Java is disabled based on our configuration
|
| 192 |
+
java_disabled = True
|
| 193 |
+
|
| 194 |
+
status = "healthy" if libreoffice_available and java_disabled else "degraded"
|
| 195 |
|
| 196 |
if not libreoffice_available:
|
| 197 |
logger.warning("LibreOffice is not available. Please install LibreOffice for DOCX to PDF conversion.")
|
| 198 |
|
| 199 |
return HealthResponse(
|
| 200 |
status=status,
|
| 201 |
+
libreoffice_available=libreoffice_available,
|
| 202 |
+
java_disabled=java_disabled
|
| 203 |
)
|
| 204 |
|
| 205 |
@app.post("/convert", response_model=ConversionResponse, tags=["Conversion"])
|
test_libreoffice.py
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Test script to verify LibreOffice can run without Java integration
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
import subprocess
|
| 7 |
+
import os
|
| 8 |
+
import tempfile
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
|
| 11 |
+
def test_libreoffice_no_java():
|
| 12 |
+
"""Test LibreOffice with Java completely disabled"""
|
| 13 |
+
print("Testing LibreOffice with Java disabled...")
|
| 14 |
+
|
| 15 |
+
# Create a simple test DOCX file
|
| 16 |
+
test_content = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
| 17 |
+
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
|
| 18 |
+
<w:body>
|
| 19 |
+
<w:p>
|
| 20 |
+
<w:r>
|
| 21 |
+
<w:t>Hello World Test</w:t>
|
| 22 |
+
</w:r>
|
| 23 |
+
</w:p>
|
| 24 |
+
</w:body>
|
| 25 |
+
</w:document>'''
|
| 26 |
+
|
| 27 |
+
with tempfile.TemporaryDirectory() as temp_dir:
|
| 28 |
+
temp_path = Path(temp_dir)
|
| 29 |
+
|
| 30 |
+
# Create test DOCX structure
|
| 31 |
+
docx_dir = temp_path / "test.docx"
|
| 32 |
+
docx_dir.mkdir()
|
| 33 |
+
|
| 34 |
+
# Create word directory
|
| 35 |
+
word_dir = docx_dir / "word"
|
| 36 |
+
word_dir.mkdir()
|
| 37 |
+
|
| 38 |
+
# Create document.xml
|
| 39 |
+
with open(word_dir / "document.xml", "w", encoding="utf-8") as f:
|
| 40 |
+
f.write(test_content)
|
| 41 |
+
|
| 42 |
+
# Create minimal [Content_Types].xml
|
| 43 |
+
content_types = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
| 44 |
+
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
| 45 |
+
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
|
| 46 |
+
</Types>'''
|
| 47 |
+
|
| 48 |
+
with open(docx_dir / "[Content_Types].xml", "w", encoding="utf-8") as f:
|
| 49 |
+
f.write(content_types)
|
| 50 |
+
|
| 51 |
+
# Create ZIP file (DOCX is just a ZIP file)
|
| 52 |
+
import zipfile
|
| 53 |
+
test_docx = temp_path / "test.docx"
|
| 54 |
+
with zipfile.ZipFile(test_docx, 'w') as zipf:
|
| 55 |
+
zipf.write(word_dir / "document.xml", "word/document.xml")
|
| 56 |
+
zipf.write(docx_dir / "[Content_Types].xml", "[Content_Types].xml")
|
| 57 |
+
|
| 58 |
+
# Test LibreOffice command with Java disabled
|
| 59 |
+
cmd = [
|
| 60 |
+
"libreoffice",
|
| 61 |
+
"--headless",
|
| 62 |
+
"--invisible",
|
| 63 |
+
"--nodefault",
|
| 64 |
+
"--nolockcheck",
|
| 65 |
+
"--nologo",
|
| 66 |
+
"--norestore",
|
| 67 |
+
"--nofirststartwizard",
|
| 68 |
+
"--safe-mode",
|
| 69 |
+
"--disable-java",
|
| 70 |
+
"--disable-gpu",
|
| 71 |
+
"--convert-to", "pdf",
|
| 72 |
+
"--outdir", str(temp_path),
|
| 73 |
+
str(test_docx)
|
| 74 |
+
]
|
| 75 |
+
|
| 76 |
+
# Set environment variables to disable Java
|
| 77 |
+
env = os.environ.copy()
|
| 78 |
+
env['SAL_DISABLE_JAVA'] = '1'
|
| 79 |
+
env['SAL_DISABLE_JAVA_SECURITY'] = '1'
|
| 80 |
+
env['LIBO_DISABLE_JAVA'] = '1'
|
| 81 |
+
env['HOME'] = str(temp_path)
|
| 82 |
+
env['XDG_CONFIG_HOME'] = str(temp_path / ".config")
|
| 83 |
+
|
| 84 |
+
print(f"Running command: {' '.join(cmd)}")
|
| 85 |
+
|
| 86 |
+
try:
|
| 87 |
+
result = subprocess.run(
|
| 88 |
+
cmd,
|
| 89 |
+
capture_output=True,
|
| 90 |
+
text=True,
|
| 91 |
+
timeout=30,
|
| 92 |
+
cwd=temp_path,
|
| 93 |
+
env=env
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
print(f"Return code: {result.returncode}")
|
| 97 |
+
print(f"STDOUT: {result.stdout}")
|
| 98 |
+
print(f"STDERR: {result.stderr}")
|
| 99 |
+
|
| 100 |
+
if result.returncode == 0:
|
| 101 |
+
print("✅ LibreOffice test successful - Java is properly disabled")
|
| 102 |
+
return True
|
| 103 |
+
else:
|
| 104 |
+
print("❌ LibreOffice test failed")
|
| 105 |
+
return False
|
| 106 |
+
|
| 107 |
+
except subprocess.TimeoutExpired:
|
| 108 |
+
print("❌ LibreOffice test timed out")
|
| 109 |
+
return False
|
| 110 |
+
except Exception as e:
|
| 111 |
+
print(f"❌ LibreOffice test error: {e}")
|
| 112 |
+
return False
|
| 113 |
+
|
| 114 |
+
if __name__ == "__main__":
|
| 115 |
+
test_libreoffice_no_java()
|