没有看到Excel VBA的PDF字段

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

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

并稍微修改它,以提示我浏览到PDF文件,并设置“Adobe Acrobat 10.0types库”的引用,我想这个代码:

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中的编辑器中,名为“Adobe LiveCycle Designer”)。

它运行没有错误,直到getfield方法。 然后我得到错误“对象需要”。

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

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

如果我把它们放在手表窗口中,我最初会在所有三个左边加上加号,但是如果我点击这些加号,每个下面只会出现一行,在数值中说“<No Variables>”柱。

我想知道这个文档是不是被锁住了,不会被这样读取。 我读到,如果它被locking,在Acrobat的左上angular会出现一个挂锁,它不允许保存为文本。 但是看不到挂锁,它确实允许保存为纯文本。 所以据我所知,似乎并没有被locking。

任何build议,我可以尝试?

更新:

我刚开始尝试的build议,但我想要注意的是,在尝试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 

这将使我能够通过很长时间,显然是完全合格的参考来确定领域,这将使我通过项目。 但首先我要检查其他的想法,看是否可以通过短名称find字段。

更新2:

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

但是,它不显示由方法创build的对象,例如由AcroExch.PDDoc.GetJSObject方法创build的对象(请参阅对象模型中的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:\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 

这可能是你的“forms”没有任何领域(或扁平的forms),或名称是closures的。

JSObject属性有点神秘。 我发现一个使用reflection来提取数据的post,但是如果你知道它们是什么的话,JSObject的属性是可用的! 例如numfields,getNthFieldName

如果有人发现JSObject的参考链接,请发表评论。

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

formDoc注意,我使用formDoc (不同的PDDoc)打开文档,而formDoc formDoc从AVDoc对象inheritance的那样,它是用于JSObject的。 再说一次,这种自动化没有很好的文档logging,因为Adobe比Javascript更多地使用Javascript,所以这主要是通过反复试验来了解的。

 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