Buscamos por diferentes foros para traerte la solución para tu duda, si continúas con inquietudes déjanos la inquietud y te responderemos porque estamos para servirte.
Solución:
Esta operación no es compatible directamente con la API.
Sin embargo, si está dispuesto a indagar un poco en las partes internas y usar el lxml
API es posible.
El enfoque general sería acceder a la ImagePart
instancia correspondiente a la imagen que desea inspeccionar y modificar, luego lea y escriba el ._blob
attribute (que contiene el archivo de imagen como bytes).
Este XML de muestra podría ser útil: http://python-docx.readthedocs.io/en/latest/dev/analysis/features/shapes/picture.html#specimen-xml
De la forma en línea que contiene la imagen, se obtiene la
elemento con esto:
blip = inline_shape._inline.graphic.graphicData.pic.blipFill.blip
La identificación de la relación (r:id generalmente, pero r:embed en este caso) está disponible en:
rId = blip.embed
Luego puede obtener la parte de la imagen de la parte del documento.
document_part = document.part
image_part = document_part.related_parts[rId]
Y luego la imagen binaria está disponible para lectura y escritura en ._blob
.
Si escribe un nuevo blob, reemplazará la imagen anterior cuando se guarde.
Probablemente desee que funcione con una sola imagen y familiarizarse con ella antes de escalar a varias imágenes en un solo documento.
Puede haber una o dos características de imagen almacenadas en caché, por lo que es posible que no obtenga todos los puntos más finos hasta que guarde y vuelva a cargar el archivo, así que esté atento a eso.
No es para los débiles de corazón, como puede ver, pero debería funcionar si lo desea lo suficiente y puede rastrear un poco el código 🙂
También puede inspeccionar párrafos con un bucle simple y verificar qué xml contiene una imagen (por ejemplo, si un xml contiene “graphicData”), es decir, cuál es un contenedor de imágenes (puede hacer lo mismo con las ejecuciones):
from docx import Document
image_paragraphs = []
doc = Document(path_to_docx)
for par in doc.paragraphs:
if 'graphicData' in par._p.xml:
image_paragraphs.append(par)
Después de descomprimir el archivo docx, las imágenes están en la carpeta “imágenes” y están en el mismo orden en que estarán en la lista image_paragraphs. En cada elemento de párrafo, tiene muchas opciones para cambiarlo. Si desea extraer img, procéselo y luego insértelo en el mismo lugar, entonces
paragraph.clear()
paragraph.add_run('your description, if needed')
run = paragraph.runs[0]
run.add_picture(path_to_pic, width, height)