python - 如何将带有图形标题的图像添加到 Word 文档中
问题描述
import win32com.client as win32
import os
#creating a word application object
wordApp = win32.gencache.EnsureDispatch('Word.Application') #create a word application object
wordApp.Visible = True # hide the word application
doc = wordApp.Documents.Add() # create a new application
#Formating the document
doc.PageSetup.RightMargin = 10
doc.PageSetup.LeftMargin = 10
doc.PageSetup.Orientation = win32.constants.wdOrientLandscape
# a4 paper size: 595x842
doc.PageSetup.PageWidth = 595
doc.PageSetup.PageHeight = 842
# Inserting Tables
my_dir="C:/Users/David/Documents/EGi/EGi Plots/FW_plots/Boxplots"
filenames = os.listdir(my_dir)
piccount=0
file_count = 0
for i in filenames:
if i[len(i)-3: len(i)].upper() == 'JPG': # check whether the current object is a JPG file
piccount = piccount + 1
print piccount, " images will be inserted"
total_column = 1
total_row = int(piccount/total_column)+2
rng = doc.Range(0,0)
rng.ParagraphFormat.Alignment = win32.constants.wdAlignParagraphCenter
table = doc.Tables.Add(rng,total_row, total_column)
table.Borders.Enable = False
if total_column > 1:
table.Columns.DistributeWidth()
#Collecting images in the same directory and inserting them into the document
piccount = 1
for index, filename in enumerate(filenames): # loop through all the files and folders for adding pictures
if os.path.isfile(os.path.join(os.path.abspath(my_dir), filename)): # check whether the current object is a file or not
if filename[len(filename)-3: len(filename)].upper() == 'JPG': # check whether the current object is a JPG file
piccount = piccount + 1
print filename, len(filename), filename[len(filename)-3: len(filename)].upper()
cell_column = (piccount % total_column + 1) #calculating the position of each image to be put into the correct table cell
cell_row = (piccount/total_column + 1)
#print 'cell_column=%s,cell_row=%s' % (cell_column,cell_row)
#we are formatting the style of each cell
cell_range= table.Cell(cell_row, cell_column).Range
cell_range.ParagraphFormat.LineSpacingRule = win32.constants.wdLineSpaceSingle
cell_range.ParagraphFormat.SpaceBefore = 0
cell_range.ParagraphFormat.SpaceAfter = 3
#this is where we are going to insert the images
current_pic=cell_range.InlineShapes.AddPicture(os.path.join(os.path.abspath(my_dir), filename))
#Currently this puts a lable in a cell after the pic, I want to put a proper ms word figure caption below the image instead.
table.Cell(cell_row, cell_column).Range.InsertAfter("\n"+"Appendix II Figure "+ str(piccount-1)+": "+filename[:len(filename)-4]+"\n"+"\n"+"\n")
else: continue
此代码获取所选目录中的所有图像并将它们放在 word doc 中的表格中,然后将文件名(去除文件 extn)放在下面的单元格中。我想要一个合适的数字标题(这样如果我插入更多图片,这些标题会更新),但我尝试过的一切都失败了。
我只是无法正确使用 VB 命令,这是:
table.Cell(cell_row, cell_column).Range.InsertAfter(InsertCaption(Label="Figure", Title=": "+filename[:len(filename)-4]))
在文档末尾给了我一个图形标题列表,这并不是我真正想要的。我觉得我很接近,但我无法完全理解。谢谢!
解决方案
为了使用 Word 的内置字幕而不是current_pic.InsertCaption
使用current_Pic.Range.InsertCaption
. InsertCaption
方法是Range
不是InlineShape
对象的成员。对我来说,这会自动在图片下方的自己的段落中插入标题。但是,如果您想明确“低于” Position
,也可以使用该参数:
current_pic.Range.InsertCaption(Label="Figure", Title=": "+filename[:len(filename)-4]), Position=win32.constants.wdCaptionPositionBelow
注意:当我测试您所说的代码行(在 VBA 中)时,FWIW 会在文档末尾为您提供一个标题列表,我确实在与插入图片相同的单元格中看到了文本。
推荐阅读
- knockout.js - foreach 绑定不会为单击应用父上下文
- csv - SAS Proc 导入 CSV 和缺失数据
- amazon-web-services - AWS rekognition:如何处理输出
- node.js - 是否可以从在 Linux 上运行的 nodejs 应用程序以 Windows 身份验证模式连接到 mssql?
- c# - 使用 Azure Http 触发器函数应用将 Cosmos DB 与 OData 集成
- python - 仅当它们包含粗体元素时如何提取html段落元素
- excel - if then elseif then 错误语句 excel vba
- android - Trouble Using Edit Search Function in Recycler View with Cards
- android - Tensorflow Lite 2.0+ 中 bindGlBufferToTensor 的任何替代方法?
- laravel - Laravel Forge - 通过裸 IP 而不是域名访问应用程序