【问题标题】:Adding custom pdf stamp to document from VBA从 VBA 向文档添加自定义 pdf 图章
【发布时间】:2017-02-27 00:27:12
【问题描述】:

我遇到了一个问题 - 我需要将自定义图章(注释类型)添加到多个 .pdf 文件中。我可以通过 Actions for 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

问题出在setpropsgetprops 程序上——似乎在创建注释时(jso.AddAnnot)它不拥有AP 属性,这是我标记的名称想补充。如果我先设置属性Type= "Stamp",然后尝试指定AP,结果是添加了一个默认图章,并且它的AP 被重命名为我的自定义图章AP。另请注意,如果我启动 acrobat 并使用下面的代码,则会添加正确的标记:

this.addAnnot({page:0,type:"Stamp",rect:[100,100,350,350],AP:"#eIXuM60ZXCv0sI-vxFqvlD"})

如果有办法从 PDDoc 对象内部的 VBA 执行此 Javascript,那将解决问题,但到目前为止我失败了。

【问题讨论】:

  • 嗨,我也不知道该怎么做。但是如何使用 VBA 插入一个以您的图章/符号作为内容的文本框。将文件打印/导出为 PDF,然后隐藏/清除文本框?

标签: javascript vba pdf acrobat acrobat-sdk


【解决方案1】:

在...

props.Type = "Stamp"

类型应为小写。但是,如果纯 JavaScript 在控制台中运行,您可能会考虑只使用 jso 执行字符串。

【讨论】:

  • 我似乎无法理解如何将纯 java 插入 vba 代码并让 java 运行。到目前为止,我得到的最好的结果是实际打开 .pdf 并显示其中包含所需代码的 javascript 调试器,但我必须手动按 ctrl-enter,这不是解决方案。
【解决方案2】:

您可以使用 AForm Api 中的“ExecuteThisJavaScript”。简短的例子:

设置 AForm = CreateObject("AFormAut.App")

AForm.Fields.ExecuteThisJavaScript "var x = this.numPages; app.alert(x);"

它的好处是你不需要把js例子翻译成jso代码。如果你搜索 ExecuteThisJavaScript,你会得到更多更长的例子。

祝你好运,莱因哈特

【讨论】:

  • 这是一个很好的解决方案!似乎需要 AVDoc 对象才能正常工作,这比 PDDoc 操作要慢得多,但它确实有效!你知道是否有办法从 PDDoc 对象执行 Javascript?附言为什么要莱因哈德?
  • "..你知道是否有一种方法可以从 PDDoc 对象执行 Javascript 吗?.."。我不知道,你可以测试一下,也许用 .GetPDDOC 或者直接用 JS-Code 打开 Doc。为了更快地工作,您可以在隐藏模式下操作。莱因哈德是我的名字。如果我在 google 中搜索:“ExecuteThisJavaScript + Reinhard”,我的所有示例都独立于我发布的论坛(Adobe、VBS、auotIT、..)
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 2017-08-30
  • 1970-01-01
  • 2012-01-15
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多