¿La mejor manera de extraer texto de un documento de Word sin utilizar COM / automatización?

¿Existe una forma razonable de extraer texto sin formato de un archivo de Word que no dependa de la automatización de COM? (Esta es una función para una aplicación web implementada en una plataforma que no es Windows; en este caso no es negociable).

Antiword parece que podría ser una opción razonable, pero parece que podría ser abandonado.

Una solución de Python sería ideal, pero no parece estar disponible.

Utilizo catdoc o antiword para esto, lo que dé el resultado es el más fácil de analizar. He incorporado esto en las funciones de python, por lo que es fácil de usar desde el sistema de análisis (que está escrito en python).

import os def doc_to_text_catdoc(filename): (fi, fo, fe) = os.popen3('catdoc -w "%s"' % filename) fi.close() retval = fo.read() erroroutput = fe.read() fo.close() fe.close() if not erroroutput: return retval else: raise OSError("Executing the command caused an error: %s" % erroroutput) # similar doc_to_text_antiword() 

El interruptor -w a catdoc desactiva el ajuste de línea, por cierto.

(La misma respuesta que para extraer texto de archivos de MS Word en Python )

Usa el módulo nativo de Python docx que hice esta semana. Aquí es cómo extraer todo el texto de un documento:

 document = opendocx('Hello world.docx') # This location is where most document content lives docbody = document.xpath('/w:document/w:body', namespaces=wordnamespaces)[0] # Extract all text print getdocumenttext(document) 

Ver el sitio de Python DocX

100% Python, sin COM, sin .net, sin Java, sin analizar XML serializado con expresiones regulares, sin basura.

Si todo lo que quieres hacer es extraer texto de archivos de Word (.docx), es posible hacerlo solo con Python. Como lo escribió Guy Starbuck, solo necesitas descomprimir el archivo y luego analizar el XML. Inspirado en python-docx , he escrito una función simple para hacer esto:

 try: from xml.etree.cElementTree import XML except ImportError: from xml.etree.ElementTree import XML import zipfile """ Module that extract text from MS XML Word document (.docx). (Inspired by python-docx ) """ WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' PARA = WORD_NAMESPACE + 'p' TEXT = WORD_NAMESPACE + 't' def get_docx_text(path): """ Take the path of a docx file as argument, return the text in unicode. """ document = zipfile.ZipFile(path) xml_content = document.read('word/document.xml') document.close() tree = XML(xml_content) paragraphs = [] for paragraph in tree.getiterator(PARA): texts = [node.text for node in paragraph.getiterator(TEXT) if node.text] if texts: paragraphs.append(''.join(texts)) return '\n\n'.join(paragraphs) 

Usando la API de OpenOffice y Python, y el excelente libro de macros en línea de Andrew Pitonyak, logré hacerlo. La sección 7.16.4 es el lugar para comenzar.

Otro consejo para que funcione sin necesidad de utilizar la pantalla es utilizar la propiedad Oculto:

 RO = PropertyValue('ReadOnly', 0, True, 0) Hidden = PropertyValue('Hidden', 0, True, 0) xDoc = desktop.loadComponentFromURL( docpath,"_blank", 0, (RO, Hidden,) ) 

De lo contrario, el documento aparecerá en la pantalla (probablemente en la consola del servidor web) cuando lo abra.

Open Office tiene una API

Para archivos docx, revise el script de Python docx2txt disponible en

http://cobweb.ecn.purdue.edu/~kak/distMisc/docx2txt

para extraer el texto plano de un documento docx.

tika-python

Un puerto de Python de la biblioteca de Apache Tika, de acuerdo con la documentación, Apache tika admite la extracción de texto de más de 1500 formatos de archivo.

Nota: También funciona con encanto con pyinstaller.

Instalar con pip:

 pip install tika 

Muestra:

 #!/usr/bin/env python from tika import parser parsed = parser.from_file('/path/to/file') print(parsed["metadata"]) #To get the meta data of the file print(parsed["content"]) # To get the content of the file 

Enlace a GitHub oficial

Esto funcionó bien para .doc y .odt.

Llama a openoffice en la línea de comandos para convertir tu archivo a texto, que puedes simplemente cargar en Python.

(Parece que tiene otras opciones de formato, aunque no están aparentemente documentadas).