我正在创建一个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发布服务器映像的结果。
非常感谢,
罗布
答案 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代码可以帮助你使用对象模型