Diese Operation wird nicht direkt unterstützt von der API.
Allerdings, wenn Sie bereit sind, in die Interna ein wenig zu graben und verwenden Sie die zugrunde liegende lxml
API ist es möglich. Der allgemeine Ansatz wäre, auf die ImagePart
Instanz zuzugreifen, die dem Bild entspricht, das Sie untersuchen und ändern möchten, und dann das ._blob
Attribut zu lesen und zu schreiben (das die Bilddatei als Byte enthält).
Dieses Exemplar XML könnte hilfreich sein: http://python-docx.readthedocs.io/en/latest/dev/analysis/features/shapes/picture.html#specimen-xml
Von der Inline-Form das Bild enthält, können Sie das <a:blip>
Element mit diesem erhalten:
blip = inline_shape._inline.graphic.graphicData.pic.blipFill.blip
Die Beziehung id (r: id Regel, aber r: in diesem Fall eingebettet) ist verfügbar unter:
rId = blip.embed
Dann können Sie den Bildteil her bekommen m, um das Dokument Teil
document_part = document.part
image_part = document_part.related_parts[rId]
Und dann das binäre Bild ist für Lesen und Schreiben auf ._blob
zur Verfügung.
Wenn Sie ein neues Blob schreiben, ersetzt es das vorherige Bild beim Speichern.
Sie möchten wahrscheinlich, dass es mit einem einzigen Bild funktioniert und ein Gefühl dafür bekommt, bevor Sie mehrere Bilder in einem einzigen Dokument skalieren.
Es gibt möglicherweise ein oder zwei Bildeigenschaften, die zwischengespeichert werden, so dass Sie möglicherweise nicht alle Feinheiten erhalten, bis Sie die Datei speichern und erneut laden. Achten Sie also darauf.
Nichts für schwache Nerven wie man sehen kann, sollte aber funktionieren, wenn Sie es schon schlimm genug wollen und ein wenig durch den Code zurückverfolgen kann :)
Sie diese win32com mit ziemlich leicht tun könnten, die die volle MS unterstützt Wortobjektmodell. Die python-docx-Bibliothek scheint besonders begrenzt zu sein, und zwar auch, wenn es darum geht, mit Shape-Objekten zu arbeiten oder darauf zuzugreifen. Außerdem unterstützt die 'InlineShapes'-Folge den indizierten Zugriff ([lies das Dox] (https://python-docx.readthedocs.io/en/latest/api/shape.html#docx.shape.InlineShapes)), während das' s 'hat keine' index'-Eigenschaft, Sie können sie als indizierte Sequenz behandeln. –
@DavidZemens könnten Sie bitte das Indexed Sequence-Konzept näher erläutern? –
Das bedeutet, dass die 'inline_shapes'-Folge geordnet ist und auf sie über einen Index zugegriffen werden kann, z. B.' doc.inline_shapes [0] ', usw., nein? https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences –