看不到来自 Excel VBA 的 PDF 字段



我的任务是创建一个Excel工具,将数据从数千个PDF导入Excel。我已经安装了Adobe Acrobat X Professional,它似乎工作正常。我正在使用 Excel 2007。

我在这里找到了示例代码:http://khkonsulting.com/2010/09/reading-pdf-form-fields-with-vba/

并且只稍微修改它以提示我浏览到 PDF 文件,并设置对"Adobe Acrobat 10.0 类型库"的引用,我正在尝试以下代码:

Sub Main()
Dim AcroApp As Acrobat.CAcroApp
Dim theForm As Acrobat.CAcroPDDoc
Dim jso As Object
Dim text1, text2 As String
Set AcroApp = CreateObject("AcroExch.App")
Set theForm = CreateObject("AcroExch.PDDoc")
Dim strFullPath As String
strFullPath = Application.GetOpenFilename()
theForm.Open (strFullPath) 'theForm.Open ("C:tempsampleForm.pdf")
Set jso = theForm.GetJSObject
' get the information from the form fields Text1 and Text2
text1 = jso.getfield("MFR_ctrl33605579").Value 'jso.getfield("Text1").Value
'(etc)
End Sub

("MFR_ctrl33605579"是其中一个文本字段的名称;我在Acrobat Pro的一部分或包含的编辑器中发现了这一点,称为"Adobe LiveCycle Designer"。

运行没有错误,直到它到达getfield方法。然后我收到错误"需要对象"。

如果我在 AcroApp、theForm 和 jso 上运行 TypeName,我会分别得到 CAcroApp、CAcroPDDoc 和 object:

?typename(AcroApp)
CAcroApp
?typename(theForm)
CAcroPDDoc
?typename(jso)
Object
如果我

将它们放在"监视"窗口中,我最初会在所有三个加号的左侧看到加号,但是如果我单击这些加号,则每个加号下面只显示一行,在"值"列中显示"><没有变量>"。

我想知道文档是否以某种方式被锁定,无法以这种方式阅读。我读到如果它被锁定,Acrobat的左上角会出现一个挂锁,并且不允许另存为文本。但是我看到没有挂锁,它确实允许另存为纯文本。所以据我所知,它似乎没有被锁定。

关于我可以尝试什么的任何建议?

更新:

我刚刚开始尝试这些建议,但我想指出,在尝试 rheitzman 的 For 循环以获取字段名称(使用 getNthFieldName(后,我看到如果我将其用于字段名称,我的代码可以工作:

form1[0].QuestionnaireForm[0].sbfrmProfile[0].sbfrmContact[0].sbfrmManufacturerDetails[0].MFR_ctrl33605579[0]

或者换句话说:

text1 = jso.getfield("MFR_form1[0].QuestionnaireForm[0].sbfrmProfile[0].sbfrmContact[0].sbfrmManufacturerDetails[0].MFR_ctrl33605579[0]").Value

这将允许我通过很长的,显然完全合格的参考来识别字段,这将使我完成项目。但首先,我将检查其他想法,看看这些字段是否只能通过短名称找到。

更新 2:

我现在看到我可以在对象浏览器中检查某些对象模型的一些细节(Acrobat 上的过滤器库(,即使它没有显示在"监视"窗口中。

但是,它不显示由方法创建的对象,例如由 AcroExch.PDDoc.GetJSObject 方法创建的对象(请参阅对象模型中的 AcroPDDoc(。此处使用的该对象的方法 getNthFieldName 根本不出现在对象浏览器中。

而且,我没有看到任何其他方法可以通过其短字段名称来识别字段。

所以。。。对于这个项目,我只使用 getNthFieldName 返回的长字段名称。

iTextSharp更容易使用!

也就是说,这里有一个读取所有字段的代码片段。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim pdfForm As Acrobat.AcroPDDoc
    Dim jso As Object ' ?
    Dim s As String = ""
    Dim i As Integer
    Dim strFullPath As String = "H:OISENFORCEOPEN_BURNAgtempOpen_Burn_Template_Out.pdf"
    Try
        pdfForm = New Acrobat.AcroPDDoc
        pdfForm.Open(strFullPath)
        jso = pdfForm.GetJSObject
        For i = 0 To jso.numfields() - 1
            s = jso.getNthFieldName(i)
            Debug.Print(s & ": " & jso.getField(s).value)
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

可能是您的"表单"没有任何字段(或扁平化表单(,或者名称已关闭。

JSObject属性有点神秘。我找到了一篇使用反射来提取数据的帖子,但碰巧的是,如果您知道 JSObject 属性是什么,它们就可以使用!例如 numfields, getNthFieldName

如果有人找到JSObject的参考链接,请在评论中发布。

在Adobe Acrobat OLE文档中不是很直观,但Connsider使用AvDoc(UI(对象作为文档和应用程序之间的"中间人"(Form < UI < App(。从本质上讲,AvDoc 是用户与之交互的用户界面对象,而 PDDoc 是用户看不到但 Adobe Acrobat 保持访问权限的背景对象。

还要注意,我打开文档时带有formDoc,一个与用于 JSObject 的 PDDoc 不同的 PDDoc,因为formDoc从 AVDoc 对象继承。同样,这种自动化没有很好的记录,因为Adobe更倾向于Javascript而不是VBA,所以这主要是通过反复试验来学习的。

Sub Main()
    Dim AcroApp As Acrobat.CAcroApp
    Dim formUI As Acrobat.CAcroAVDoc
    Dim srcDoc As Acrobat.CAcroPDDoc, formDoc As Acrobat.CAcroPDDoc
    Dim jso As Object
    Dim strFullPath As String, text1 As String, text2 As String
    Set AcroApp = CreateObject("AcroExch.App")
    Set formUI = CreateObject("AcroExch.AVDoc")
    Set srcDoc = CreateObject("AcroExch.PDDoc")
    strFullPath = Application.GetOpenFilename()
    srcDoc.Open (strFullPath)
    If formUI.Open(strFullPath, "") = True Then
        Set formDoc = formUI.GetPDDoc()        
        Set jso = formDoc.GetJSObject()
        ' EXTRACT FORM FIELDS' TEXT
         text1 = jso.GetField("MFR_ctrl33605579").Value    
    End If
   ' UNINTIALIZING PDF OBJECTS
    Set jso = Nothing
    Set formDoc = Nothing         
    Set srcDoc = Nothing 
    Set formUI = Nothing
    Set AcroApp = Nothing
End Sub

最新更新