You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

使用说明

  1. 确保你的电脑已安装Adobe Acrobat(注意不是免费的Acrobat Reader,需要完整版Acrobat)
  2. 打开Excel,按Alt+F11打开VBA编辑器
  3. 右键点击当前工作簿,选择「插入」→「模块」,将上述代码粘贴进去
  4. 按F5运行宏,或回到Excel界面,通过「开发工具」→「宏」选择ExtractPDFSignatureInfo运行
  5. 在弹出的文件选择窗口中,选中需要处理的多个PDF文件,等待程序执行完成

注意事项

  • 如果PDF没有数字签名,程序会在对应单元格标注「无数字签名」
  • 日期格式会自动转换为Excel可识别的日期时间格式,方便后续处理
  • 若单个PDF有多个数字签名,每个签名会单独占用一行,文件名和创建日期会重复显示

内容的提问来源于stack exchange,提问作者andrea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:33:41