我一直致力于创建一个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返回的长字段名称。
我想这可能不是字段名称。它在那里出错,你得到“对象需要”。场地末端是否有空白?如果您将字段的名称更改为其他名称并使用该名称更新代码,是否会发生相同的错误?我的两分钱。 – mrbungle
'getNthFieldName'是AcroPDDoc()中的一个方法,至少在JavaScript引用中,所以也许其他一些属性和方法也是有效的。我认为JSObject()可能支持一个子集 - 我怀疑它可以用来创建对象。 JSObject显然是一个Interop生物,没有记录在任何我能找到的地方。 – rheitzman
下面是列出属性和方法的JavaScript参考 - 不确定与Acrobat 1.0 interop.dll的重叠是什么http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/reader_overview。有关getNthFieldName,请参阅打印页面10/11。不记录对象,只是列出它们。 – rheitzman