请选择 进入手机版 | 继续访问电脑版

LibreOffice中文社区

 找回密码
 马上加入

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
开启左侧

[经验分享] Writer 中利用宏插入整个文件夹的图片

[复制链接]
ACTom 发表于 2014-7-8 10:00:21 | 显示全部楼层 |阅读模式
点击工具-宏-管理宏-LibreOffice Basic。
左侧展开当前文档-Standard,点击右侧新建,确定。
将Sub Main改成Sub InsertPic   (这步可以不做)
输入如下代码:
[Visual Basic] 纯文本查看 复制代码
Sub InsertPic
	Dim dirPath, sValue, fileName As String
	
	oDoc = ThisComponent
	dirPath = "/home/Tom/Pictures"
	
	sValue = Dir$(dirPath + getPathSeparator + "*.png", 0)   REM 0表示普通文件,16表示文件夹
	Do
        If sValue <> "." And sValue <> ".." And sValue <> "" Then
            fileName = dirPath + getPathSeparator + sValue
            REM 开始插入图片
            oImage = oDoc.createInstance("com.sun.star.text.GraphicObject")
			With oImage
			   .GraphicURL = ConvertToURL(fileName)
			   .AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
			   REM .Width = 3000   REM 取消注释可以设置图片默认大小
			   REM .Height = 3000
			End With
			
			REM oCursor = oDoc.getText.createTextCursor() REM 文档开头
			REM	oCursor = oDoc.getText.getEnd() REM 文档结尾
			
			REM 当前光标位置
			oVC = thisComponent.getCurrentController.getViewCursor
			oCursor = oVC.getText.createTextCursorByRange(oVC)
			
			
			oDoc.getText.insertTextContent( oCursor, oImage, False )
        End If
        sValue = Dir$
    Loop Until sValue = ""
End Sub


suokunlong 发表于 2014-7-8 20:48:09 | 显示全部楼层
我将ACTom的代码改进了一下,现在执行该宏时可以弹出一个对话框让用户选择需要插入的图片:

[Visual Basic] 纯文本查看 复制代码
Sub InsertPics
        
        oDoc = ThisComponent
        
        REM  建立 FilePicker service, 用于弹出一个对话框,来选择要插入的图片
	REM  http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1ui_1_1dialogs_1_1FilePicker.html
        Dim FilePicker as object
        FilePicker=createUnoService("com.sun.star.ui.dialogs.FilePicker")
        FilePicker.setTitle("请选择要插入的图片")        REM 设定对话框标题
        FilePicker.setMultiSelectionMode(true)        REM 允许选择多个图片
        FilePicker.appendFilter("Images", "*.jpg;*.png")        REM 设定一个filter,只能选择图像文件,以免插入时发生错误
        FilePicker.execute                                                REM 弹出对话框
        
        Dim PicPaths()
        PicPaths=FilePicker.getSelectedFiles()                        REM 获取所选择的图片的链接,保存在PicPaths数组中

        Dim numberofPics        REM 所选择的图片数量
        numberOfPics=Ubound(PicPaths)
        
        Dim i        REM 开始循环
        Dim url as string
        for i=0 to numberOfPics step 1
                url=""
                url=PicPaths(i)
                
                REM 开始插入图片
                oImage = oDoc.createInstance("com.sun.star.text.TextGraphicObject")
                With oImage
                        .GraphicURL = url
                        .AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
                        REM .Width = 3000   REM 取消注释可以设置图片默认大小
                        REM .Height = 3000
                End With
             
                REM oCursor = oDoc.getText.createTextCursor() REM 文档开头
                REM oCursor = oDoc.getText.getEnd() REM 文档结尾
             
                REM 当前光标位置
                oVC = thisComponent.getCurrentController.getViewCursor
                oCursor = oVC.getText.createTextCursorByRange(oVC)
                oDoc.getText.insertTextContent(oCursor, oImage, False)
        next i
        
        If i <> 0 then
                Msgbox ("插入了" & i & "张图片!")
        end if

End Sub


唯一的遗憾在于,我还没找到自动将超宽的图片缩放到页宽的100%、且保持纵横比的方法。
为LibreOffice社区做贡献 = 参加公益活动
suokunlong 发表于 2016-3-21 18:07:49 | 显示全部楼层
suokunlong 发表于 2014-7-8 20:48
我将ACTom的代码改进了一下,现在执行该宏时可以弹出一个对话框让用户选择需要插入的图片:

[mw_shl_code= ...

发现了一个插件,可以完美解决这个问题: http://extensions.libreoffice.org/extension-center/addpics

插件功能:
  • 从某个文件夹一次性插入多张图片到文档中;
  • 可设置排序选项:按数字,按首字母,按日期。
  • 插入时可设置图片锚定选项:锚定到页面、到段落、到字符、当作字符。

用法:
  • 安装该插件并重启LibreOffice;
  • 将要插入的图片放到某个文件夹中;
  • 运行插入-Pictures in a new document,或者工具栏上的该图标。

注意,排序选项和锚定选项必须选择,否则会崩溃。

下一步,我将尝试汉化这个插件、解决不选择排序选项和锚定选项崩溃的问题,并发给原作者让更新官方库中的版本。

为LibreOffice社区做贡献 = 参加公益活动
*滑动验证:
您需要登录后才可以回帖 登录 | 马上加入

本版积分规则

小黑屋|手机版|Archiver|LibreOffice中文社区    

GMT+8, 2017-9-20 06:13 , Processed in 0.250239 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表