Добавление пользовательского штампа PDF в документ из VBA
Я столкнулся с проблемой - мне нужно добавить пользовательский штамп (тип аннотации) для ряда файлов.pdf. Я могу сделать это с помощью Actions для Acrobat X Pro, но мои клиенты не имеют этой лицензии, и им все еще нужно это делать. Список файлов хранится в электронной таблице Excel, поэтому в идеале я ищу решение VBA. Я придумал следующий код:
Option Explicit
Sub code1()
Dim app As Acrobat.AcroApp
Dim pdDoc As Acrobat.CAcroPDDoc
Dim page As Acrobat.CAcroPDPage
Dim recter(3) As Integer 'Array defining the rectangle of the stamp - in real code wil be calculated, simplified for ease of reading
Dim jso As Object
Dim annot As Object
Dim props As Object
Set pdDoc = Nothing
Set app = CreateObject("AcroExch.App")
Set pdDoc = CreateObject("AcroExch.PDDoc")
recter(0) = 100
recter(1) = 100
recter(2) = 350
recter(3) = 350
pdDoc.Open ("C:\Users\maxim_s\Desktop\Code_1\test1.pdf")
Set jso = pdDoc.GetJSObject
If Not jso Is Nothing Then
Set page = pdDoc.AcquirePage(0)
Set annot = jso.AddAnnot
Set props = annot.getprops
props.page = 0
props.Type = "Stamp"
props.AP = "#eIXuM60ZXCv0sI-vxFqvlD" 'this line throws an error. The string is correct name of the stamp I want to add
props.rect = recter
annot.setProps props
If pdDoc.Save(PDSaveFull, "C:\Users\maxim_s\Desktop\Code_1\test123.pdf") = False Then
MsgBox "fail"
pdDoc.Close
Else
MsgBox "success"
pdDoc.Close
End If
End If
End Sub
Проблема с setprops
а также getprops
процедуры - кажется, что в момент создания аннотации (jso.AddAnnot
) не обладает AP
свойство, которое является названием марки, которую я хочу добавить. Если я установлю свойство Type= "Stamp"
а затем попробуйте указать AP
В результате добавляется одна из штампов по умолчанию, и AP
переименован в мои пользовательские марки AP
, Также обратите внимание, что если я запускаю acrobat и использую приведенный ниже код, добавляется правильный штамп:
this.addAnnot({page:0,type:"Stamp",rect:[100,100,350,350],AP:"#eIXuM60ZXCv0sI-vxFqvlD"})
Если есть способ выполнить этот Javascript из VBA внутри объекта PDDoc, это решит проблему, но пока что мне это не удалось.
2 ответа
Вы можете использовать "ExecuteThisJavaScript" из API-интерфейса AForm. Краткий пример:
Set AForm = CreateObject ("AFormAut.App")
AForm.Fields.ExecuteThisJavaScript "var x = this.numPages; app.alert (x);"
Преимущество в том, что вам не нужно переводить js-примеры в jso-код. Если вы ищете ExecuteThisJavaScript, вы получите еще больше и больше примеров.
Удачи, Рейнхард
В...
props.Type = "Stamp"
Тип должен быть в нижнем регистре. Но если чистый JavaScript работает из консоли, вы можете просто выполнить строку, используя jso.