Herramienta profesional en Python para convertir cientos o miles de archivos PDF a formato DOCX de manera eficiente y confiable. Diseñada para procesar lotes grandes (~1500+ archivos) con procesamiento paralelo, manejo robusto de errores y retroalimentación en tiempo real.
- ✅ Conversión masiva - Procesa miles de archivos en una sola operación
- 🚀 Procesamiento paralelo - Utiliza múltiples hilos para máxima eficiencia
- 🛡️ Manejo robusto de errores - Continúa procesando incluso si algunos archivos fallan
- 📊 Seguimiento en tiempo real - Barra de progreso y logs detallados
- ⏱️ Control de timeout - Evita que archivos problemáticos bloqueen todo el proceso
- 💻 Interfaz dual - CLI para automatización y GUI para usuarios
- 📝 Logging completo - Registro detallado de todas las operaciones
- 🔄 Recuperación automática - Limpieza adecuada de recursos incluso en caso de error
- Python: 3.9 o superior
- Sistema Operativo: Windows, Linux, macOS
- Espacio en disco: DOCX puede ser más grande que el PDF original
- RAM: Recomendado 4GB+ para lotes grandes
# Windows PowerShell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt# Linux/macOS
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtpip install pdf2docx>=0.5.8 tqdm>=4.66.0La GUI ofrece una experiencia intuitiva con todas las funcionalidades disponibles:
python gui.pyCaracterísticas de la GUI:
- 📂 Interfaz drag-and-drop amigable
- 📊 Barra de progreso en tiempo real
- 📝 Registro de actividad visible
- ⚙️ Configuración fácil de opciones
- ✅ Validación de entradas
- 🎨 Interfaz moderna con emojis para mejor UX
Pasos para usar la GUI:
- Agregar archivos/carpetas: Click en "➕ Agregar archivos" o "📁 Agregar carpeta"
- Seleccionar destino: Click en "📂 Elegir" para la carpeta de salida
- Configurar opciones (opcional):
- Patrón de búsqueda (default:
*.pdf) - Búsqueda recursiva en subcarpetas
- Número de workers (threads concurrentes)
- Máximo de archivos a procesar
- Timeout por archivo
- Sobrescribir archivos existentes
- Patrón de búsqueda (default:
- Iniciar: Click en "🚀 Iniciar conversión"
- Monitorear: Observa el progreso en tiempo real y revisa los logs
Ideal para scripts, tareas programadas y procesamiento por lotes:
python converter.py --input <ruta_entrada> --output <ruta_salida> [opciones]| Parámetro | Descripción | Requerido | Default |
|---|---|---|---|
--input |
Ruta de archivo PDF o carpeta. Se puede repetir múltiples veces | ✅ Sí | - |
--output |
Carpeta destino para archivos DOCX | ✅ Sí | - |
--pattern |
Patrón glob para filtrar archivos | ❌ No | *.pdf |
--recursive |
Buscar en subcarpetas | ❌ No | True |
--no-recursive |
Desactivar búsqueda recursiva | ❌ No | - |
--workers |
Número de hilos concurrentes | ❌ No | CPU-1 |
--max-files |
Límite de archivos a procesar | ❌ No | Ilimitado |
--timeout-per-file |
Timeout en segundos por archivo | ❌ No | Sin límite |
--overwrite |
Sobrescribir archivos DOCX existentes | ❌ No | False |
python converter.py --input ./pdfs --output ./docxpython converter.py --input D:\documentos\pdfs --output D:\documentos\docx --workers 8 --overwritepython converter.py --input ./carpeta1 --input ./carpeta2 --input ./archivo.pdf --output ./salidapython converter.py --input ./pdfs --output ./docx --no-recursivepython converter.py --input ./pdfs --output ./docx --max-files 500 --timeout-per-file 120python converter.py --input ./docs --output ./docx --pattern "informe_*.pdf"1. Validación de entradas
↓
2. Expansión de rutas (archivos + carpetas)
↓
3. Filtrado por patrón
↓
4. Eliminación de duplicados
↓
5. Aplicación de límites (max-files)
↓
6. Procesamiento paralelo con ThreadPoolExecutor
↓
7. Conversión individual con manejo de errores
↓
8. Reporte de resultados y errores
expand_inputs(): Expande rutas y encuentra archivos PDFconvert_single(): Convierte un PDF individual usando context managerprocess_batch(): Procesa múltiples archivos en paralelorun_conversion(): API principal para otras interfaces
- Interfaz moderna con Tkinter
- Actualización de progreso en tiempo real
- Log de actividad integrado
- Validación de entradas robusta
El sistema implementa múltiples capas de manejo de errores:
- Validación de entrada: Verifica archivos y directorios antes de procesar
- Context managers: Garantiza liberación de recursos incluso en error
- Try-catch específicos: Captura errores de memoria, permisos, formato, etc.
- Timeout protection: Evita bloqueos en archivos problemáticos
- Logging detallado: Registra todos los errores para diagnóstico
| Error | Causa | Solución |
|---|---|---|
| "El archivo PDF no existe" | Ruta incorrecta | Verificar ruta del archivo |
| "El archivo PDF está vacío" | Archivo corrupto o vacío | Revisar archivo PDF |
| "Memoria insuficiente" | PDF muy grande | Reducir workers o agregar RAM |
| "Sin permisos" | Acceso denegado | Ejecutar con permisos adecuados |
| "Timeout > Xs" | Archivo muy complejo | Aumentar timeout o verificar PDF |
- CPU de 4 núcleos:
--workers 3-4 - CPU de 8 núcleos:
--workers 6-8 - CPU de 16+ núcleos:
--workers 12-16
Regla general: Usar CPU count - 1 o CPU count - 2 para dejar recursos al sistema.
Para más de 2000 archivos, considerar:
-
Dividir en lotes:
python converter.py --input ./pdfs --output ./docx --max-files 1000 # Luego procesar los siguientes 1000, etc.
-
Usar timeout para evitar bloqueos:
python converter.py --input ./pdfs --output ./docx --timeout-per-file 300
-
Monitorear uso de memoria durante procesamiento
- DOCX típicamente es 1.5-3x el tamaño del PDF original
- Verificar espacio disponible antes de procesar lotes grandes
- Considerar usar
--overwritecon cuidado
✅ Funcionan bien:
- PDFs basados en texto
- PDFs generados desde Word/Office
- PDFs con fuentes embebidas
- PDFs escaneados (requieren OCR previo)
- PDFs con protección/cifrado
- PDFs con formularios complejos
- PDFs muy grandes (>100 MB)
El sistema utiliza diferentes niveles de logging:
- INFO: Operaciones normales y progreso
- WARNING: Advertencias (archivos omitidos, etc.)
- ERROR: Errores en archivos específicos
- DEBUG: Información detallada (activar manualmente)
# En converter.py o gui.py, cambiar:
logging.basicConfig(level=logging.DEBUG, ...)- CLI: Salida a consola (stdout)
- GUI: Panel de registro de actividad + consola
Para distribuir sin requerir Python instalado:
.\.venv\Scripts\Activate.ps1
pip install pyinstaller.\.venv\Scripts\python -m PyInstaller --noconfirm pdf_to_doc_gui.spec.\.venv\Scripts\python -m PyInstaller --noconfirm --onefile --name pdf_to_doc_cli --collect-all pdf2docx --additional-hooks-dir=. converter.pyLos ejecutables estarán en la carpeta dist/. Copia toda la carpeta al equipo destino.
dist/
├── pdf_to_doc_gui.exe (GUI sin consola)
└── pdf_to_doc_cli.exe (CLI con consola)
Solución implementada: Se agregó context manager para garantizar cierre de recursos.
Si aún ocurre:
- Usar
--timeout-per-file 300(5 minutos) - Reducir
--workersa 2-3 - Verificar si archivos PDF específicos son muy grandes
- Reducir número de workers
- Procesar en lotes más pequeños con
--max-files - Cerrar otras aplicaciones
- Verificar que el patrón sea correcto:
--pattern "*.pdf" - Usar
--recursivesi archivos están en subcarpetas - Verificar permisos de lectura en carpetas
- La conversión está en progreso en segundo plano
- Revisar panel de logs para ver actividad
- No cerrar la ventana hasta que termine
PDF_TO_DOC/
├── converter.py # Motor de conversión (CLI + API)
├── gui.py # Interfaz gráfica
├── requirements.txt # Dependencias
├── README.md # Este archivo
├── .gitignore # Archivos ignorados
├── hook-pdf2docx.py # Hook para PyInstaller
└── pdf_to_doc_gui.spec # Configuración PyInstaller
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver archivo LICENSE para más detalles.
pdf2docxfunciona mejor con PDFs basados en texto- PDFs escaneados requieren OCR previo (no incluido)
- Algunos elementos complejos pueden no convertirse perfectamente
- El formato puede variar dependiendo de la complejidad del PDF original
Si encuentras problemas:
- Revisa la sección de Solución de Problemas
- Verifica los logs para más detalles
- Abre un issue en GitHub con:
- Descripción del problema
- Mensaje de error completo
- Versión de Python
- Sistema operativo
- Comando o pasos para reproducir
Desarrollado con ❤️ para facilitar la conversión masiva de documentos