使用PowerShell更改MS Office发布者中的图像

时间:2017-03-31 10:19:02

标签: powershell ms-office ms-publisher

我正在创建一个PowerShell脚本,它将自动生成腕带的发布者文件。在腕带上有一个QR码和一些其他细节来识别佩戴者。我目前有一个模板文件设置,一个复制它的脚本,重命名它,并编辑页面上的一些文本。

我需要将脚本中的占位符图像更改为QR码图像,QR中的数据仅来自设定数量的图像(1800个中的一个),所有都已生成并命名为与Powershell中使用的名称相匹配。

之前是否有人使用PowerShell在MS Publisher中更改过图像?以下是我目前的代码。

$CurrentMember = "M001S001"
$CurrectDocumet = "C:\Users\Rob\Documents\DistrictCamp2017\GeneratedFiles\" + $CurrentMember + ".pub"

copy-item "C:\Users\Rob\Documents\DistrictCamp2017\TemplateWristband.pub" "C:\Users\Rob\Documents\DistrictCamp2017\GeneratedFiles"
Rename-Item "C:\Users\Rob\Documents\DistrictCamp2017\GeneratedFiles\TemplateWristband.pub" "$CurrentMember.pub"

Add-Type -AssemblyName Microsoft.Office.Interop.Publisher
$Publisher = New-Object Microsoft.Office.Interop.Publisher.ApplicationClass

$OpenDoc = $Publisher.Open("C:\Users\Rob\Documents\DistrictCamp2017\GeneratedFiles\M001S001.pub")

###Replace Barcode and text

$pbReplaceScopeAll = 2

$OpenDoc.Find.Clear()
$OpenDoc.Find.FindText = "DEFAULT"
$OpenDoc.Find.ReplaceWithText = $CurrentMember
$OpenDoc.Find.ReplaceScope = "2" #$pbReplaceScopeAll
$OpenDoc.Find.Execute() 

$OpenDoc.Save()
$OpenDoc.Close()
$Publisher.quit()

模板文档中的图像目前是一个空白的145 * 145像素正方形,将由相应的QR代码图像替换,具体取决于$ CurrentMember的值。我还没有写任何东西来尝试更改图像,因为我在网上找不到任何东西,我搜索的任何内容似乎都会返回有关Azure发布服务器映像的结果。

非常感谢,

罗布

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是通过索引获取形状,然后在其位置添加新图片,然后删除原始形状:

Sub ReplaceFirstShapeWithImage()
    Dim oPage As Page
    Dim oShape As Shape
    Dim newImage As Shape

    Set oPage = Application.ActiveDocument.ActiveView.ActivePage

    Set oShape = oPage.Shapes(1)

    ''https://msdn.microsoft.com/en-us/library/office/ff940072.aspx
    Set newImage = oPage.Shapes.AddPicture("C:\Users\johanb\Pictures\X.png", msoFalse, msoTrue, oShape.Left, oShape.Top, oShape.Width, oShape.Height)

    oShape.Delete

End Sub

这可以帮助您找到正确的索引

Sub GetIndexOfSelectedShape()

    If Application.Selection.ShapeRange.Count = 0 Then
        MsgBox "Please select a shape first"
        Exit Sub
    End If

    Dim oShape As Shape
    Dim oLoopShape As Shape
    Dim i As Long

    Set oShape = Application.Selection.ShapeRange(1)

    For i = 1 To oShape.Parent.Shapes.Count
        Set oLoopShape = oShape.Parent.Shapes(i)
        If oLoopShape Is oShape Then
            MsgBox oShape.Name & " has index " & i
        End If
    Next i

End Sub

不幸的是我现在不能使用PowerShell,但是这个VBA代码可以帮助你使用对象模型