SecurityHandlers.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Security

'' このサンプルは、Security.EncryptHandler と Security.DecryptHandler の使用方法を示します。
'' Security.DecryptHandler を使用すると、既存の PDF のセキュリティ属性を調べることができます。
'' Security.EncryptHandler を使用すると、PDF を保存するときにセキュリティ属性を指定できます。
'' GcPdfは、標準セキュリティハンドラリビジョン2、3、4、5(PDF 仕様で定義)をサポートしています。
'' このサンプルでは、最も多く提供されている StandardSecurityHandlerRev4 を使用しています。
Public Class SecurityHandlers
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' サンプルのパスワード。
        Dim ownerPassword = "I'm the owner"
        Dim userPassword = "I'm a user"

        '' Step 1: セキュリティ属性を含む文書を生成します。
        Dim doc0 = New GcPdfDocument()
        Dim rc0 = Util.AddNote(
            "セキュリティのデモ:" + vbLf +
            "この PDF では、特定の暗号化オプションを指定し、" + vbLf +
            "所有者とユーザーのパスワードを設定します。",
            doc0.NewPage())

        '' Rev4 のセキュリティハンドラを作成します。
        Dim ssh4 = New StandardSecurityHandlerRev4() With {
            .EncryptionAlgorithm = EncryptionAlgorithm.AES,
            .EncryptStrings = True
        }
        '' StandardSecurityHandlerRev4 は StandardSecurityHandlerRev3 から派生しているので、
        '' Rev3 固有のプロパティのみを操作させるためにこれを行うことができます
        '' (キャストは用例なので、これらの詳細項目をすべて設定する必要はありません)。
        If TypeOf ssh4 Is StandardSecurityHandlerRev3 Then
            Dim ssh3 = DirectCast(ssh4, StandardSecurityHandlerRev3)
            ssh3.EditingPermissions = EditingPermissions.AssembleDocument
            ssh3.PrintingPermissions = PrintingPermissions.LowResolution
        End If
        '' しかし、StandardSecurityHandlerRev3 は StandardSecurityHandlerRev2 から派生した
        '' ものではありません。いくつかのプロパティの意味は同じですが構文は異なるため、
        '' if(ssh3 is StandardSecurityHandlerRev2 ssh2){...} は動作しません。

        '' パスワードを設定します。
        ssh4.OwnerPassword = ownerPassword
        ssh4.UserPassword = userPassword

        '' 作成したハンドラをドキュメントに割り当て、PDF を保存するときに使用するようにします。
        doc0.Security.EncryptHandler = ssh4

        '' PDF を一時ファイルに保存して、読み込むことができます。
        Dim fn = Path.GetTempFileName()
        doc0.Save(fn)

        '' Step 2: 生成されたPDFを読み込み、そのセキュリティ属性を検査します。
        Dim doc = New GcPdfDocument()
        Using fs As New FileStream(fn, FileMode.Open, FileAccess.Read)
            '' パスワードを指定してドキュメントを読み込みます。
            doc.Load(fs, userPassword)

            '' この時点で、doc.Security.DecryptHandler が存在する場合はそれを調べる
            '' ことができますが、Security.EncryptHandler は存在しません。
            If doc.Security.EncryptHandler IsNot Nothing Then
                Throw New Exception("この例外が発生することはないはずです。")
            End If

            Dim dh = doc.Security.DecryptHandler
            If TypeOf dh Is StandardSecurityHandlerRev4 Then
                Dim dh_ssh4 = DirectCast(dh, StandardSecurityHandlerRev4)
                '' 読み込まれたアクセス許可が Step1 で指定したものであることを確認します。
                Util.AddNote(
                    String.Format("読み込まれた PDF の DecryptHandler にあるセキュリティ属性:" + vbLf +
                        "編集権限: {0}" + vbLf +
                        "印刷権限: {1}",
                                  dh_ssh4.EditingPermissions, dh_ssh4.PrintingPermissions),
                    doc.Pages(0),
                    New RectangleF(72, rc0.Bottom + 36, 72 * 6, 72 * 2))
                '' これはうまくいきません。
                Dim noway = dh_ssh4.OwnerPassword
                If noway IsNot Nothing Then
                    Throw New Exception("No way.")
                End If

            ElseIf TypeOf dh Is StandardSecurityHandlerRev3 Then
                '' Rev4 ハンドラがあることが分からない場合は、ここにコードを追加します。
            ElseIf TypeOf dh Is StandardSecurityHandlerRev2 Then
                '' ... そして、ここにも。
            Else
                '' ... そして、この場合も何かを行います。
            End If

            '' 新しい PDF を保存します。ただし、Security.EncryptHandler を設定しなかった
            '' ので、新しく保存されたドキュメントにはセキュリティがないことにご注意ください。
            doc.Save(stream)
        End Using
        '' 一時ファイルを削除します。
        File.Delete(fn)
        ''
        '' Done:
        Return doc.Pages.Count
    End Function
End Class