使用Excel VBA提取PDF签名信息与创建日期及代码报错解决
解决PDF数字签名信息读取的VBA方案
错误原因与解决
你遇到的user defined type not defined错误,是因为代码里用了早期绑定的Acrobat类型声明(比如Acrobat.CAcroApp),但未添加Adobe Acrobat的对象库引用。最简单的解决方式是改用后期绑定(所有Acrobat相关变量声明为Object,用CreateObject创建实例),无需手动添加引用。
完整VBA代码
以下代码可批量读取多个带数字签名PDF的创建日期、签名者姓名及签名日期,并将结果写入当前Excel工作表:
Sub ExtractPDFSignatureInfo() Dim acroApp As Object Dim avDoc As Object Dim pdDoc As Object Dim jso As Object Dim fileDialog As FileDialog Dim selectedFiles As Variant Dim i As Integer, sigIndex As Integer Dim ws As Worksheet Dim rowNum As Long Dim createDate As String, sigName As String, sigDate As String ' 初始化Excel工作表 Set ws = ActiveSheet rowNum = 2 ' 从第2行开始写入数据(第1行写表头) ' 写入表头 ws.Cells(1, 1).Value = "PDF文件名" ws.Cells(1, 2).Value = "创建日期" ws.Cells(1, 3).Value = "签名者姓名" ws.Cells(1, 4).Value = "签名日期" ' 选择多个PDF文件 Set fileDialog = Application.fileDialog(msoFileDialogFilePicker) With fileDialog .AllowMultiSelect = True .Filters.Add "PDF文件", "*.pdf" .Title = "选择需要读取的PDF文件" If .Show = -1 Then selectedFiles = .SelectedItems Else Exit Sub ' 用户取消选择 End If End With ' 初始化Acrobat应用 Set acroApp = CreateObject("AcroExch.App") acroApp.Hide ' 隐藏Acrobat窗口 ' 遍历每个选中的PDF文件 For i = LBound(selectedFiles) To UBound(selectedFiles) Set avDoc = CreateObject("AcroExch.AVDoc") Set pdDoc = CreateObject("AcroExch.PDDoc") ' 打开PDF文件 If avDoc.Open(selectedFiles(i), "") Then Set pdDoc = avDoc.GetPDDoc() Set jso = pdDoc.GetJSObject() ' 获取文档创建日期 createDate = jso.info.CreationDate ' 转换日期格式(默认是ISO格式,比如D:20240520103000+08'00') If Left(createDate, 2) = "D:" Then createDate = DateSerial(Mid(createDate, 3, 4), Mid(createDate, 7, 2), Mid(createDate, 9, 2)) & " " & _ TimeSerial(Mid(createDate, 11, 2), Mid(createDate, 13, 2), Mid(createDate, 15, 2)) End If ' 获取数字签名信息 If jso.signatureInfo Is Nothing Then ' 无签名的情况 ws.Cells(rowNum, 1).Value = Mid(selectedFiles(i), InStrRev(selectedFiles(i), "\") + 1) ws.Cells(rowNum, 2).Value = createDate ws.Cells(rowNum, 3).Value = "无数字签名" ws.Cells(rowNum, 4).Value = "" rowNum = rowNum + 1 Else ' 遍历所有签名 For sigIndex = 0 To jso.signatureInfo.Count - 1 sigName = jso.signatureInfo(sigIndex).name sigDate = jso.signatureInfo(sigIndex).date ' 转换签名日期格式 If Left(sigDate, 2) = "D:" Then sigDate = DateSerial(Mid(sigDate, 3, 4), Mid(sigDate, 7, 2), Mid(sigDate, 9, 2)) & " " & _ TimeSerial(Mid(sigDate, 11, 2), Mid(sigDate, 13, 2), Mid(sigDate, 15, 2)) End If ' 写入数据到工作表 ws.Cells(rowNum, 1).Value = Mid(selectedFiles(i), InStrRev(selectedFiles(i), "\") + 1) ws.Cells(rowNum, 2).Value = createDate ws.Cells(rowNum, 3).Value = sigName ws.Cells(rowNum, 4).Value = sigDate rowNum = rowNum + 1 Next sigIndex End If End If ' 释放当前PDF对象 avDoc.Close True Set jso = Nothing Set pdDoc = Nothing Set avDoc = Nothing Next i ' 清理Acrobat应用 acroApp.Exit Set acroApp = Nothing Set fileDialog = Nothing ' 调整列宽 ws.Columns("A:D").AutoFit MsgBox "信息提取完成!", vbInformation End Sub
使用说明
- 确保你的电脑已安装Adobe Acrobat(注意不是免费的Acrobat Reader,需要完整版Acrobat)
- 打开Excel,按
Alt+F11打开VBA编辑器 - 右键点击当前工作簿,选择「插入」→「模块」,将上述代码粘贴进去
- 按
F5运行宏,或回到Excel界面,通过「开发工具」→「宏」选择ExtractPDFSignatureInfo运行 - 在弹出的文件选择窗口中,选中需要处理的多个PDF文件,等待程序执行完成
注意事项
- 如果PDF没有数字签名,程序会在对应单元格标注「无数字签名」
- 日期格式会自动转换为Excel可识别的日期时间格式,方便后续处理
- 若单个PDF有多个数字签名,每个签名会单独占用一行,文件名和创建日期会重复显示
内容的提问来源于stack exchange,提问作者andrea
相关产品推荐
相关产品推荐

