如何使用Basic在LibreOffice Draw指定页面插入图片
LibreOffice Draw Basic 脚本插入图片的修正方案
现有代码的两处核心问题
- 插入图片的逻辑方向错误:你之前使用的
FillStyle = BITMAP、FillBitmapURL = 图片路径是设置整个页面的位图背景属性,并非插入可独立移动、编辑的图片形状对象,且该属性配置对参数类型、赋值顺序有严格要求,很容易触发运行报错,也不符合“在页面插入图片”的实际需求 - 新建第二页的索引参数错误:空白Draw文档初始仅包含1个绘图页(索引为0),使用
insertNewByIndex(2)新建页面时,传入的索引超出了可插入范围,会触发页面创建失败的问题,正确的插入位置索引应为1
正确实现逻辑
Draw文档中的图片是独立的图形形状对象,需要通过创建 com.sun.star.drawing.GraphicObjectShape 类型的形状实例,绑定图片URL后添加到对应绘图页中,而非修改页面本身的填充属性。
可直接运行的修正代码
sub InsertImage() Dim Doc As Object Dim Page1 As Object Dim Page2 As Object Dim ImageShape As Object ' 转换图片路径为系统可识别的URL格式 Dim ImagePath1 As String ImagePath1 = ConvertToURL("C:/Images/MyImage1.jpg") Dim ImagePath2 As String ImagePath2 = ConvertToURL("C:/Images/MyImage2.jpg") Dim emptyArgs() Dim docCreateUrl As String docCreateUrl = "private:factory/sdraw" ' 新建空白Draw文档 Doc = StarDesktop.LoadComponentFromUrl(docCreateUrl, "_blank", 0, emptyArgs) ' 操作第一页 Page1 = Doc.DrawPages(0) Page1.Name = "Image1" ' 创建图片形状 ImageShape = Doc.createInstance("com.sun.star.drawing.GraphicObjectShape") ImageShape.GraphicURL = ImagePath1 ' 设置图片位置与尺寸,单位为1/100毫米 ImageShape.PositionX = 15000 ImageShape.PositionY = 10000 ImageShape.Width = 10000 ImageShape.Height = 7000 ' 将图片形状添加到第一页 Page1.add(ImageShape) ' 在索引1位置新建第二页 Page2 = Doc.DrawPages.insertNewByIndex(1) Page2.Name = "Image2" ' 创建第二页的图片形状 ImageShape = Doc.createInstance("com.sun.star.drawing.GraphicObjectShape") ImageShape.GraphicURL = ImagePath2 ImageShape.PositionX = 15000 ImageShape.PositionY = 10000 ImageShape.Width = 10000 ImageShape.Height = 7000 Page2.add(ImageShape) End sub
实操注意事项
- 图片路径请填写绝对路径,使用相对路径大概率会出现文件找不到的报错
- 形状的位置、尺寸参数可根据实际页面大小、图片比例自由调整,若需要保留图片原始比例,可在设置宽高前读取图片的实际分辨率再按比例计算适配尺寸
- 上述方法插入的图片是独立的可编辑对象,支持后续调整大小、位置、添加效果等操作,和手动插入图片的效果完全一致
内容的提问来源于stack exchange,提问作者hemis
相关产品推荐
相关产品推荐

