使用 python 提取 docx 文件中的所有图像
Extract all the images in a docx file using python
我有一个包含 6-7 张图片的 docx 文件。我需要自动从此文档文件中提取图像。是否有任何 win32com
ms word API 相同?或者有没有可以准确提取里面所有图片的库?
这是我试过的方法,但问题是首先它没有给我所有的图像,其次它给了我很多虚假的图像,比如空白图像、极小的图像、线条等...
它也使用 MS word 来做同样的事情。
from pathlib import Path
from win32com.client import Dispatch
xls = Dispatch("Excel.Application")
doc = Dispatch("Word.Application")
def export_images(fp, prefix="img_", suffix="png"):
""" export all of images(inlineShapes) in the word file.
:param fp: path of word file.
:param prefix: prefix of exported images.
:param suffix: suffix of exported images.
"""
fp = Path(fp)
word = doc.Documents.Open(str(fp.resolve()))
sh = xls.Workbooks.Add()
for idx, s in enumerate(word.inlineShapes, 1):
s.Range.CopyAsPicture()
d = sh.ActiveSheet.ChartObjects().add(0, 0, s.width, s.height)
d.Chart.Paste()
d.Chart.Export(fp.parent / ("%s_%s.%s" % (prefix, idx, suffix))
sh.Close(False)
word.Close(False)
export_images(r"C:\Users\HPO2KOR\Desktop\Work\venv\us2017010202.docx")
您可以在此处下载 docx 文件 https://drive.google.com/open?id=1xdw2MieI1n3ulXlkr_iJSKb3cbozdvWq
在您的枚举循环中,您可能应该检查形状类型是否为图片:
for idx, s in enumerate(word.inlineShapes, 1):
if s.Type != 3: # wdInlineShapePicture
continue
# ...
您可以解压来自 docx
的所有图像,这些图像初步按大小过滤:
import zipfile
archive = zipfile.ZipFile('file.docx')
for file in archive.filelist:
if file.filename.startswith('word/media/') and file.file_size > 300000:
archive.extract(file)
在 your example 5
中找到图像:
再添加一种方法来完成相同的操作。我们可以使用 doc2txt
库来获取所有图像
import docx2txt
text = docx2txt.process("docx_file", r"directory where you want to store the images")
请注意,它还会在文本变量中提供在文件中找到的所有文本。
使用 python
提取 docx 文件中的所有图像
1。使用 docxtxt
import docx2txt
#extract text
text = docx2txt.process(r"filepath_of_docx")
#extract text and write images in Temporary Image directory
text = docx2txt.process(r"filepath_of_docx",r"Temporary_Image_Directory")
2。使用 aspose
import aspose.words as aw
# load the Word document
doc = aw.Document(r"filepath")
# retrieve all shapes
shapes = doc.get_child_nodes(aw.NodeType.SHAPE, True)
imageIndex = 0
# loop through shapes
for shape in shapes :
shape = shape.as_shape()
if (shape.has_image) :
# set image file's name
imageFileName = f"Image.ExportImages.{imageIndex}_{aw.FileFormatUtil.image_type_to_extension(shape.image_data.image_type)}"
# save image
shape.image_data.save(imageFileName)
imageIndex += 1
我有一个包含 6-7 张图片的 docx 文件。我需要自动从此文档文件中提取图像。是否有任何 win32com
ms word API 相同?或者有没有可以准确提取里面所有图片的库?
这是我试过的方法,但问题是首先它没有给我所有的图像,其次它给了我很多虚假的图像,比如空白图像、极小的图像、线条等... 它也使用 MS word 来做同样的事情。
from pathlib import Path
from win32com.client import Dispatch
xls = Dispatch("Excel.Application")
doc = Dispatch("Word.Application")
def export_images(fp, prefix="img_", suffix="png"):
""" export all of images(inlineShapes) in the word file.
:param fp: path of word file.
:param prefix: prefix of exported images.
:param suffix: suffix of exported images.
"""
fp = Path(fp)
word = doc.Documents.Open(str(fp.resolve()))
sh = xls.Workbooks.Add()
for idx, s in enumerate(word.inlineShapes, 1):
s.Range.CopyAsPicture()
d = sh.ActiveSheet.ChartObjects().add(0, 0, s.width, s.height)
d.Chart.Paste()
d.Chart.Export(fp.parent / ("%s_%s.%s" % (prefix, idx, suffix))
sh.Close(False)
word.Close(False)
export_images(r"C:\Users\HPO2KOR\Desktop\Work\venv\us2017010202.docx")
您可以在此处下载 docx 文件 https://drive.google.com/open?id=1xdw2MieI1n3ulXlkr_iJSKb3cbozdvWq
在您的枚举循环中,您可能应该检查形状类型是否为图片:
for idx, s in enumerate(word.inlineShapes, 1):
if s.Type != 3: # wdInlineShapePicture
continue
# ...
您可以解压来自 docx
的所有图像,这些图像初步按大小过滤:
import zipfile
archive = zipfile.ZipFile('file.docx')
for file in archive.filelist:
if file.filename.startswith('word/media/') and file.file_size > 300000:
archive.extract(file)
在 your example 5
中找到图像:
再添加一种方法来完成相同的操作。我们可以使用 doc2txt
库来获取所有图像
import docx2txt
text = docx2txt.process("docx_file", r"directory where you want to store the images")
请注意,它还会在文本变量中提供在文件中找到的所有文本。
使用 python
提取 docx 文件中的所有图像1。使用 docxtxt
import docx2txt
#extract text
text = docx2txt.process(r"filepath_of_docx")
#extract text and write images in Temporary Image directory
text = docx2txt.process(r"filepath_of_docx",r"Temporary_Image_Directory")
2。使用 aspose
import aspose.words as aw
# load the Word document
doc = aw.Document(r"filepath")
# retrieve all shapes
shapes = doc.get_child_nodes(aw.NodeType.SHAPE, True)
imageIndex = 0
# loop through shapes
for shape in shapes :
shape = shape.as_shape()
if (shape.has_image) :
# set image file's name
imageFileName = f"Image.ExportImages.{imageIndex}_{aw.FileFormatUtil.image_type_to_extension(shape.image_data.image_type)}"
# save image
shape.image_data.save(imageFileName)
imageIndex += 1