SecurityHandlers.vb
''
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS 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 を保存するときにセキュリティ属性を指定することができます。
'' DsPdfは、PDF 1.7 および PDF 2.0 で定義されている標準セキュリティハンドラのリビジョン2、3、4、5、6に
'' 対応しています。このサンプルでは、StandardSecurityHandlerRev4 を使用しています。
''
'' 標準セキュリティハンドラのリビジョン6のデモについては SecurityHandlerRev6 をご参照ください。
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)
'' 読み込まれた PDF のセキュリティ属性が 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("この例外は発生しないはずです。")
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)
''
'' PDF ドキュメントを保存します。
Return doc.Pages.Count
End Function
End Class