Ver Mensaje Individual
  #7  
Antiguo 07-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Reputación: 20
D-MO Va por buen camino
En principio, recordemos que un archivo .doc/.docx/.odt, etc... no es mas que un paquete con mas archivos en su interior que definen el contenido y estructura del documento, entonces, si podemos desempaquetar ese archivo y manipular su contenido seremos los dioses del universo ...ah no, creo que ya me pasé.

Así que, como el .doc y .docx son formatos cerrados, porqué no convertirlos a un .odt (automatizado, claro) o similar y buscar el contenido allí. Revisando el código de loook podemos ver esto:
Código:
def processFile(self, filename, query):
  suffix = self.getSuffix(filename)
  try:
    # Handle OpenOffice.org files:
    if suffix in ('sxw', 'stw',				# OOo 1.x swriter
		    'sxc', 'stc',					# OOo 1.x scalc
		    'sxi', 'sti'					# OOo 1.x simpress
		    'sxg',							# OOo 1.x master document
		    'sxm',							# OOo 1.x formula
		    'sxd', 'std',					# OOo 1.x sdraw
		    'odt', 'ott',					# OOo 2.x swriter
		    'odp', 'otp',					# OOo 2.x simpress
		    'odf',							# OOo 2.x formula
		    'odg', 'otg',					# OOo 2.x sdraw
		    'ods', 'ots'					# OOo 2.x scalc
		    ):
	    zip = zipfile.ZipFile(filename, "r")
	    content = ""
	    docinfo = ""
	    try:
		    # TODO: are all OOo files utf-8?
		    content = unicode(zip.read("content.xml"), 'utf-8')
		    # TODO: is replace_with_space=0 correct?
		    content = self.removeXMLMarkup(content, replace_with_space=0)
		    docinfo = unicode(zip.read("meta.xml"), 'utf-8')
		    docinfo = self.removeXMLMarkup(docinfo, replace_with_space=0)
		    self.ooo_count = self.ooo_count + 1
	    except KeyError, err:
		    print "Warning: %s not found in '%s'" % (err, filename)
		    return None
	    title = ""
	    title_match = re.compile("<dc:title>(.*?)</dc:title>", re.DOTALL|re.IGNORECASE).search(docinfo)
	    if title_match:
		    title = title_match.group(1)
	    if self.match(query, "%s %s" % (content.lower(), docinfo.lower())):
		    return (filename, title)
    
  except zipfile.BadZipfile, err:
    print "Warning: Supposed ZIP file '%s' could not be opened: %s" % (filename, err)
  except IOError, err:
    print "Warning: File '%s' could not be opened: %s" % (filename, err)
  return None
Este código está en python y hace lo que se requiere, extrae el contenido y busca si el patrón de búsqueda se encuentra en el título, contenido o metadata del documento.

No te digo que hagas esto con cada búsqueda, sino que, se me ocurre que al momento de que se carga un nuevo documento al sistema se extraiga el contenido de este y se almacene en una bd o en otro lugar donde se nos simplifique la búsqueda.

Saludos
Responder Con Cita