【问题标题】:Trying to flatten PDF using flattenPages() but nothing happens尝试使用 flattenPages() 展平 PDF,但没有任何反应
【发布时间】:2017-05-13 07:20:42
【问题描述】:

我正在尝试使用以下代码从 VBA 调用 Acrobat Javascript API 以展平文档中的所有注释:

Sub flattenPDF()

Dim AcroApp As Acrobat.AcroApp
Dim AcroDoc As Acrobat.AcroPDDoc
Dim jso As Object
Dim path As String

path = "C:\Users\userID\Desktop\thisfile.pdf"

Set AcroApp = CreateObject("AcroExch.App")
Set AcroDoc = CreateObject("AcroExch.PDDoc")
AcroDoc.Open path
Set jso = AcroDoc.GetJSObject

jso.flattenPages
AcroDoc.Save PDSaveFull, path
AcroDoc.Close
AcroApp.Exit 

End Sub

代码运行成功,但是当我打开PDF时,所有注释仍然可以编辑——扁平化应该使它们成为只读的,对吧?

编辑:我将AcroDoc.Save 的第一个参数从“1”更改为“PDSaveFull”,现在如果我运行脚本两次,注释就会变平。为什么他们不第一次变平?

更新:

根据 joelgaraci 的建议,我修改了脚本以获取页数并将其传递给 flattenPages(),并将 PDF 路径传递给函数:

Sub flattenPDF(pdfPath As String)

Dim AcroApp As Acrobat.AcroApp
Dim AcroDoc As Acrobat.AcroPDDoc
Dim pageCount As Integer
Dim jso As Object

Set AcroApp = CreateObject("AcroExch.App")
Set AcroDoc = CreateObject("AcroExch.PDDoc")
AcroDoc.Open pdfPath
pageCount = AcroDoc.GetNumPages
Set jso = AcroDoc.GetJSObject
jso.flattenPages 0, pageCount - 1
AcroDoc.Save PDSaveFull, pdfPath
AcroDoc.Close
AcroApp.Exit

End Sub

但这得到了相同的结果:只有在我运行脚本两次后注释才会变平。

【问题讨论】:

  • 获取文档的页数然后试试jso.flattenPages(0, numPages-1)
  • @joelgeraci,我试过了,但脚本仍然需要运行两次才能使注释变平(请参阅我在 OP 中的更新)。
  • 延迟插件加载可能导致 flattenPages 在您第一次运行时被置若罔闻。也可能没有阅读注释。尝试在扁平线上方添加 jso.syncAnnotScan。这将强制注释在您尝试展平之前可供 JavaScript 引擎使用。
  • @joelgeraci, jso.syncAnnotScan 没有改变任何东西。但我也注意到,有些 PDF 在第一次运行时确实会变平,所以也许这与这个特定 PDF 的构造方式有关?
  • 当您从 Acrobat JavaScript 控制台对需要两次传递的文件运行 this.flattenPages() 时,结果如何?

标签: javascript vba pdf acrobat acrobat-sdk


【解决方案1】:

只是想我会添加我的解决方案以防它帮助某人...... 我想将文件夹中的所有 PDF 文件展平,这似乎可以解决问题。

Sub Flatten_Folder()
Dim MyFile As String
Mypath = InputBox("Enter the path to the folder where the PDF files are 
Located **MUST END WITH \**")
MyFile = Dir(Mypath)
Do While MyFile <> ""
If MyFile Like "*.PDF" Or MyFile Like "*.pdf" Then
Fullpath = Mypath & MyFile
Set App = CreateObject("AcroExch.app")
Set avdoc = CreateObject("AcroExch.AVDoc")
Set pdDoc = CreateObject("AcroExch.PDDoc")
Set AForm = CreateObject("AFormAut.App")
pdDoc.Open (Fullpath)
Set avdoc = pdDoc.OpenAVDoc(Fullpath)
   js = "this.flattenPages();"
     '//execute the js code
    AForm.Fields.ExecuteThisJavaScript js

Set pdDoc = avdoc.GetPDDoc
pdDoc.Save PDSaveFull, Fullpath
pdDoc.Close
Set AForm = Nothing
Set avdoc = Nothing
Set App = Nothing
End If
MyFile = Dir
Loop
End Sub

在运行宏时,您会看到一个消息框提示您将文件夹路径粘贴到其中。 此外,这种方法似乎避免了 OP 遇到的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2022-11-24
    • 2019-02-01
    • 2014-12-09
    • 2013-02-06
    相关资源
    最近更新 更多