Adobe Acrobat ProをVB.NETで操作してPDFファイルにウォーターマークを入れてみる

#PDFファイルにウォーターマークを入れてみる
[前回投稿のAdobe Acrobat ProをVB.NETで操作して電子署名してみる](http://qiita.com/madilloar/items/c272d2cba7aaa1a22de0)では、電子署名を打ってみましたが、今度は、PDFファイルにウォーターマークを入れてみます。

そもそもウォーターマークの定義ですが、ここでは、PDFファイルを印刷したときに、その印刷面の背景に、透かし文字を入れることを「ウォーターマークを入れる」としています。

この画像は、[ウォーターマークを入れたPDFファイル](https://github.com/madilloar/PRJ_Silver/blob/master/SilverCat/SilverCat/data/sample_signed.pdf)をAdobe Readerで印刷しようとしているものを画面キャプチャしたものです。
印刷ダイアログの右下に印刷プレビューが出ていて、何やら本文の背景にごちゃごちゃ出ていますが、それをさらに拡大したものを拡大した画像をさらに右下につけています。

画面キャプチャでは「透かし文字 Watermark」というのがずらずらと並んでいるかと思いますが、PDFファイルをAdobe Readerで見た時には、この文字は見えていないです。
(Chromeブラウザ上でこのPDFファイルを開くと、印刷後のイメージで開くようなので、初めから背景にウォーターマークが表示されます)

![ウォーターマーク.png](https://qiita-image-store.s3.amazonaws.com/0/76786/e2292700-1615-363d-8034-a6ad9b9d2603.png)

##Acrobat ProとVB.NETを使ってウォータマークを入れるには？
ウォーターマークをPDFファイルに入れるには、PDFファイルからJavascriptブジェクトを取得して、そのJavascriptオブジェクトを操作する必要があります。

前回投稿のソリューションにウォーターマークの機能を追加しています。
[SilverCat VB.NETソリューション](https://github.com/madilloar/PRJ_Silver/)

##PDFファイルからJavascriptオブジェクトを取得
[PDFファイルを加工指示命令に従って加工するメソッド:ProcessPdf](https://github.com/madilloar/PRJ_Silver/blob/master/SilverCat/SilverCat/PdfProcessing.vb)
AcroPDDoc.GetJSObject()でAcrobat Javascriptオブジェクトを取得できますが、Acrobat Javascriptオブジェクトのメソッドを呼び出には、リフレクション機能の「InvokeMember」を使って呼び出す必要があり、そのままむき出しで使うと使いにくいので自前のJSObjectでラップしています。

```vb:
Dim inPdDoc As AcroPDDoc = Nothing
Dim jsObj As JSObject = Nothing

    '' '' これから加工したいPDFファイルを開きます。
    inPdDoc = New AcroPDDoc()
    rc = inPdDoc.Open(inPdfFilePath)

    '' JSONオブジェクトの取得。
    jsObj = New JSObject(inPdDoc.GetJSObject())
```

##自前のJSObjectでラップしたJavascriptオブジェクトのaddWatermarkFromFileメソッド
[Adobe Acrobat SDK Help](http://help.adobe.com/livedocs/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?&accessible=true)
の、「JavaScript > JavaScript for Acrobat API Reference > JavaScript API > Doc > Doc methods > addWatermarkFromFile」を参照しながら作りました。

[自前のJSObjectでラップしたAcrobat JavascriptオブジェクトのaddWatermarkFromFileメソッド:addWatermarkFromFile](https://github.com/madilloar/PRJ_Silver/blob/master/SilverCat/SilverCat/PdfProcessing.vb)

Acrobat Javascriptオブジェクトの「addWatermarkFromFile」メソッドシグネチャは次の通りです。

```js:
// Acrobat Javascriptオブジェクトの「addWatermarkFromFile」メソッドシグネチャ
jsObj.addWatermarkFromFile(cDIPath, nSourcePage, nStart, nEnd, bOnTop, bOnScreen, bOnPrint, nHorizAlign, nVertAlign, nHorizValue, nVertValue, bPercentage, nScale, bFixedPrint, nRotation, nOpacity);
```

これを次のようなVB.NETコードのようにラップして、リフレクションで呼び出しています。

```vb:
'''<summary>PDFファイルにPDFファイルをウォーターマークとして付け加えます。</summary>
Public Sub addWatermarkFromFile(ByRef waterMarkParam As Dictionary(Of String, Object))
    Dim addFileWatermarkParam As Object() = New Object() {
        waterMarkParam.Item("cDIPath"),
        waterMarkParam.Item("nSourcePage"),
        waterMarkParam.Item("nStart"),
        waterMarkParam.Item("nEnd"),
        waterMarkParam.Item("bOnTop"),
        waterMarkParam.Item("bOnScreen"),
        waterMarkParam.Item("bOnPrint"),
        Me.ChangeAlignType(waterMarkParam.Item("nHorizAlign")),
        Me.ChangeAlignType(waterMarkParam.Item("nVertAlign")),
        waterMarkParam.Item("nHorizValue"),
        waterMarkParam.Item("nVertValue"),
        waterMarkParam.Item("bPercentage"),
        CType(waterMarkParam.Item("nScale"), Double),
        waterMarkParam.Item("bFixedPrint"),
        waterMarkParam.Item("nRotation"),
        CType(waterMarkParam.Item("nOpacity"), Double)
    }
    ' Add a watermark from a file.
    ' function prototype:
    '   addWatermarkFromFile(cDIPath, nSourcePage, nStart, nEnd, bOnTop, bOnScreen, bOnPrint, nHorizAlign, nVertAlign, nHorizValue, nVertValue, bPercentage, nScale, bFixedPrint, nRotation, nOpacity)
    Me.acroJson_.GetType().InvokeMember("addWatermarkFromFile", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, Me.acroJson_, addFileWatermarkParam)
End Sub
```