2016-12-17 18 views
2

python-docxライブラリを使用して.docxファイルから画像インデックスを取得しようとしています。イメージの名前、イメージの高さと幅を抽出できます。しかし、ではない、それは言葉であるインデックスは、ファイルpython-docxを使用して.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) 

出力 21.228 15.920 IMG_20160910_220903848.jpg私はイメージ名を取得する任意の簡単な方法があればのように、知っていただきたいと思います実際に

s.height.cm私の高さをcm単位で取得しました。私の主な要件は、画像を抽出してその上で何か作業をしてから再び同じ場所に戻す必要があるため、画像が文書内のどこにあるかを知ることです。

+0

あなたは完全なMSをサポートするwin32comを使用してかなり簡単にこれを行うことができますワードオブジェクトモデル。 python-docxライブラリは特に限定されているようですが、Shapeオブジェクトの操作やアクセスには特に注意が必要です。また、 'InlineShapes'シーケンスはインデックス付きアクセス([read the dox](https://python-docx.readthedocs.io/en/latest/api/shape.html#docx.shape.InlineShapes)をサポートしています) s'は 'index'プロパティを持っていませんので、インデックス付きのシーケンスとして扱うことができます。 –

+0

@DavidZemensでは、索引付けされたシーケンスの概念について詳しく説明できますか? –

+0

これは、 'inline_shapes'シーケンスが順序付けされ、例えば' doc.inline_shapes [0] 'などのインデックスでアクセスできることを意味します。 https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences –

答えて

4

この操作は直接サポートされていませんAPIによって

しかし、内部的に少し掘り下げて基礎となるlxml APIを使用することができます。

一般的なアプローチは、検査して変更する画像に対応するImagePartインスタンスにアクセスし、._blob属性(画像ファイルをバイトとして保持)を読み書きすることです。この試料XMLが役に立つかもしれません

blip = inline_shape._inline.graphic.graphicData.pic.blipFill.blip 

関係ID(R: http://python-docx.readthedocs.io/en/latest/dev/analysis/features/shapes/picture.html#specimen-xml

画像を含むインライン形状から、あなたはこれで<a:blip>要素取得ID一般的に、しかし、 r:この場合の埋め込み)は

rId = blip.embed 

で入手できます文書の一部が

document_part = document.part 
image_part = document_part.related_parts[rId] 

mおよびバイナリ画像を読み出して._blobに書き込むために利用可能です。

新しいBLOBを書き込むと、保存すると以前の画像と置き換えられます。

1つの画像で複数の画像に拡大する前に、1つの画像で作業して気分を味わいたいと思うかもしれません。

イメージ特性がキャッシュされている可能性があります。そのため、ファイルを保存して再読み込みするまで、細かい点がすべて機能しない可能性があります。あなたが見ることができますが、あなたは十分にそれが悪いしたい場合は動作するはずですし、コードを介してビットをトレースできるよう心の弱い人のための

ない:)

関連する問題