2015-10-20 110 views
0

我一直致力于创建一个Excel工具来将数千个PDF中的数据导入到Excel中。我安装了Adobe Acrobat X Professional,它似乎工作正常。我使用Excel 2007中从Excel中看不到PDF字段VBA

我发现这里的示例代码: 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:\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,所谓的“Adobe LiveCycle Designer中编辑“)。

直到getfield方法运行时才会出错。然后我收到错误“Object required”。

如果我在AcroApp,theForm和JSO运行类型名,我得到CAcroApp,CAcroPDDoc,分别对象:

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

如果我把它们放在监视窗口,我最初拿到加号向左但是如果我点击这些加号,每一个下面只会出现一行,在Value列中显示“< No Variables>”。

我想知道文档是否以某种方式被锁定,以免被这样读取。我读到,如果它被锁定,Acrobat中左上角会出现挂锁,并且不允许将其另存为文本。但是我看不到任何挂锁,它确实允许保存为纯文本。所以据我所知它似乎并没有被锁定。

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

UPDATE:

我刚开始尝试的建议,但我想指出,试图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返回的长字段名称。

+0

我想这可能不是字段名称。它在那里出错,你得到“对象需要”。场地末端是否有空白?如果您将字段的名称更改为其他名称并使用该名称更新代码,是否会发生相同的错误?我的两分钱。 – mrbungle

+0

'getNthFieldName'是AcroPDDoc()中的一个方法,至少在JavaScript引用中,所以也许其他一些属性和方法也是有效的。我认为JSObject()可能支持一个子集 - 我怀疑它可以用来创建对象。 JSObject显然是一个Interop生物,没有记录在任何我能找到的地方。 – rheitzman

+1

下面是列出属性和方法的JavaScript参考 - 不确定与Acrobat 1.0 interop.dll的重叠是什么http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/reader_overview。有关getNthFieldName,请参阅打印页面10/11。不记录对象,只是列出它们。 – rheitzman

回答

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的引用链接,请在评论中发帖。

+0

谢谢,我能够使用getNthFieldName来返回非常长的完整字段“名称”(它们看起来像完全限定的引用),它反过来在我的原始代码中工作。上面我的更新中的细节。 –

+0

当您打开PDF进行编辑时,字段名称应与AcroBat中所见的表单字段定义匹配。 (工具(右上方菜单栏),表单,编辑)。创作人员/程序可能选择了字段名称,也许将它们命名为可以在多个版本中引用的字段名称。 – rheitzman

0

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

也请注意,我打开文档formDoc,一个不同的PDDoc,比用于JSObject的文档为formDoc继承自AVDoc对象。再一次地,这种自动化没有很好的文档记录,因为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 
+0

谢谢,这很有趣,但给我留下了和以前一样的问题。出于同样的原因,同一行上出现同样的错误。 –