没有看到Excel VBA中的PDF字段

时间:2015-10-20 21:57:40

标签: excel vba excel-vba pdf acrobat

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

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

仅稍微修改它以提示我浏览PDF文件,并设置对" Adob​​e 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:\temp\sampleForm.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的一部分或包含在Acrobat Pro中,名为" Adob​​e LiveCycle Designer"。 )

在到达getfield方法之前运行没有错误。然后我得到错误"对象需要"。

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

?typename(AcroApp)
CAcroApp
?typename(theForm)
CAcroPDDoc
?typename(jso)
Object

如果我将它们放在Watches窗口中,我最初会在所有三个标记的左侧显示加号,但是如果我点击这些加号,每个标记下面只会出现一行,说"<没有变量>"在“值”列中。

我想知道该文件是否以某种方式被锁定以防止以这种方式被阅读。我读过如果它被锁定,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上过滤库),即使它没有显示在Watch窗口中。

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

并且,我没有看到通过短字段名称识别字段的任何其他方式。

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

2 个答案:

答案 0 :(得分:1)

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:\OIS\ENFORCE\OPEN_BURN\Ag\temp\Open_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的参考链接,请在评论中发帖。

答案 1 :(得分:0)

Adobe Acrobat OLE文档中不太直观,但使用AvDoc(UI)对象作为&#34;中间人&#34;文档和应用程序之间(Form < UI < App)。实质上,AvDoc是用户与之交互的用户界面对象,而PDDoc是用户看不到但Adobe Acrobat维护访问权的后台对象。

另外请注意,我使用formDoc打开文档,该文档与用于JSObject的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