====== Word ====== Para trabajar con Word desde Python usaremos el módulo de terceros Python-Docx en su versión 0.8.10: **pip install --user -U python-docx==0.8.10**.\\ Se puede encontrar su documentación en [[https://python-docx.readthedocs.io/|su página oficial]].\\ \\ Los documentos Word guardan una gran estructura en comparación con los documentos de texto plano. \\ Los documentos Word (de tipo //Document//) se dividen en párrafos (porciones de texto limitadas por saltos de línea, datos de tipo //Paragraph//), que a su vez se dividen en porciones de texto //Run// diferenciados por tener diferentes estilos. ===== Lectura de documentos Word ===== Se abre el documento con la función **docx.Document('**//Nombre_documento//.docx**')** y se asigna el resultado tipo //Document// a una variable.\\ Se puede conocer el número de párrafos del documento con la función len() y el atributo de documento **paragraphs**: **len(doc.paragraphs)**.\\ Se accede a cada párrafo del documento como si se tratase de una lista, pero para obtener su contenido en texto plano, se usa el atributo **text**: **doc.paragraphs[0].text**.\\ Para conocer el número de //runs// dentro de un párrafo, podemos usar también la función len() sobre un párrafo y el atributo **runs**: **len(doc.paragraphs[1].runs)**.\\ Y del mismo modo que con los párrafos, podemos aceder a los //runs// del párrafo como si de una lista anidada se tratase y recuperarlos en texto plano con el atributo **text**: **doc.paragraphs[1].runs[0].text**. Ejemplo para obtener el texto plano completo de un documento. import docx def getText(filename): doc = docx.Document(filename) textoCompleto=[] for parrafo in doc.paragraphs: textoCompleto.append(parrafo.text) return '\n'.join(textoCompleto) ===== Estilos de párrafo y runs ===== En Word de Windows pueden verse los diferentes estilos con la //hotkey// ctrl+Alt+May+s.\\ Para los documentos Word se pueden asignar 3 tipos de estilos: * **//Paragraph styles//** Se aplican a párrafos. * **//Character styles//** Se aplican a objetos //Run//. * **//Linked styles//** Se aplican a párrafos y //Runs//. Con el atributo **style** se le puede asignar estilos a Runs y a párrafos. Para ello hay que indicar el estulo en un string que debe coincidir con los estilos disponibles. Cuando se usa un //linked style// con un Run, además de especificar un string con el nombre del estilo, hay que añadir ' Char'. # ... objetoParrafo.style = 'Quote' objetoRun.style = 'Quote Char' # Para asignar el mismo estilo que al párrafo # ... Si se indica como estilo None, toma el estilo por defecto.\\ En la versión de Python-Docx 0.8.10 en la que estamos trabajando no se pueden crear estilos, sólo pueden usarse los que trae Word por defecto y los que ya estén creados en ese documento previamente. ===== Atributos de Runs ===== Los atributos de run define el estilo de los strings correspondientes. Para activarlos o no, se especifican en un balor booleano True o False. También None para tomar el valor por defecto.\\ \\ Los atributos son: * bold * italic * underline * strike * double_strike * all_caps * small_caps * shadow * outline Se define un cuadro alrededor del texto. * rtl Texto de derecha a izquierda. * imprint * emboss ===== Escribir en documentos Word ===== Se crea un nuevo documento con la función **docx.Document()** sin argumentos, y asignando el resultado a una variable para poder trabajar con él.\\ Para añadir un párrafo se utiliza el método doc.**add_paragraph(**//texto//**)**.\\ No olvidar guardar el documento, para que éste sea creado: oc.**save(**//nombreDocumento//.docx**)**.\\ Para cada párrafo se pueden añadir runs con el método **add_run**: import docx doc = docx.Document() doc.add_paragraph('Hello world!') parrafo2 = doc.add_paragraph('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas est enim, suscipit at ornare vitae, molestie blandit ante.') parrafo2.add_run('Morbi blandit ligula ac ipsum condimentum hendrerit.') doc.save('loremIpsum.docx') Los métodos **add_paragraphs** y **add_run** aceptan como segundo elemento uno de los estilos disponibles. ===== Añadiendo encabezados ===== Se utiliza la función **add_headings()** en el objeto //Document//. El primer arumento es texto, y el segundo el nivel del encabezado, siendo el mayor 0.\\ De cara al Documento, son tratados como párrafos, puesto que terminan en salto de línea. ===== Añadiendo líneas y saltos de página ===== Para añadir una línea, se utiliza el método de documento, párrafo o run **add_breack()**.\\ Para añadir un salto de línea se añade el argumento **docx.enum.text.WD_BREAK.PAGE** al método add_breack().\\ ===== Añadiendo imágenes ===== Se utiliza el método de documento doc.**add_picture()**, en el que se indican los siguientes argumentos: - Nombre de la imagen, incluyendo dirección, si no está en el directorio de trabajo. - **width = docx.shared.Inches(**//número de pulgadas//**)** # Anchura de la imagen en pulgadas. - **height= docx.shared.Cm(**//número de centímetros//**)** # Anchura de la imagen en centímetros. Tanto la altura //height//, como la anchura //width//, pueden expresarse en centímetros o pulgadas. ===== Creando PDFs a partir de documentos Word ===== Para ello necesitamos otro módulo: Pywin32. Es un módulo de terceros que hay que instalar pip install --user -U pywin32==224 Una vez hemos guardado el documento Word, vamos a guardarlo en pdf. Lo primero es conocer el número que indica el formato de guardado PDF en el listado de tipos de archivo a guardar, en el ejemplo de estas notas es el 17.wdFormatPDF = 17 # Word's numeric code for PDFs. A continuación, obtenemos un objeto que representa la aplicación Word: wordObj = win32com.client.Dispatch('Word.Application') Y otro a partir de éste, que representa el documento en un formato propio de la biblioteca instalada docObj = wordObj.Documents.Open(wordFilename). Entonces ya podemos proceder al guardado en PDF docObj.SaveAs(pdfFilename, FileFormat=wdFormatPDF) Tras lo cual cerraremos los objetos abiertos anteriormente.\\ Puede verse todo el proceso en el siguiente ejemplo. # ... doc.save(wordFilename) wdFormatPDF = 17 # Word's numeric code for PDFs. wordObj = win32com.client.Dispatch('Word.Application') docObj = wordObj.Documents.Open(wordFilename) docObj.SaveAs(pdfFilename, FileFormat=wdFormatPDF) docObj.Close() wordObj.Quit()