【筆記】python docx 抓圖

Young Tsai
Young
Published in
3 min readFeb 13, 2020

--

需求:

給你一個 word 檔,裡面有表格,表格部分欄位裡面有文字、圖片,一列就是一組單位,如下圖,第二列、第三欄就有文字跟兩張圖

我們要如何抓取一整列的內容,並且依序放入 json 呢?

先學習如何使用 python-docx

套件 doc:python-docx

使用方法:參考 Day20-Python 操作 docx 文件

Note- 讀取 docx 文件

import docx
from docx import Document #导入库
path = "/home/jovyan/work/JunyiDataAnalysis/Young/107.docx" #文件路径document = Document(path) #读入文件
tables = document.tables #获取文件中的表格集
table = tables[1] #获取文件中的第一个表格

先依據文件 path 讀取檔案,只能是 docx 格式

讀取 doc 後,可以用 document.tables 抓取表格,表格會以 object 的形式先存在 list 裡面

接下來,你會想在某張 table 的每一格裡面探索,這時候可以把每一個格子當成是一個小 doc,如下:

doc = table.cell(9,5)
paras = doc.paragraphs
print(paras[0].text)

我們先拿到一個 cell,並且取得每一個段落(paragraphs),你便可以拿取每個段落的文字 by .text 這個 function

但是圖檔卻非常難拿,因為 python-docx 文檔只有教你怎麼 add_picture(),也就是怎麼放入圖檔到 word 裡面,卻沒有教你怎麼抓取

網路上,關於這樣的討論也很少,於是參考這兩篇:

簡單來說,就是檢視 docx 的 xml 格式,而 xml 格式裡面有清楚的規則及tag,標注不同格式的內容,因此,我們可以很快速的在每個段落裡面的 xml 找出圖檔及其順序位置

如上述代碼:我們先找到 paragraph 的 xml,並且知道圖檔的 tags 存在 namespace 裡面,逐行去找,且透過一些 attr, 我們會得到 imgs 在段落裡的代碼,通常會長得像這樣:rID1, rID2 …

接下來,可能會想要把它儲存或是丟上雲端,我們先實作 local storage

有了 rID 之後,我們利用 .part.related_parts[rid] 抓去 圖檔 object


doc.part.related_parts[rid]

有了 img object 就可以做儲存等動作了

--

--