ODT (OpenDocument Text) es el formato estándar ISO para documentos de texto de LibreOffice y Apache OpenOffice. Es un archivo ZIP que contiene XML, imágenes y metadatos — totalmente abierto y sin dependencias propietarias.
ODT vs DOCX: comparativa
| Característica | ODT | DOCX |
|---|---|---|
| Estándar | ISO/IEC 26300 | ECMA-376 |
| Desarrollado por | OASIS / ISO | Microsoft |
| Soporte | LibreOffice, OpenOffice, Google Docs | Word, LibreOffice, Google Docs |
| Uso en administraciones | Muy alto (España, UE) | Alto |
Estructura interna
unzip -l documento.odt
# mimetype, content.xml, styles.xml, meta.xml, settings.xml, META-INF/manifest.xml
unzip -p documento.odt content.xml | python3 -m xml.etree.ElementTree
Instalar odfpy
pip install odfpy
Crear un documento ODT
from odf.opendocument import OpenDocumentText
from odf.style import Style, TextProperties
from odf.text import P, H
doc = OpenDocumentText()
h = H(outlinelevel=1, stylename='Heading 1')
h.addText('Mi Primer Documento ODT')
doc.text.addElement(h)
p = P(stylename='Text Body')
p.addText('Este documento fue creado con Python y odfpy.')
doc.text.addElement(p)
doc.save('mi_documento.odt')
print("Documento ODT creado")
Extraer texto de un ODT
from odf.opendocument import load
from odf import teletype
def extraer_texto_odt(ruta):
doc = load(ruta)
lineas = []
for elem in doc.text.childNodes:
if elem.qname[1] in ('p', 'h'):
linea = teletype.extractText(elem).strip()
if linea:
lineas.append(linea)
return '\n'.join(lineas)
print(extraer_texto_odt('documento.odt')[:500])
Leer metadatos
from odf.opendocument import load
doc = load('documento.odt')
meta = doc.meta
print(f"Título: {meta.title}")
print(f"Autor: {meta.creator}")
print(f"Creado: {meta.creation_date}")
print(f"Páginas: {meta.page_count}")
Convertir con LibreOffice CLI
# ODT → DOCX
libreoffice --headless --convert-to docx documento.odt
# ODT → PDF
libreoffice --headless --convert-to pdf documento.odt
# Con directorio de salida
libreoffice --headless --convert-to pdf --outdir ./pdfs/ documento.odt
# Conversión masiva
libreoffice --headless --convert-to pdf *.odt
Conversión masiva con Python
import subprocess
from pathlib import Path
def convertir_odt_a_pdf(entrada_dir, salida_dir):
entrada = Path(entrada_dir)
salida = Path(salida_dir)
salida.mkdir(parents=True, exist_ok=True)
archivos = list(entrada.glob('*.odt'))
for odt in sorted(archivos):
r = subprocess.run(
['libreoffice', '--headless', '--convert-to', 'pdf',
'--outdir', str(salida), str(odt)],
capture_output=True, text=True,
)
if r.returncode == 0:
pdf = odt.stem + '.pdf'
tam = (salida / pdf).stat().st_size / 1024
print(f"OK → {pdf} ({tam:.0f} KB)")
else:
print(f"ERROR: {r.stderr[:200]}")
convertir_odt_a_pdf('documentos_odt/', 'pdfs/')
Cuándo usar ODT
- Documentos de larga duración: más estable que DOCX entre versiones de software
- Sector público y administración: requerido por muchas administraciones europeas
- Ecosistema libre: sin dependencias de Microsoft Office