LibreOffice Writer 批量插入图片并添加题注的宏开发求助
问题原因说明
1. 录制宏重复插入相同代码、插入图片覆盖已有内容的问题
- 你遇到的单张图片录制得到两段完全相同的
uno:InsertGraphic调用,是LibreOffice宏录制器的已知特性:对插入图片操作会重复捕获一次执行指令,属于录制器的冗余输出,实际手动插入仅执行一次。 - 用dispatcher方式插入图片会覆盖已有内容,不是参数被覆盖的问题,是
dispatcher.executeDispatch执行时默认操作当前选中的内容,如果你插入前没有把光标移到空白位置、或者之前插入的图片处于选中状态,新插入的图片就会替换选中的内容,多图循环调用时很容易触发选中状态导致覆盖,所以你后来改用API直接创建GraphicObject的方案是更稳定的选择。
题注添加解决方案
你现有的add_picture函数已经可以稳定插入图片,只需要在插入图片后追加题注逻辑即可,参考修改后的完整代码如下:
Function add_picture(filePath As String, title As String) Dim doc As Object Dim text As Object Dim image As Object Dim cursor As Object doc = ThisComponent text = doc.CurrentSelection.getByIndex(0).End ' 插入图片 image = doc.createInstance("com.sun.star.text.GraphicObject") image.Title = title image.GraphicURL = ConvertToURL(filePath) image.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER image.Width = 2500 ' 单位为缇,1缇=1/1440英寸,可按需调整 image.Height = 2500 cursor = doc.Text.createTextCursorByRange(text) doc.Text.insertTextContent(cursor, image, False) ' ------------ 追加题注逻辑 ------------ ' 插入段落换行,跳到图片下方 doc.Text.insertControlCharacter(cursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) ' 插入题注内容,不需要"图 "前缀可以直接去掉,只保留title doc.Text.insertString(cursor, "图 " & title, False) ' 可选:给题注设置内置的图注段落样式(中文版本LibreOffice样式名可能为"图注",英文为"Illustration",如果不存在可以删除这行) cursor.ParaStyleName = "图注" ' 再插一个换行,方便下一张图片插入时不会和题注同行 doc.Text.insertControlCharacter(cursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) End Function
如果需要生成自动编号的题注,只需要在调用函数时自己维护一个全局的序号变量,循环插入图片时传入序号 & " " & title作为题注内容即可。
内容的提问来源于stack exchange,提问作者sjiamnocna
相关产品推荐
相关产品推荐

