VBAからAdobe Acrobatを制御してPDFファイルにタイムスタンプを付与する

# はじめに
前回の記事では、VBAからAdobe Acrobatを制御してPDFファイルをデジタル署名する方法を紹介しました。

https://qiita.com/pbcho/items/963a54a560f8d7944df0

今回は、VBAからAdobe Acrobatを制御してPDFファイルにタイムスタンプを付与する方法を整理しました。

# 環境
・Windows 10 Pro
・Microsoft 365 (Excel)
・Adobe Acrobat Pro

# タイムスタンプ付与方法

## 事前設定
1. タイムスタンプ付与するためには、事前にAcrobatでデフォルトのタイムスタンプサーバーを設定する必要があります。
設定方法については、下記の「Acrobatタイムスタンプサーバー設定方法」を参照してください。

2. Acrobatを起動して「メニュ」の「編集」→「環境設定」→分類で「セキュリティ（拡張）」を選択後、「サンドボックスによる保護」の「起動時に保護モードを有効にする」のチェックを外す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/bc73035e-110b-c174-f26a-87d8e0d5d6c5.png)


## 処理の流れ
1. PDFファイルを開く
2. JSObjectを呼び出す
3. PDFファイルにタイムスタンプ付与してファイルを出力する
4. PDFファイルを閉じる

## コードの例
```vb
Public Sub CreateTimestampedPdfFile()
    Dim acroPdObj As New Acrobat.AcroPDDoc
    Dim acroAvObj As New Acrobat.AcroAVDoc
    Dim jsObj As Object
    Dim objSign As Object

    Dim srcFilePath As String
    Dim dstFilePath As String

    srcFilePath = "C:\TimestampTest\Input\InputPdfFile.pdf"
    dstFilePath = "C:\TimestampTest\Output\OutputPdfFile.pdf"

    ' PDFファイルを開く
    If acroPdObj.Open(srcFilePath) Then
        Set acroAvObj = acroPdObj.OpenAVDoc(srcFilePath)

        ' JSObjectを定義する
        Set jsObj = acroPdObj.GetJSObject

        ' SecurityHandlerを生成
        ' https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#gethandler
        Set objSign = jsObj.security.getHandler("Adobe.PPKLite")

        ' タイムスタンプ付与
        ' 参照先：https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/doc.html#timestampsign
        ' 事前にAcrobatでデフォルトのタイムスタンプサーバーを設定する必要がある
        Call jsObj.timestampSign(objSign, dstFilePath)

        Call acroAvObj.Close(1)
        Call acroPdObj.Close
    End If

    Set acroPdObj = Nothing
    Set jsObj = Nothing
    Set objSign = Nothing
End Sub
```

## コード例の説明
```vb
    Dim acroPdObj As New Acrobat.AcroPDDoc
    Dim acroAvObj As New Acrobat.AcroAVDoc
    ...
    ' PDFファイルを開く
    If acroPdObj.Open(srcFilePath) Then
        Set acroAvObj = acroPdObj.OpenAVDoc(srcFilePath)
```
PDFファイルを開きます。

```vb
        ' JSObjectを定義する
        Set jsObj = acroPdObj.GetJSObject
```
JSObjectを取得します。
JSObjectは、Acrobat.AcroPDDocから取得できます。

```vb
        ' SecurityHandlerを生成
        ' https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#gethandler
        Set objSign = jsObj.security.getHandler("Adobe.PPKLite")

        ' タイムスタンプ付与
        ' 参照先：https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/doc.html#timestampsign
        ' 事前にAcrobatでデフォルトのタイムスタンプサーバーを設定する必要がある
        Call jsObj.timestampSign(objSign, dstFilePath)
```
SecurityHandlerを生成します。
Handlerは、例の「Adobe.PPKLite」以外にも、下記のURLの方法で使用できるものを確認することができます。

https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#handlers

その後、タイムスタンプを付与して、ファイルを出力します。

:::note warn
Acrobatでデフォルトのタイムスタンプサーバーの設定をしなかった場合、正しく動作しません。

:::

```vb
        Call acroAvObj.Close(1)
        Call acroPdObj.Close
    End If
```
PDFファイルを閉じます。


# Acrobatタイムスタンプサーバー設定方法
1. Acrobatを起動して「メニュ」の「編集」→「環境設定」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/b20e1528-45f0-c8e2-082f-4babe9e5badc.png)


1. 分類で「署名」を選択して、「文書のタイムスタンプ」の「詳細」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/abbc3049-1e67-1ea7-8033-0027b93a2bb7.png)


1. タイムスタンプサーバー設定で、新規のタイムスタンプサーバーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/c6861059-644c-1865-cdc1-8763165bfa5f.png)

1. 新規追加するタイムスタンプサーバーの名前と、サーバー設定を入力します。
下の例で使ったSSL.comタイムスタンプサーバーは、無償で使えるタイムスタンプサーバーです。
```
名前：SSL.com
サーバーのURL：http://ts.ssl.com
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/d32a910f-464a-eea7-46cb-007dd1bbea6a.png)

1. 追加したタイムスタンプサーバーを選択し、「デフォルトに設定」ボタンを押して、デフォルトサーバーに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/d3b4b7f9-9c6b-45be-3f43-b2cbad269ff6.png)

# 参考

https://opensource.adobe.com/dc-acrobat-sdk-docs/index.html

https://helpx.adobe.com/jp/acrobat/using/certificate-based-signatures.html