Saltar al contenido

Reemplazar texto en docx y guardar el archivo modificado con python-docx

Por fin luego de mucho batallar ya dimos con la solución de este enigma que tantos lectores de nuestro sitio web han presentado. Si deseas aportar alguna información puedes aportar tu conocimiento.

Solución:

esto funcionó para mí:

def docx_replace(old_file,new_file,rep):
    zin = zipfile.ZipFile (old_file, 'r')
    zout = zipfile.ZipFile (new_file, 'w')
    for item in zin.infolist():
        buffer = zin.read(item.filename)
        if (item.filename == 'word/document.xml'):
            res = buffer.decode("utf-8")
            for r in rep:
                res = res.replace(r,rep[r])
            buffer = res.encode("utf-8")
        zout.writestr(item, buffer)
    zout.close()
    zin.close()

Tal como parece, Docx para Python no está destinado a almacenar un Docx completo con imágenes, encabezados, …, sino que solo contiene el contenido interno del documento. Así que no hay una manera simple de hacer esto.

Sin embargo, así es como podrías hacerlo:

Primero, eche un vistazo a la wiki de etiquetas docx:

Explica cómo se puede descomprimir el archivo docx: Así es como se ve un archivo típico:

+--docProps
|  +  app.xml
|    core.xml
+  res.log
+--word //this folder contains most of the files that control the content of the document
|  +  document.xml //Is the actual content of the document
|  +  endnotes.xml
|  +  fontTable.xml
|  +  footer1.xml //Containst the elements in the footer of the document
|  +  footnotes.xml
|  +--media //This folder contains all images embedded in the word
|  |    image1.jpeg
|  +  settings.xml
|  +  styles.xml
|  +  stylesWithEffects.xml
|  +--theme
|  |    theme1.xml
|  +  webSettings.xml
|  --_rels
|       document.xml.rels //this document tells word where the images are situated
+  [Content_Types].xml
--_rels
     .rels

Docx solo obtiene una parte del documento, en el método abrirdocx

def opendocx(file):
    '''Open a docx file, return a document XML tree'''
    mydoc = zipfile.ZipFile(file)
    xmlcontent = mydoc.read('word/document.xml')
    document = etree.fromstring(xmlcontent)
    return document

Solo obtiene el archivo document.xml.

Lo que te recomiendo hacer es:

  1. obtener el contenido del documento con **opendocx*
  2. Reemplace el documento.xml con el advReemplazar método
  3. Abra el docx como un zip y reemplace el contenido de document.xml por el nuevo contenido xml.
  4. Cierra y genera el archivo comprimido (cambiándole el nombre a output.docx)

Si tiene node.js instalado, tenga en cuenta que he trabajado en DocxGenJS, que es un motor de plantillas para documentos docx, la biblioteca está en desarrollo activo y se lanzará pronto como un módulo de nodo.

¿Está utilizando el módulo docx de aquí?

En caso afirmativo, entonces el módulo docx ya expone métodos como replace, advReplace, etc. que pueden ayudarlo a lograr su tarea. Consulte el código fuente para obtener más detalles de los métodos expuestos.

Calificaciones y comentarios

Tienes la opción de asistir nuestra labor poniendo un comentario y valorándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *