2016-12-17 2 views
2

Ich versuche, den Bildindex aus der DOCX-Datei mit python-docx Bibliothek zu bekommen. Ich bin in der Lage, den Namen des Bildes, Bildhöhe und Breite zu extrahieren. Aber nicht der Index, in dem es in der Wort-DateiBildposition aus DOCX-Datei extrahieren mit Python-DOCX

import docx 
doc = docx.Document(filename) 
for s in doc.inline_shapes: 
    print (s.height.cm,s.width.cm,s._inline.graphic.graphicData.pic.nvPicPr.cNvPr.name) 

Ausgang 21,228 15,920 IMG_20160910_220903848.jpg

In der Tat würde ich gerne wissen, ob es eine einfachere Möglichkeit ist es, die Bildnamen zu bekommen, wie s.height.cm holte mir die Höhe in cm. Meine primäre Anforderung ist es, herauszufinden, wo das Bild im Dokument ist, weil ich das Bild extrahieren und etwas daran arbeiten muss und dann das Bild wieder an den gleichen Ort setzen muss

+0

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. –

+0

@DavidZemens könnten Sie bitte das Indexed Sequence-Konzept näher erläutern? –

+0

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 –

Antwort

4

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 :)