python-docx 解析文字與圖片


python-docx是用來解析docx類型文檔的庫,可以方便提取每個段落中的文字,但是對圖片和表格沒有辦法處理。使用網上的這段代碼,可以批量提取docx文檔中圖片,但無法保留與文字的相關次序:

from os.path import basename from docx import Document file_name = "D:/2.docx" doc = Document(file_name) for shape in doc.inline_shapes: contentID = shape._inline.graphic.graphicData.pic.blipFill.blip.embed contentType = doc.part.related_parts[contentID].content_type if not contentType.startswith('image'): continue imgName = basename(doc.part.related_parts[contentID].partname) print(contentID, contentType, imgName) # imgData = doc.part.related_parts[contentID]._blob imgData = doc.part.related_parts[contentID].blob with open('D:/docx_pro/output/' + imgName, 'wb') as fp: fp.write(imgData) 

上述代碼利用Document對象中inline_shapes方法遍歷出所有圖片的標簽,並映射到文檔中圖片,進而輸出。實際上,內聯的圖片ID存在於paraghaphs對象中的runs對象中,可以使用element.xml屬性正則提取ID,進而序化保存,修改代碼為:

from docx import Document from os.path import basename import re file_name = "D:/2.docx" doc = Document(file_name) a = list() pattern = re.compile('rId\d+') for graph in doc.paragraphs: b = list() for run in graph.runs: if run.text != '': b.append(run.text) else: # b.append(pattern.search(run.element.xml)) contentID = pattern.search(run.element.xml).group(0) try: contentType = doc.part.related_parts[contentID].content_type except KeyError as e: print(e) continue if not contentType.startswith('image'): continue imgName = basename(doc.part.related_parts[contentID].partname) imgData = doc.part.related_parts[contentID].blob b.append(imgData) a.append(b) 

這樣就可以得到文檔的序化列表,保存到mongodb中。

python-docx-images

對於docx文檔轉換並保存到數據庫中,這里存在多個問題:

  • 原始格式丟失,不過對於輕格式文檔來說,不是問題
  • 圖片中存在類似於wmfemf格式的圖片,網頁無法顯示,這也是mammoth庫轉docx文檔會出現某些圖片不顯示的問題。兩種思路解決:
  • wmf類型轉成png等類型,但這會丟失公式的排版和可編輯性
  • wmf類型轉換或識別為LaTeX格式,mathtype可以實現,但對emf格式不行;mathpix有圖片識別接口,超量收費;網上存有im2latex的庫,試過一個,效果不如mathpix,后期填坑目標
  • 表格數據丟失,嘗試用Document屬性解決,目前沒有找到合適的,但mammoth庫可以顯示table塊,雖然樣式有問題,后期嘗試用其源碼實現下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM